我们一起来读书吧 关注:153贴子:2,723
  • 6回复贴,共1

架构整洁之道7-11

只看楼主收藏回复

在我们日常开发中,设计原则是一种用来指导设计决策的方法,它帮助开发者构建出高效、可维护、可扩展、可复用的系统。这几章中主要介绍了5种原则:
1. 单一职责原则(Single Responsibility Principle,SRP):它指的是一个类应该只有一个改变的原因。也就是说,一个类应该只负责一个功能领域中的职责。如果一个类负责了多个领域的职责,那么它就可能在一个领域的变化影响到另一个领域,这将使得系统变得复杂且难以维护。遵循这个原则,可以提高类的可读性和可维护性,同时也有利于软件的复用。2. 开放封闭原则(Open-Closed Principle,OCP):它指的是软件实体(类、模块、函数等等)应当对扩展开放,对修改封闭。也就是说,当需要添加新功能时,我们应该尽量通过添加新代码来实现,而不是修改原来的代码。这样可以降低修改代码带来的风险,并提高软件的可维护性。3. 里氏替换原则(Liskov Substitution Principle,LSP):它指的是子类型必须能够替换掉它们的基类型。也就是说,如果一个程序使用了一个基类的对象,那么它也应该能够使用该基类的任何一个子类的对象,而且替换后程序的行为不变。遵循这个原则,可以提高软件的可复用性和可维护性。4. 接口隔离原则(Interface Segregation Principle,ISP):它指的是客户端不应该被迫依赖于它不使用的接口。也就是说,一个类对另一个类的依赖应该建立在最小的接口上。遵循这个原则,可以减少类之间的耦合度,提高系统的灵活性。5. 依赖倒置原则(Dependency Inversion Principle,DIP):它指的是高层模块不应该依赖于低层模块,两者都应该依赖于抽象。也就是说,抽象不应该依赖于细节,细节应该依赖于抽象。遵循这个原则,可以降低类之间的耦合度,提高系统的稳定性。


IP属地:北京来自Android客户端1楼2024-09-02 19:07回复
    针对单一指责原则来说,可以举个例子
    假设我们正在开发一个用户会员资源系统,定义一个用户会员类(Employee),这个类的职责可能包括会员的基本信息管理,比如等级,背景,气泡等,同时也可能包括用户的的会员权益等级计算规则和吧等级信息。按照单一职责原则,这个会员类的设计就是不合理的。
    因为会员的基本信息管理是一个职责,会员权益等级计算是另一个职责,吧等级是另一个职责。这三个职责都属于不同的功能领域,它们之间的变化原因和频率可能完全不同。如果这些职责都放在同一个类中,那么当一个职责发生变化时,就可能影响到其他的职责,导致系统复杂且难以维护。


    IP属地:北京来自Android客户端2楼2024-09-02 19:07
    回复
      针对开放封闭原则来说:这里可以以三方分享功能为例进行说明。假设现在你的应用程序有一个分享功能,可以将内容分享到微信、QQ和微博。这个功能的实现可能是一个 ShareHelper 类,其中有一个 share 方法,根据传入的参数决定分享到哪个平台。


      IP属地:北京来自Android客户端3楼2024-09-02 19:17
      回复
        如上代码,如果现在要增加一个分享到钉钉的功能,你就需要修改 ShareHelper 类的代码,这就违反了开放封闭原则。因为对于软件实体的修改可能引入新的错误,而且每次新增功能都要修改代码,工作量也大。
        正确的做法应该是定义一个 Share 接口,每个具体的分享平台都实现这个接口,然后在 ShareHelper 中只需要调用这个接口的方法就可以了。
        这样,当我们需要增加新的分享平台时,只需要新增一个类实现 Share 接口就可以了,而不需要修改 ShareHelper 的代码,这就符合了开放封闭原则。



        IP属地:北京来自Android客户端4楼2024-09-02 19:18
        回复
          根据里氏替换原则,子类必须能够替换掉它们的父类。也就是说,在我们的程序中,无论Share接口在哪里被使用,都可以用它的任何一个子类(如WeChatShare、QQShare、WeiboShare)来替换,而不会影响程序的运行。程序中的代码不需要知道具体是哪一个子类,只需要知道它是Share接口类型就可以了。


          IP属地:北京来自Android客户端5楼2024-09-02 19:22
          回复
            它规定“客户端不应该被强迫依赖于它不使用的接口”。
            在上述分享功能的例子中,我们已经定义了一个 Share 接口,各个分享平台的类(如 WeChatShare、QQShare、WeiboShare)都实现了这个接口。这些实现类就是 Share 的子类。
            假设现在我们的 Share 接口除了 share 方法之外,还有很多其他的方法,如 login、logout、getUserInfo 等。但是对于 ShareHelper 类来说,它只关心 share 方法,而不关心其他的方法。这就是一个违反接口隔离原则的例子。
            按照接口隔离原则,我们应该将 Share 接口拆分成多个更小的接口,每个接口只包含一些特定的方法。然后让 ShareHelper 只依赖于它需要的那些接口。



            IP属地:北京来自Android客户端6楼2024-09-02 19:26
            回复
              依赖倒置原则它规定“高层模块不应该依赖低层模块,两者都应该依赖抽象”。
              在上述分享功能的例子中,我们已经定义了一个Share接口,各个分享平台的类(如WeChatShare、QQShare、WeiboShare)都实现了这个接口。这些实现类就是Share的具体实现,也可以看作是低层模块。
              而我们的ShareHelper类在处理分享的时候,只依赖于Share接口,而不依赖于具体的实现类:
              这就是依赖倒置原则的体现。ShareHelper这个高层模块不依赖于低层模块(WeChatShare、QQShare、WeiboShare),而是依赖于抽象(Share接口)。这样就降低了高层模块和低层模块之间的耦合度,提高了代码的可维护性和可扩展性。当我们需要增加新的分享平台时,只需新增一个实现Share接口的类,而无需修改ShareHelper类的代码。



              IP属地:北京来自Android客户端7楼2024-09-02 19:35
              回复