前语

身为程序员咱们每天都与代码打交道,而编程思维则是程序员在编写程序时所遵从的一种思维办法和办法论。它涵盖了程序员在面临问题时的考虑办法、处理问题的办法以及编写代码的技巧和标准,下面简单说一下

一、编程范式

咱们编程的进程中常见以下三种范式,分别是结构化编程**(Structured Programming)、 面向方针编程(Object-Oriented Programming)以及函数式编程(Functional Programming)**

结构化编程(Structured Programming)

结构化编程是一种编程范式,它着重在编写程序时应该运用结构化的、明晰、易于了解的控制结构,以进步代码的可读性和可保护性。结构化编程的中心思维是将程序的流程控制结构化为次序、挑选和循环,一同防止运用不受约束的分支和跳转句子。 结构化编程的首要特征包括以下几点:

  1. 次序结构:程序由一系列按次序履行的句子组成,每个句子都在前一个句子履行完毕后才履行。这使得代码的履行流程明晰明晰。
  2. 挑选结构:结构化编程支撑条件句子,例如 ifswitch,以依据条件履行不同的代码块。条件句子能够嵌套,但应坚持简练。
  3. 循环结构:结构化编程答应运用循环句子,如 forwhiledo-while,来多次履行相同的代码块,然后防止重复的代码。
  4. 模块化:结构化编程鼓舞将代码划分为小的模块或函数,每个模块履行特定的使命。这种模块化的办法使得代码更易于了解、测验和保护。
  5. 递归:结构化编程也支撑递归,但要求递归调用是有限的,防止无限递归。
  6. 制止不受约束的跳转和分支:结构化编程一般制止运用不受约束的 goto 句子,由于它能够导致难以了解和保护的代码。

结构化编程的方针是降低程序的杂乱性,削减过错和调试的难度,使代码更具可读性和可保护性。

面向方针编程(Object-Oriented Programming,OOP)

面向方针编程是一种常用的编程范式,它的中心思维是将程序中的数据(方针)和操作数据的办法(函数)安排成方针,以模仿现实国际中的实体和它们之间的联系。面向方针编程着重数据封装、承继和多态等概念,以进步代码的可重用性、可保护性和可扩展性。 面向方针编程的首要特征包括以下几点:

  1. 类与方针:面向方针编程经过界说类(Class)来描绘方针的结构和行为。类是方针的模板,它界说了方针具有的特点(成员变量)和办法(成员函数)。方针是类的实例化,每个方针都具有类界说的特点和办法。
  2. 封装:封装是将数据和办法打包在一个方针中,并对外部躲藏方针内部的细节。经过拜访修饰符(如私有、公共、受保护等),能够控制方针的哪些部分能够被外部拜访,然后进步数据的安全性和代码的可保护性。
  3. 承继:承继是一种机制,答应创立一个新类(子类或派生类),该类承继了一个或多个现有类(父类或基类)的特点和办法。承继能够促进代码的重用,削减代码的重复编写。
  4. 多态:多态性答应不同的方针对相同的音讯作出不同的呼应。它经过办法的重写(覆盖)和接口的完成来完成。多态性进步了代码的灵敏性和可扩展性。
  5. 笼统类与接口:笼统类是一种不能被实例化的类,它能够包括笼统办法,需求子类完成。接口是一种纯笼统类,界说了一组办法的签名,需求完成这些办法的详细细节。笼统类和接口用于界说标准和约好,以保证方针的一致性。
  6. 音讯传递:面向方针编程经过方针之间的音讯传递来完成操作。方针能够向其他方针发送音讯,请求履行某个办法,这种音讯传递是面向方针编程的中心概念。

面向方针编程一般用于构建杂乱的软件体系,它将问题分解为方针的组合,每个方针担任特定的使命。这种编程范式有助于进步代码的可保护性、可了解性和可扩展性,因而在现代软件开发中得到广泛运用。许多编程言语,如**Java、C++、Python、C#**等,都支撑面向方针编程,供给了类和方针的概念以及相应的语法和工具。

函数式编程(Functional Programming,FP)

函数式编程是一种编程范式,它将核算视为数学函数的求值进程,着重运用纯函数和防止可变状况和可变数据。函数式编程的中心思维是将核算进程分解为一系列函数的组合和运用,这些函数不会修正状况或发生副效果,而只是依据输入生成输出。函数式编程能够协助程序员编写更简练、可保护、并发安全的代码,并供给一种不同于传统指令式编程的考虑办法。 函数式编程的首要特征包括:

  1. 纯函数:纯函数是指具有以下性质的函数:
    • 关于相同的输入,总是发生相同的输出。
    • 不会修正外部状况或变量。
    • 不依靠于外部状况或变量。
  2. 不行变性:函数式编程鼓舞运用不行变数据结构,这意味着一旦数据被创立,就不能被修正。假如需求修正数据,有必要创立一个新的数据副本。不行变性有助于防止竞态条件和并发问题,使代码愈加安稳。
  3. 高阶函数:高阶函数是能够承受一个或多个函数作为参数,并/或返回一个函数作为成果的函数。高阶函数答应将函数作为一等公民来处理,然后支撑函数的组合和笼统。
  4. 递归:函数式编程一般运用递归代替循环来完成迭代进程。递归是一种自引证的技能,它能够用于处理列表、树等数据结构。
  5. 慵懒核算:函数式编程中的某些操作(如映射、过滤、折叠)或许是慵懒的,也便是说它们不会立即履行,而是在需求时才履行。这能够进步性能和资源利用率。
  6. 不行变性:函数式编程鼓舞运用不行变数据结构,这意味着一旦数据被创立,就不能被修正。假如需求修正数据,有必要创立一个新的数据副本。不行变性有助于防止竞态条件和并发问题,使代码愈加安稳。
  7. 引证透明性:引证透明性是指一个函数的调用成果只取决于其输入参数,而不依靠于任何外部状况或变量。这使得函数在不同的上下文中能够安全地替换和重用。

函数式编程一般用于处理杂乱的问题,如并发编程、数据处理、事件驱动编程等。一些编程言语,如Haskell、Scala、Clojure、Elixir等,被规划为纯函数式编程言语,而其他言语,如JavaScript、Python、Java等,则供给了函数式编程的特性和库。函数式编程的思维也在现代编程中得到了广泛的运用,尤其是在大数据处理、散布式体系和前端开发范畴。

二、规划准则

规划准则和架构之间有着紧密的联系。规划准则是咱们进行架构规划的辅导思维,它辅导咱们怎么将数据和函数安排成类,以及怎么将类链接起来成为组件和程序。而架构的首要工作则是将软件拆解为组件,规划准则则辅导咱们怎么进行拆解、拆解的粒度、组件间依靠的方向以及组件解耦的办法等。

主导准则:OCP(开闭准则) 类和代码的层级上:SRP(单一责任准则)、LSP(里氏替换准则)、ISP(接口隔离准则)、DIP(依靠回转准则) 在组件的层级上:REP(复用、发布等同准则)、CCP(一同闭包准则)、CRP(一同复用准则)处理组件依靠问题的三个准则:无依靠环准则、安稳依靠准则以及安稳笼统准则。

这些规划准则和架构的准则都是为了进步软件的可保护性、可扩展性和可重用性。它们协助咱们构建出愈加强健、灵敏和高效的体系。

为什么要遵从规划准则 ?

规划准则是做规划时所要依据的准则,它为咱们的规划供给导游,表现咱们的规划价值观。遵从规划准则能够使咱们的代码愈加可读性、可保护性和可扩展性。一同,它也能够协助团队成员更好地了解和保护代码,然后进步团队的协作效率。

1.OCP(开闭准则)

  1. 对扩展敞开(Open for Extension):这意味着在不修正现有代码的状况下,应该能够添加新功用或扩展现有功用。这能够经过创立新的类、接口、模块等办法来完成。
  2. 对修正封闭(Closed for Modification):这意味着一旦一个软件实体(如类)被创立并投入运用,就不该该对其进行修正。任何改变应该经过扩展来完成,而不是直接修正原有代码。

开闭准则的方针是进步软件体系的可保护性、可扩展性和可复用性。它鼓舞运用笼统、接口、多态等面向方针编程的特性来完成扩展,一同防止损坏现有代码,然后降低了引进新功用时引进过错的风险。

开闭准则一般与规划形式、依靠注入、接口笼统等编程概念和技能一同运用,以创立灵敏且易于保护的软件体系。遵从这一准则有助于削减代码的耦合性,进步代码的可测验性,并支撑继续集成和继续交付等开发实践。

2.SRP(单一责任准则)

  1. 一个类应该只要一个原因引起改变:这意味着一个类应该只要一个责任或功用。假如一个类有多个不同的原因或许会导致它发生改变,那么这个类就违反了单一责任准则。
  2. 高内聚性:单一责任准则鼓舞将与一个类的责任相关的数据和办法封装在一同,以保证类的内部结构具有高内聚性。高内聚性有助于进步代码的可读性、可保护性和可测验性。

单一责任准则的方针是保证每个类都专心于履行一项清晰界说的使命,然后降低了类的杂乱性,进步了代码的可了解性和可保护性。它有助于防止类的膨胀和混乱,削减了因修正一个责任而引起的潜在问题。

遵从单一责任准则一般需求进行类的拆分和重构,将大型、杂乱的类拆分红多个小而精确的类,每个类担任一个清晰的责任。这样的规划有助于降低耦合性,进步代码的可重用性,并支撑面向方针编程的其他准则和规划形式。

3.LSP(里氏替换准则)

  1. 子类型有必要彻底完成基类的接口:子类型应该承继或完成基类的一切特点和办法,以保证能够无缝地替换基类的实例。子类型不该该删去基类的特点或办法,也不该该引进与基类不兼容的新特点或办法。
  2. 子类型能够扩展基类的功用:尽管子类型有必要坚持对基类的兼容性,但它们能够添加额定的功用或修正基类的完成。这答应子类型在不损坏替换性的前提下,供给自己的特定行为。
  3. 坚持不变性:子类型不该该损坏基类的不变性条件。这意味着子类型的操作不该该导致基类的不变性条件变为假。这是保证程序的正确性的要害。

LSP的方针是保证在运用多态性时,代码能够安全地替换基类的实例为子类的实例,而不会引发过错或损坏程序的正确性。遵从LSP有助于进步代码的可保护性、可扩展性和可重用性,由于它答应开发人员在不改变现有代码的前提下,引进新的子类型。

这一准则的实践运用一般触及到合理的承继和多态规划,以保证子类型能够无缝替换基类,然后完成面向方针编程的中心特性之一。

4.ISP(接口隔离准则)

  1. 接口应该小而专注:接口应该只包括客户端需求的办法,而不该该包括大量不相关的办法。这意味着接口应该尽或许小,不该该过度臃肿。
  2. 类不该该被逼迫完成不需求的接口:假如一个类完成了一个包括多个办法的接口,但只运用了其间的一部分办法,那么这个类就被逼迫完成了它不需求的办法,这是不合理的。
  3. 客户端不该该依靠于它们不运用的接口:客户端类应该只依靠于它们真实需求的接口,而不该该依靠于那些它们不运用的接口。这能够经过将接口细分红更小的、更专注的接口来完成。

ISP准则的方针是削减类之间的耦合性,进步代码的可保护性和灵敏性。遵从ISP准则有助于防止类变得巨大而杂乱,削减不用要的依靠联系,使代码更易于了解、测验和修正。

一个常见的实践是将一个大型接口分解成多个小型接口,每个接口只包括一组相关的办法。这样,类能够挑选性地完成它们真实需求的接口,而不需求强制性地完成不相关的办法。这有助于遵从ISP准则,使接口愈加灵敏和可定制。

5.DIP(依靠回转准则)

  1. 高层模块与低层模块都应该依靠于笼统:高层模块(如运用程序的事务逻辑)和低层模块(如数据拜访层或底层设备驱动)都应该依靠于笼统,而不该该直接依靠于详细的完成细节。
  2. 笼统不该该依靠于细节:笼统接口或类不该该依靠于详细完成的细节。这意味着笼统应该界说通用的行为和契约,而不关心底层细节的完成办法。
  3. 细节应该依靠于笼统:详细的完成细节(如详细的数据库拜访类或底层硬件驱动)应该依靠于笼统界说的接口或类。这保证了细节能够适应不同的笼统完成,而不需求修正高层模块的代码。

DIP准则的方针是降低模块之间的耦合性,进步代码的可扩展性和可保护性。经过遵从DIP准则,能够完成以下长处:

  • 简单替换底层完成:由于高层模块依靠于笼统,因而能够轻松地替换底层完成细节,而不会影响高层模块的代码。
  • 简单进行单元测验:经过将高层模块与笼统接口进行解耦,能够更简单地编写单元测验,运用模仿方针**(Mock)**替代底层完成。
  • 降低代码修正的风险:当需求修正底层完成时,不用修正高层模块的代码,只需保证新的完成契合笼统接口的契约即可。

DIP准则一般与依靠注入**(Dependency Injection)一同运用,依靠注入是一种完成DIP的办法,经过将依靠联系从高层模块外部注入,以保证高层模块不需求自己创立或直接依靠于底层模块的实例。这有助于更好地契合DIP**准则。

6.REP(复用、发布等同准则)

REP准则是指组件中的类与模块有必要是彼此紧密相关的,一个组件不能由一组毫无相关的类和组件组成,它们之间应该有一个一同的主题或大致方向。一同,一个组件中包括的类和模块还应该是能够一同发布的,这意味着它们共享相同的版本号与版本盯梢,并且包括在相同的发行文档中。 需求留意的是,REP准则并不适用于一切状况。有时候,将相关的类和模块分离到不同的组件中或许更有利于代码的安排和保护。因而,在实践开发中,咱们需求依据详细的需求和项目特点来灵敏运用这个准则。

7.CCP(一同闭包准则)

关于大部分运用程序来说,可保护性的重要性要远高于可复用性。假如某个程序中的代码有必要要进行某些改变,那么这些改变最好都表现在同一个组件中,而不是散布于很多个组件中。由于假如这些改变都会集在同一个组件中,咱们就只需求重新布置该组件,其他组件则不需求被重新验证、重新布置了。 CCP的首要效果便是提示咱们要将一切有或许会被一同修正的类会集在一处。也便是说,假如两个类紧密相关,不管是源代码层面仍是笼统理念层面,永久都会一同被修正,那么它们就应该被归属为同一个组件。经过恪守这个准则,咱们就能够有效地降低因软件发布、验证及布置所带来的工作压力。

8.CRP(一同复用准则)

一般状况下,类很少会被单独复用。更常见的状况是多个类一同作为某个可复用笼统界说被一同复用。CRP准则辅导咱们将这些类放在同一个组件中,而在这样的组件中,咱们应该预见到会存在着许多相互依靠的类。 CRP准则的效果不仅是告诉咱们应该将那些类放在一同,更重要的是要告诉咱们应该将哪些类分隔。由于每逢一个组件运用了另一个组件时,就等于增加了一条依靠联系。尽管这个引证联系仅触及被引证组件中的一个类,但它所带来的依靠联系一点点没有削弱。也便是说,引证组件已然依靠于被引证的组件了。 由于这种依靠联系的存在,每逢被引证组件发送改变时,引证它的组件一般也需求做出相应的改变。即便它们不需求进行代码级的改变,一般也免不了需求被重新编译、验证和布置。哪怕引证组件底子不关心被引证组件中的改变,也要如此。 因而,当咱们决定要依靠某个组件时,最好是实践需求依靠该组件中的每个类。换句话说,咱们期望组件中的一切类是不能拆分的,即不该该出现别人只需依靠它的某几个类而不需求其他类的状况。不然,咱们后续就好浪费不少时刻与精力来做不用要的组件布置。

8.1 REP、CCP、CRP三者联系

REP、CCP、CRP 三个准则之间存在彼此竞争的联系,REPCCP 是黏合性准则,它们会让组件变得更大,而 CRP 准则是排除性准则,它会让组件变小。恪守**REP、CCP **而疏忽 CRP ,就会依靠了太多没有用到的组件和类,而这些组件或类的变动会导致你自己的组件进行太多不用要的发布;恪守 REP 、CRP 而疏忽 CCP,由于组件拆分的太细了,一个需求改变或许要改n个组件,带来的成本也是巨大的。

浅谈一下编程思想(一)

9.无依靠环准则(Acyclic Dependencies Principle,ADP)

  1. 无循环依靠:ADP 要求在软件体系中不该该存在循环依靠联系。这意味着一个组件不该该直接或间接地依靠于自己,也不该该依靠于依靠于它的组件。
  2. 松耦合:ADP 有助于完成松耦合,由于循环依靠会导致高度耦合的组件。经过保证依靠联系是无环的,能够降低组件之间的耦合度,使体系愈加灵敏和可保护。
  3. 依靠倒置:ADP 一般与依靠倒置准则**(DIP)**一同运用。DIP 要求高档组件不该该依靠于初级组件,而是两者都应该依靠于笼统。ADP 能够协助保证这种笼统联系不会导致循环依靠。

无依靠环准则有助于削减代码杂乱性和进步体系的可保护性。它鼓舞开发人员在规划和安排组件时考虑依靠联系,并防止不用要的杂乱性和过错。这个准则在大型软件体系的规划和架构中特别有用,能够协助防止潜在的规划问题。

10.安稳依靠准则(Stable Dependencies Principle,SDP)

  1. 安稳性SDP 着重高层模块或组件应该愈加安稳,而低层模块或组件应该愈加不安稳。安稳性指的是组件的改变频率,安稳的组件不简单发生改变,而不安稳的组件或许会频频改变。
  2. 依靠方向SDP 鼓舞依靠联系的方向应该从不安稳的组件指向安稳的组件。也便是说,安稳的组件不该该依靠于不安稳的组件,由于不安稳的组件或许会频频改变,导致对安稳组件的影响。
  3. 安稳性等级SDP 将组件分为不同的安稳性等级,一般运用数字来表明。例如,等级 1 表明最不安稳的组件,等级 10 表明最安稳的组件。安稳的组件应该依靠于比它更不安稳的组件。
  4. 可保护性:经过遵从安稳依靠准则,能够进步体系的可保护性。安稳的组件改变较少,因而不会频频影响其他组件,使体系更简单保护和扩展。
  5. 逆向依靠联系SDP 还提到了逆向依靠联系,即反向依靠。它表明低层次的不安稳组件依靠于高层次的安稳组件,这种状况应该尽量防止,由于它或许导致规划的混乱和不安稳。

安稳依靠准则有助于规划和安排软件体系,以保证高层次的模块或组件不简单遭到底层模块的改变影响。这有助于降低体系中的意外副效果和过错,进步代码的可保护性和安稳性。在软件架构和规划中考虑安稳依靠准则能够协助开发人员拟定合理的依靠战略。

11.安稳笼统准则

  1. 安稳性:与安稳依靠准则相似,安稳笼统准则也重视安稳性,但侧重于笼统层次。安稳性指的是笼统的改变频率,安稳的笼统不简单发生改变,而不安稳的笼统或许会频频改变。
  2. 笼统等级:软件体系一般由多个笼统层次组成,从高档其他笼统到初等级的详细完成。安稳笼统准则建议高档其他笼统应该愈加安稳,而初等级的笼统应该愈加不安稳。这意味着高档其他笼统不该该频频改变,以保证体系的安稳性。
  3. 依靠方向:与安稳依靠准则相似,安稳笼统准则也着重依靠联系的方向。安稳的笼统应该被不安稳的笼统依靠,而不该该依靠于不安稳的笼统。这有助于保证高档其他笼统不简单遭到初等级完成的改变影响。
  4. 安稳性等级:相似于安稳依靠准则,安稳笼统准则也运用数字来表明笼统的安稳性等级。高档其他笼统应该拥有较高的安稳性等级,而初等级的笼统应该拥有较低的安稳性等级。
  5. 可保护性:经过遵从安稳笼统准则,能够进步体系的可保护性。安稳的笼统不简单发生改变,因而高档其他笼统不会频频影响到依靠它的其他部分,然后使体系更易于保护和扩展。

安稳笼统准则与安稳依靠准则一同协助开发人员规划安稳且易于保护的软件体系。它着重了笼统的重要性,高档其他笼统应该是体系的中心,并且应该是安稳的,以保证体系的安稳性和可保护性。经过合理规划笼统层次和依靠联系,能够更好地应对改变和需求的演化。

三、总结

编程范式与规划准则是软件开发中的两个要害概念,它们关于构建高质量、可保护和可扩展的软件体系至关重要。编程范式供给了一种编码和考虑的办法,而规划准则则为咱们供给了一组辅导准则,以保证代码的质量和可保护性。 总的来说,编程范式和规划准则是软件开发的基石,它们有助于创立高质量、可保护和可扩展的软件体系。了解它们并将它们运用到实践项目中将有助于进步代码的质量和可保护性,然后为用户供给更好的体会。

参阅

规划形式概念和七大准则-腾讯云开发者社区-腾讯云