我掌握了有效开发软件项目的秘诀,试图为自己找到使使用SOLID体系结构的开发原理有用的原因(文章如何不了解SOLID体系结构的开发原理 )。
对这些原理的分析使得可以挑选出开发中存在的几个关键模式和基本要素。 他们使我们能够在软件项目的实际工作中描述,理解和实施SOLID。
对这些概念对普遍接受的编程范例(例如,面向对象编程)的适用性进行分析变得很有趣。 好吧,如果这项工作的结果对您有用。

如今,有许多用于设计和随后实施软件项目的方法。 处理大型软件项目时最需要的是: 结构编程 , 功能编程 , 面向对象的编程 。
对我来说,分析这些设计方法的原因变得很有趣。 在分析过程中,意外发现是它们全部隐式基于以下前提:
, .
软件项目开发
什么是不需要开发的项目? 这类项目很少见,主要特点是快速计件付款,程序员无需承担任何后续义务,例如:
- 可以用一种方法编写的小项目;
- 一个没有结构复杂代码,负担大量关系的项目;
- 软件产品,无需其支持和用户支持。
在这种情况下,程序员在维护例如面向对象方法方面的工作被浪费了。 经常发生的情况是,在开发一次性控制台实用程序的过程中,我陷入了毫无意义的课,当时我突然意识到,在该项目中编写四年级的文字会耽误我15分钟的时间,并没有使我更接近结果。 最可悲的是,几乎没有在此类项目中编写的所有类都被遗忘并且不被重用,也就是说,它们不会为将来的工作提供便利。
在所有其他情况下,程序员必须尽量减少其工作,必须开发一个结构上复杂的项目,即:
- 通过分析代码并查找产生这些错误的位置来纠正错误。
- 在保持所有以前可用功能的功能的同时引入新功能。 这样做时,请在执行这些新任务时使用现有代码(编写并经过测试)。
- 在使用软件产品时提供支持。
- 对项目所有版本的功能进行描述和协调。
- 保持项目使用的所有数据格式(即使是过时的)都可操作。
- 并执行因框架变更或对过时的OS的支持终止而导致与竞争对手对抗的许多其他任务...
如果您寻求与软件项目开发的类比,则可以回忆起生物物种的进化。
"". - . - .
程序员的工作并不容易,但是程序员有一个“助手”。 该帮助器隐藏在我们世界结构的深处,其中具有两个功能:
- 能够编写一种有用的算法并将其用于许多类似任务的能力,
- 解决方案中存在许多相似的任务。
为了简便起见,该算法在许多领域都有用,将被称为通用算法。 它针对特定应用领域的实现可以称为专业化,因为改进算法以在狭窄应用领域中使用的过程类似于生物体内细胞的进化专业化。
显然,要创建算法,必须确定确保算法适用性的特征。 必须在输入数据和初始情况(上下文)的描述中寻找这些符号。 为了创建通用算法,有必要在每个主题领域(具有自己的数据符号和情况符号集)中识别适用于所有领域的符号。 通用算法会忽略所有其他不提供适用性的符号。 对通用算法进行形式化,我们已经得出使用抽象的必要性- 抽象是OOP的最重要原理之一。 而且,OOP的特征在于仅强调数据抽象。
在这里,我将尝试写出在不同领域使用抽象的示例。
抽象化 | 演算法 | 应用领域 |
---|
自然数 | 定量计算算法 | 经济价值核算任务 |
材料体的质量特性 | 比较物质含量的算法 | 比较非问责产品价值的任务 |
与操作接口以收集元素:完全爬网,比较和位置交换 | 集合排序算法 | 程式设计 |
树中“结束节点”和“分支节点”具有相同操作的接口 | 基于布局设计模式的算法 | 开发复杂的软件项目 |
关键概念“员工” | “雇用合同”一节中的措词 | 劳动法 |
软件项目的构建块
程序员使用各种抽象技术,以一段代码的形式实现该算法,这是他工作的一个独立而完整的元素。 根据所使用的编程语言,该元素可以是函数,对象和指令序列。 为了便于进一步讨论,我们将此代码段称为“ component ”一词。
组件 -一段代码(过程,类,部署组件等):
- 它实现了一些完整的算法,该算法可以在某些初始情况下和某些输入数据下工作,
- 可以在一个项目中多次使用(甚至在不同项目中可以多次使用),
- 所有指令的位置都非常靠近并且可以查看,而无需在开发环境中进行其他搜索操作,
- 相对于其余代码,程序员可以相对独立地执行的更改。
软件项目开发中的模式
使用术语“ 组件” ,可以制定出一套在软件项目开发中存在的简单定律。 我将以以下语句的形式介绍这些模式,分为3类。
- 描述组件属性的语句。
1.1。 必须使用正确编写的组件,并且经常使用几次。
1.2。 在使用该组件的每个地方,都期望它具有恒定的行为,从而导致可重复的结果。
1.3。 在多个地方使用组件时,结果应满足每个地方的使用要求。
1.4。 嵌入在组件中的行为会限制该组件的使用位置。
1.5。 在组件的每个使用位置,都可能涉及其所有限制。
1.6。 对组件的任何更改都会改变其局限性,并且需要验证其使用的所有位置,这导致程序员浪费时间。
1.7。 建议在一种情况下以代码形式编写组件 ,即有必要消除相同代码的重复。 更改组件时,这将减少编辑次数。 - 描述程序员在执行新任务时的模式的语句。
2.1。建议选择一个用于执行新任务的选项,同时尽量减少程序员花费的时间。
2.2。 为了执行新任务,程序员可以添加新组件或更改旧组件的行为。
2.3。 基本上,添加组件仅需要在新使用的地方进行检查,并为程序员节省了最少的时间。
2.4。 根据陈述[1.6],由新任务引起的组件行为的变化需要在新使用场所和所有旧使用场所进行验证,与陈述[2.3]的情况相比,这会增加程序员的时间成本。 对于已发布的组件,这要求所有程序员使用修改后的组件进行工作 。 - 描述通用算法及其专业领域交互中的模式的语句:
3.1。 有机会编写一个基本 组件 (名称是与基类类似地引入的,为了简洁起见,我们将使用“ base ”一词)。 该库仅满足某些通用算法的最重要特征。
3.2。 可以编写一个组件-专业化(为简便起见,在下文中,我们将使用“ 专业化 ”一词)。 专业化是对基础 通用算法的补充,使其适用于特定的使用领域。
3.3。 语句[3.1],[3.2]中的基础比专门化具有更少的复杂性和更少的应用程序限制。
3.4。 根据陈述[1.7],建议在不重复数据库 通用算法代码的情况下发展专业化 。
3.5。 在更改了正确形成的专业化条件后,无需验证数据库的使用场所。
面向对象的编程概念
我将尝试使用以上语句来分析面向对象编程的基本概念。 这种分析绕过了抽象的概念,因为前面已经在构造通用算法的方法的形式化中对其进行了描述。
类,对象
这些OOP概念增强了使用一种特殊类型的组件的可行性,该组件由一些内部数据和使用这些数据的方法的组合来描述。 组[1]和[2]的所有语句都被转换为OOP,为此,术语组件替换为class的概念。
同时,乍看之下, 类和对象之间的关系被一组语句[3]穷尽,其中用基 类的概念代替了基 ,而用对象的概念代替了实现 。 此外, 实现是动态的,即在程序执行期间可以更改。
封装形式
“ 封装 ”的概念可以从两个“侧面”考虑。
“ 封装 ”概念的第一面是将组件与代码的其他部分隔离。 此属性使程序员可以在“接近”位置的代码区域中进行操作以对组件进行更改。 也就是说,通过从工作中排除搜索和分析程序的不同交互元素来最大程度地减少程序员所花费的时间。 此面由组件的属性(根据其定义)定义。
“ 封装 ”概念的第二面是隐藏了组件的内部实现。 使用语句组[3]中描述的基础和实现的概念,这种隐藏是可能的。 为此,将基 类标识公共类方法,并用实现标识私有和受保护的类方法。 在使用场所,使用了由基础构成的限制,因此可以在实现中进行与基本限制无关的更改。 这些实现的更改无需在使用数据库的地方进行检查[3.5],从而最大程度地减少了程序员的工作量。
值得注意的是,“ 包封 ”的概念在生物学上有一个类比。 第一个过程类似于“ 细胞膜 ”的生物学功能。
传承
“ 继承 ”的概念继续增强了使用base + 实现组合的重要性。 为此,在语句组[3]中,有必要用基标识父类的方法,并用实现标识后继类的方法。
在其实现中,“ 继承 ”的概念允许使用语句[2.3],即使用代码的添加而不是对其进行更改和复制。 在这种情况下,有必要排除基本算法的重复。 但是,使用继承来专门化通用算法的方法要差很多。 缺点是存在两个牢固连接的组件 ,这两个组件很难独立更改。 这些依赖关系是由父子关系生成的。
有多种使用base + 实现捆绑包的方法。 我将进一步举例说明这种方法。
基数 | 实作 | 应用领域 |
---|
公共类方法 | 私人课方法 | 封装形式 |
父类的受保护方法 | 继承类方法 | 传承 |
动态库界面 | 动态库功能 | 组件 =动态库 |
模板(通用)方法和类(模板,通用) | 使用指定的参数实例化模板 | 通用编程 |
接受委托的泛型方法 | 指示特定处理程序的方法的专业化 | 排序或形成树的过程,指示评估元素顺序的方法 |
允许与Visitor模板进行交互的类 | 形成具有所需功能的“访客” | 访客设计模式 |
NPP控制面板 | 核电站的自动化设备一套 | NPP运营商隐瞒系统复杂性 |
同时,我注意到,对于来自巴解组织的“ 继承 ”概念,人们也可以在生物进化过程中找到一个类比。 在生物学中,术语“ 遗传 ”用于此目的。
多态性
我认为,“ 多态性 ”的概念是查看通用算法创建过程的第二方面。 第一面( 抽象 )是从如何创建通用算法的角度出发的观点。 同时,从用户的角度看通用算法时,我们记录了多态性的概念。 即, 多态性是函数( 组件 )处理各种类型的数据的有用能力。 将这一概念添加到OOP中可以增强在软件项目开发中使用通用算法的有用性。
不同编程语言中的多态实现非常不同。 在Wikipedia上有关多态的文章中,根据其实现方式,有4个子类型:参数,包含(或子类型),重载,类型转换。 这些实现具有显着差异,但是所有实现都由一个目标结合在一起-这是编写一种通用算法,对于其特定的专业化无需重复。
这次,几乎没有惊奇,他发现了生物学中“ 多态性 ”概念的类比。 这个生物学术语的名称与OOP的概念完全吻合。 “ 多态性 ”-一种生物以不同内部结构或不同外部形式存在的能力。
结论
因此,OOP的几乎所有基本概念都可以表示为基于软件项目开发定律形成的一组简单陈述。 此外,对于OOP,术语组件是用class的概念来标识的。 如果我们为术语`` 组件'' (例如函数)选择了不同的含义,则可以表述函数式 编程的基本概念。
在撰写本文的过程中,发现了用于编程的概念的生物学类比。 这些类比的出现是由于软件产品的开发方法和某些生物进化过程的相似性。
恕我直言,建议同时考虑这两个科学领域。 在这种情况下,有可能进行法律从一个行业到另一行业的转移,从而确保信息技术的发展和生物学过程的形式描述。
谢谢您的关注。
评论
我将非常感谢您的反馈,建议和意见,因为它们有助于我调整该领域工作的发展方向。
参考文献
由Borisova M.V.编辑