2024年11月10日

前端开发规范的学习

1.KLOC 2.数据防腐层 3.分治思想 4.分层架构模式思想  5.SOLID 原则 6.关注分离点

1.KLOC 

  定义
  • KLOC 是 “千行代码”(Kilo Lines Of Code)的缩写。它是一种用于衡量软件项目规模大小的指标。通过统计软件项目中代码的行数(以千行为单位)来对项目规模进行量化评估。例如,如果一个项目的代码量是 5000 行,那么用 KLOC 来表示就是 5KLOC。
  用途
  • 项目规划与估算
    • 在项目初期,开发团队可以根据历史项目的 KLOC 数据以及对应的开发资源投入(如人力、时间等)来估算新项目的规模和所需的开发资源。例如,如果已知开发 1KLOC 平均需要 2 个人天,当新的项目规模预计为 10KLOC 时,就可以初步估算出大概需要 20 个人天的工作量来完成代码编写部分。
  • 成本估算与控制
    • 软件成本在很大程度上与代码规模有关。KLOC 可以作为成本估算的一个基础因素。因为编写代码的行数越多,通常意味着需要投入更多的人力和时间,从而导致成本增加。通过对 KLOC 的统计和分析,项目经理可以更好地控制成本。例如,当 KLOC 超出预算范围时,可以及时分析是需求变更导致代码量增加,还是开发效率低下等原因造成的,并采取相应的措施。
  • 质量评估与比较
    • 一定程度上,KLOC 可以用于软件质量的评估和比较。一般来说,在功能相同的情况下,代码行数越少,可能意味着软件的结构越紧凑、效率越高。不过这只是一个参考因素,因为代码质量还与代码的可读性、可维护性、可复用性等诸多因素有关。例如,两个实现相同功能的模块,一个是 10KLOC,另一个是 15KLOC,可能 10KLOC 的模块在代码结构上更简洁,但还需要进一步分析代码的内部质量才能确定。

2.数据防腐层

  • 数据防腐层(Anti - Corruption Layer,ACL)是一种软件架构中的隔离层概念。它主要用于隔离两个不同系统或者子系统之间的交互,防止一个系统的变化对另一个系统产生不良影响,尤其是在系统之间存在数据格式、业务逻辑、技术栈等差异的情况下。
  • 就像是在两个不同 “世界”(系统)之间设置的一个缓冲带,这个缓冲带能够对数据和业务逻辑进行转换和适配,确保两边的系统都能按照自己的规则和方式正常运转,避免一方的 “规则变化” 或者 “异常” 对另一方造成干扰或者破坏。

2.1数据防腐层的组成部分与功能实现

  数据转换功能

    这是数据防腐层最基本的功能之一。它能够将一个系统的数据格式转换为另一个系统能够接受的数据格式。这可能涉及到数据结构的转换、数据类型的转换、编码方式的转换等。例如,将一种数据库系统(如 MySQL)中的数据格式转换为另一种数据库系统(如 Oracle)能够识别的数据格式,或者将以文本格式存储的数据转换为二进制格式。

  业务逻辑适配功能

  除了数据格式的转换,数据防腐层还需要对不同系统之间的业务逻辑差异进行适配。比如,两个系统对于同一业务概念可能有不同的定义和处理方式。一个系统中产品的 “价格” 可能是含税价格,而另一个系统中的 “价格” 可能是不含税价格。数据防腐层就需要根据系统之间的这种业务逻辑差异,对数据进行调整和适配。

  接口封装功能

  数据防腐层可以对系统之间交互的接口进行封装。它隐藏了两个系统内部接口的复杂性和差异性,对外提供一个统一的、相对简单的接口。这样,两个系统在进行交互时,只需要通过这个封装后的接口进行通信,而不需要了解对方内部接口的详细情况。例如,数据防腐层可以将一个系统复杂的 RESTful API 接口进行封装,使其与另一个系统简单的 RPC 接口能够顺利进行通信。

3.分治思想

  1. 基本概念
    1. 分治思想,即 “分而治之”(Divide and Conquer)。它的核心是将一个复杂的大问题分解为若干个规模较小、相对独立且容易解决的子问题。这些子问题的性质与原问题相同,然后分别解决这些子问题,最后将子问题的解合并起来得到原问题的解。
    2. 例如,在计算一个大型数组的排序问题时,可以将这个数组不断地拆分成更小的子数组,直到子数组的规模小到可以轻易地进行排序(如只有 1 个或 2 个元素)。这就像把一个庞大的任务(对整个数组排序)分解成了许多小任务(对小的子数组排序)。
  2. 在算法设计中的体现
    1. 排序算法中的应用
      1. 以归并排序(Merge Sort)为例,这是一种典型的基于分治思想的排序算法。它首先将一个数组分成两个长度大致相等的子数组,然后对这两个子数组分别进行排序(这两个子数组的排序也是通过同样的分治过程,不断划分更小的子数组来完成)。当子数组排序完成后,再将两个有序的子数组合并成一个有序的大数组。整个过程不断地将问题划分,解决子问题,最后合并结果。
    2. 搜索算法中的应用
      1. 二分搜索(Binary Search)也是分治思想的体现。对于一个有序数组,要查找某个目标元素。它每次将数组分成两部分,通过比较目标元素和中间元素的大小,确定目标元素可能在左半部分还是右半部分。然后继续在确定的那一半数组中进行同样的划分和搜索操作,直到找到目标元素或者确定目标元素不存在。
  3. 在软件系统设计中的应用
    1. 功能模块划分   :根据页面的功能将前端代码划分为不同的模块。例如,在一个电商网站前端,可以划分为商品列表模块、购物车模块、用户订单模块等。每个模块可以有自己独立的 HTML、CSS 和 JavaScript 代码。
    2. 组件化开发  :  在现代前端框架(如 React、Vue)中,采用组件化开发是分治思想的很好体现。可以将页面中的一个按钮、一个表单或者一个导航栏等都作为一个独立的组件进行开发。每个组件都有自己的状态和行为,然后将这些组件组合起来构成完整的页面。
    3. 分布式系统设计:在分布式系统中,分治思想更为明显。例如,一个分布式数据库系统为了处理海量的数据存储和查询任务,会将数据分散存储在多个节点上。每个节点负责存储和处理一部分数据,这相当于把数据存储和查询这个大问题分解到各个节点上的小问题。当需要查询数据时,系统会协调各个节点,将各个节点的查询结果合并起来得到最终的结果。
  4. 优势
    1. 降低问题复杂度  通过将大问题分解为小问题,使得每个小问题的复杂度降低。这样更容易理解和解决问题,就像把一个复杂的拼图拆分成许多小的拼图块,每个小拼图块的拼接难度就比整个大拼图的拼接难度小很多。
    2. 便于并行处理   分解后的子问题很多时候可以并行地解决。例如,在多核处理器的计算机上,对多个子问题同时进行处理,可以大大提高处理效率。在分布式系统中,不同的节点可以同时处理各自负责的子问题,加快了整个系统的运行速度。
    3. 提高系统的可维护性和可扩展性 分治后的模块或子问题相对独立,当需要修改或扩展系统的某一部分功能时,只需要对相应的子模块或子问题进行处理,不会对其他部分造成太大的影响。比如,在电商系统中,如果要增加一种新的支付方式,只需要在支付模块中进行修改,而不需要对整个电商系统进行大规模的改动。

 5.SOLID 原则    

   定义:SOLID 是面向对象设计的五大基本原则的缩写,虽然它主要用于后端开发中的面向对象编程,但在前端开发中也有一定的应用。

  • 单一职责原则(Single Responsibility Principle,SRP):一个类或者模块应该只有一个引起它变化的原因。在前端开发中,这意味着一个组件或者函数应该只负责一个功能。例如,一个用于验证用户输入的函数就只应该负责验证输入是否符合要求,而不应该同时负责发送验证后的输入数据到服务器。
  • 开闭原则(Open - Close Principle,OCP):软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。在前端开发中,比如一个组件库,当需要添加新的组件类型时,应该能够通过扩展的方式添加,而不是修改已有的组件代码。例如,一个 UI 组件库已经有了按钮组件和文本框组件,当要添加一个新的下拉菜单组件时,应该通过创建新的代码来实现这个组件,而不是去修改按钮组件和文本框组件的代码。
  • 里氏替换原则(Liskov Substitution Principle,LSP):子类型必须能够替换它们的父类型。在前端的继承关系或者接口实现中,这一原则很重要。例如,在一个前端框架中定义了一个抽象的图形组件接口,具体的圆形组件和方形组件都实现了这个接口,那么在使用这些组件的代码中,圆形组件和方形组件应该可以相互替换,而不会影响系统的正常运行。
  • 接口隔离原则(Interface Segregation Principle,ISP):客户端不应该被迫依赖于它不使用的接口。在前端开发中,例如一个前端插件提供了多个功能接口,但是某个具体的页面只需要其中的部分功能,那么这个插件应该将接口进行隔离,使得页面只需要依赖它所需要的接口,而不是全部接口。
  • 依赖倒置原则(Dependency Inversion Principle,DIP):高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。在前端框架的设计或者组件之间的依赖关系中,这一原则有助于降低耦合度。例如,在一个前端应用中,高层的业务逻辑组件不应该直接依赖于具体的底层数据获取组件,而是应该通过抽象的接口来获取数据,这样当数据获取方式发生变化时,只需要修改实现抽象接口的具体组件,而不会影响业务逻辑组件。
 
 意义:
  • 提高代码质量:遵循 SOLID 原则可以使前端代码更加健壮、灵活和可维护。代码结构更加合理,减少了代码的耦合度,使得代码在面对需求变化和功能扩展时更加稳定。
  • 便于测试和复用:代码的单一职责使得测试更加容易,因为每个功能单元的功能明确。同时,符合开闭原则等使得代码更容易被复用,例如符合开闭原则的组件可以方便地在其他项目或者功能模块中进行扩展和复用。

6 关注分离点(和分治思想一样也是一种分解方式)

  • 关联
    • 与分治思想有一定的关联。分治思想是将一个复杂的问题分解为多个子问题分别解决,关注分离点也是一种分解方式,它将软件系统的开发关注点分解为内容结构、表现形式和交互行为这几个方面。同时,关注分离点也有助于实现单一职责原则,因为每个部分(HTML、CSS、JavaScript)都有自己明确的职责范围,避免了一个代码段承担多种不相关的功能。
  • 区别
    • 与分治思想不同的是,关注分离点更侧重于从功能性质(内容、样式、交互)的角度进行分离,而分治思想可以应用于更广泛的问题分解,如将一个大型应用按照功能模块(用户管理模块、订单管理模块等)进行分解。与单一职责原则相比,关注分离点主要是针对网页开发中的三种不同类型的职责(结构、样式、交互)进行划分,而单一职责原则更强调在代码单元(类、函数等)层面上一个单元只负责一个功能。

 

 

 

posted @ 2024-11-10 17:51 ACM_Someone like you 阅读(24) 评论(0) 推荐(0) 编辑

2024年10月22日

iOS Swift 的捕获列表 [weak self] 和 [unowned self]

摘要: 捕获列表(capture list)是 Swift 中闭包的重要概念之一,用来控制闭包如何捕获和存储其上下文中的外部变量。 捕获行为 在闭包中使用外部变量时,Swift 会自动捕获这些变量的引用。如果这些变量是引用类型(如类实例),闭包会持有它们的强引用,可能导致强引用循环,即内存泄漏。 捕获列表允 阅读全文

posted @ 2024-10-22 10:56 ACM_Someone like you 阅读(54) 评论(0) 推荐(0) 编辑

2024年10月17日

iOS Swift 里的捕获变量

摘要: 在 Swift 中,闭包不仅可以作为函数的简洁表达方式,还能捕获和存储其所在上下文中的常量和变量。捕获的变量会随着闭包的生命周期延续,即使这些变量已经超出了原作用域,它们仍然可以在闭包中被访问和修改。这种行为被称为闭包捕获,是闭包的核心特性之一。 //变量值捕获 func makeIncrement 阅读全文

posted @ 2024-10-17 15:49 ACM_Someone like you 阅读(19) 评论(0) 推荐(0) 编辑

2024年10月15日

iOS Swift 函数的输入输出参数(关键字 inout)

摘要: 在 Swift 中,输入输出函数(In-Out 参数)允许函数对传入的变量进行修改,并且这些修改会在函数调用后反映在原始变量上。通常,函数的参数是常量,无法在函数内部修改传递进来的变量,而 In-Out 参数可以改变这一行为。 In-Out 参数的语法和用法: 使用 inout 关键字: 在函数定义 阅读全文

posted @ 2024-10-15 11:43 ACM_Someone like you 阅读(118) 评论(0) 推荐(0) 编辑

iOS Swift 函数的可变参数

摘要: 可变参数 在 Swift 中,可变参数(Variadic Parameters)允许函数接受不定数量的参数。你可以在函数定义时通过在参数类型后面加上 ... 来声明可变参数。 func sum(numbers: Int...) -> Int { var total = 0 for number in 阅读全文

posted @ 2024-10-15 11:05 ACM_Someone like you 阅读(49) 评论(0) 推荐(0) 编辑

2024年10月14日

iOS Swift 集合类型 (Array、Set 和 Dictionary ) 与 元组

摘要: 语言提供数组(Array)、集合(Set)和字典(Dictionary)三种基本的集合类型用来存储集合数据。 数组是有序数据的集。 集合是无序无重复数据的集。 字典是无序的键值对的集。 Swift 中的数组、集合和字典必须明确其中保存的键和值类型,这样就可以避免插入一个错误数据类型的值。同理,对于获 阅读全文

posted @ 2024-10-14 17:52 ACM_Someone like you 阅读(28) 评论(0) 推荐(0) 编辑

Swift 字符串是值类型 的特性理解

摘要: 在 Swift 中,字符串是值类型,这是 Swift 语言的一项设计特性。 值类型和引用类型的核心区别在于它们在内存中的存储方式和传递行为。 1. 值类型(Value Type) 特点: 值类型在赋值或传递时会被复制,每个变量/常量都有自己独立的副本。 修改一个值类型的副本不会影响其他副本。 在 S 阅读全文

posted @ 2024-10-14 10:42 ACM_Someone like you 阅读(23) 评论(0) 推荐(0) 编辑

2024年10月12日

Swift 的 恒等(===)和不恒等(!==)

摘要: Swift 提供了两个运算符 和 !==,用于判断两个对象是否引用同一个对象实例。 这是用来比较引用类型(例如类实例)的操作符,而不是用来比较值类型(如结构体、枚举、基本数据类型)。 :判断两个引用是否指向同一个对象(引用同一块内存地址)。 !==:判断两个引用是否指向不同的对象。 class Pe 阅读全文

posted @ 2024-10-12 18:32 ACM_Someone like you 阅读(66) 评论(0) 推荐(0) 编辑

Swift 安全解包 if let 和 guard let 异同 总结

摘要: 在 Swift 中,if let 和 guard let 都用于安全解包可选类型,但它们的使用场景和语义略有不同。 if let 用于解包可选值,如果成功解包,则进入 if 语句块内执行相关代码。如果解包失败,则进入 else 语句块。 guard let 也是用于解包可选值,但是与 if let 阅读全文

posted @ 2024-10-12 15:29 ACM_Someone like you 阅读(93) 评论(0) 推荐(0) 编辑

2024年9月26日

Objective-C (OC) 中 不推荐 使用 true 和 false 分析

摘要: 背景: 写多混编语言 把swift 习惯带入到了OC 就比如这个布尔值的写法 前言:虽然 true 和 YES 实际上等效为 1,但为了代码的一致性和可读性,最好在 Objective-C 中用 YES 和 NO 1. 类型不同 YES 和 NO 是 Objective-C 的 BOOL 类型,它本 阅读全文

posted @ 2024-09-26 11:06 ACM_Someone like you 阅读(60) 评论(0) 推荐(0) 编辑

导航

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示