Andiroid

五大原则
(单一职责、开放封闭、里氏代换,接口隔离、依赖倒置)
单一职责原则-SRP-Single responsibility principle

就一个类而言,应该只有一个导致其变化的原因。一个职责就是一个变化的轴线,一个类如果承担的职责过多,就等于将这些职责耦合在一起。一个职责的变化可能影响到其他职责。

    什么是职责?

        职责是“变化的原因”

            例如某一个类现在同时具有“连接”和“通信”两种职责,根据单一职责原则,则可能存在两种处理方式:

                1:“连接”和“通信”可能独立变化时

                    这种情况下,应该把职责分开。例如,应用的变化导致“连接”部分方法的签名(signature)发生了变化,那么使用数据“连接”的部分也需要重新编译,部署,这会相当麻烦,使得设计僵化。

                2:“连接”和“通信”同时变化时

                    这种情况下,不必将职责分开。反而分离可能导致“不必要的复杂性”。

开放封闭原则-OCP-Open-Closed Principle

软件实体(类、模块、函数等)应该是可以扩展的,同时还可以是不必修改的,更确切地说,函数实体应该:

    1:对扩展是开放的

        当应用的需求变化时,我们可以对模块进行扩展,使其具有满足改变的新的行为--即我们可以改变模块的功能。

    2:对更改是封闭的

        对模块进行扩展时,不必改动已有的源代码或二进制代码。

如果任何修改都需要改变已经存在的代码,那么可能导致牵一发动全身现象。

事实上没有对所有变化的情况都封闭的模型,我们可以预测它们,或则直到我们发现他们才行动。

如下面的示例:
class ClentInterface{

        virtual void ServerFunc() = 0;

    };

    class server:public ClientInterface {

        int serverData;

    public

        void ServerFunc();

    }

 

    Class client{

        ClientInterface& ci;

    public

        client(ClientInterface &CI):ci(CI){

        }

        void useServer(){

            ci.ServerFunc();

        }

    };
一个问题: 为什么上述的ClientInterface这个类要取这个名字,叫做AbstractServer岂不更好?

其实这里面蕴含了一个思想:

    client类中更多的描述了高层的策略,而Server类中对这些策略的一种具体实现。而接口是策略的的一个组成部分,他跟client端的关系更加密切

我们可以这样想问题;ClientInterface中定义了client期望Server做什么,而server具体类是对client这种要求的一种具体实现。

OCP原则其实是要求我们清晰的区分策略和策略的具体实现形式。允许扩展具体的实现形式(开放),同时将这种扩展与策略隔离开来,使其对上层的策略透明(封闭)。

一般情况下,无论模块多么“封闭”,都会存在一些无法对之封闭的变化,没有对所有变化的情况都封闭的模型

接口隔离原则-ISP-Interface Segregation Principle

不应该强迫客户依赖于他们不用的方法

一个类的不内聚的“胖接口”应该被分解成多组方法,每一组方法都服务于一组不同的客户程序。

依赖倒置原则-DIP-Dependency Inversion Principle

高层模块不应该依赖于底层模块。二则应该依赖于抽象。抽象不应该依赖于细节。细节应该依赖于抽象。

所谓“倒置”是相对于传统的开发方法(如结构化开发方法)中总是倾向于让高层模块依赖于底层模块而言的。

高层包含应用程序的策略和业务模型,而底层包含更多的实现细节,平台相关细节等。高层依赖底层将导致:

    难以复用:底层改变一个软硬件平台将导致一些具体的实现发生变化,如果高层依赖底层,这种变化将导致逐层的更改。

    难以维护:底层通常是易变的。

良好的OO体系结构都具有清晰的层次定义,每个层次通过一个定义良好的、受控的接口向外提供了一组内聚的服务。

依赖关系倒置:下层的实现,依赖于上层的接口。

接口所有权倒置:客户拥有接口,而服务者则从这些接口派生。

依赖不倒置的开发

    自顶向下首先设计整个软件的分解结构

    然后首先实现下层的功能

    再实现上层的功能,并使上层调用下层函数

依赖倒置的开发

    首先设计上层需要调用的接口,并实现上层

    然后底层类从上层接口派生,实现底层

接口属于上层

LisKov替换原则-LSP-Liskov Substitution Principle

子类型Subtype必须能够替换他们的基类型(Basetype),若对每个类型S的对象O1,都存在一个类型T的对象O2,使得所有针对T编写的程序P中,用O1替换O2后,程序P的行为功能不变,则S是T的子类型。
posted @ 2021-12-08 14:21  落笔生花  阅读(101)  评论(0)    收藏  举报