solid原则简单笔记

这些天因为工作上的需求,一套代码部署到不同的环境里。
虽然说是一样的业务,但是在不同的环境里难免会有一些少许不同的业务。

刚开始的时候觉得没什么问题,分了几个分支。
但是后来感觉越来越不对劲了,不同的环境分不同的分支,以为是很简单的事情。
时间长了,分支之间的差异也越来越大,感觉应该分不同的仓库。
这分了仓库问题又来了,改了Bug需要再不同的仓库里重复的修改代码,审查代码,合并代码,测试…
把我忙的不亦乐乎。

这让我怀疑,是不是代码结构本身有问题?
虽然现在用的Go语言不是面向对象编程语言,
但是我觉得经典的面向对象编程思想应该能对我有帮助。
查到了一个很有趣的原则:solid原则。

当做自己的笔记简单的整理了一下solid原则。

SRP	    The Single Responsibility Principle	    单一责任原则
OCP	    The Open Closed Principle	            开放封闭原则
LSP	    The Liskov Substitution Principle	    里氏替换原则
ISP	    The Interface Segregation Principle	    接口分离原则
DIP	    The Dependency Inversion Principle	    依赖倒置原则

◆ 单一责任原则(The Single Responsibility Principle)

一个类只完成它应该完成的职责。

这一原则其实项目刚开始的时候很容易遵守。
但是项目久了后,你会发现你的项目越来越变味儿。
需要不断的重构中,维持单一责任原则。

◆ 开放封闭原则(The Open Closed Principle)

软件实体(类,模块,函数等等)应当对扩展开放,对修改闭合。

好难好难。
尤其是api的版本不断的升级,老版本的api又不能弃用的时候,
而且结构在不断的变化的时候…ㅠㅠ

◆ 里氏替换原则(The Liskov Substitution Principle)

只有在确定是 is-a 的关系时才能使用继承。

这一原则我刚开始的时候还真不理解。其实很简单。
我们创建一个[人]的抽象类, [老人],[孩子],[女人] 的类可以都继承[人]这个抽象类。
那[猩猩]也走路,用手。很像人,它能不能继承[人]?
不行![猩猩] is [人] 是不能成立的。

还有网上有个这样的例子也举得很不错。
有个[鸟]的抽象类。那[鸵鸟]能继承[鸟]这个抽象类吗?
这要看业务对[飞]这方法怎么处理?
如果是放到[鸟]里,那[鸵鸟]就不应该继承[鸟]。
如果[飞]这方法不太重要,不需要放在[鸟]的抽象类里,
那[鸵鸟]可以继承[鸟]了。

[鸵鸟] is [鸟]。 如果说这命题不成立,有点牵强。
但是[鸵鸟]能否继承[鸟],这得看具体业务场景了。

◆ 接口分离原则(The Interface Segregation Principle)

如果一个接口包含了过多的方法,应该通过分离接口将其拆分。

拆分后怎么管理和监控,又是一门学问…^^

◆ 依赖倒置原则(The Dependency Inversion Principle)

上层(抽象)不应该依赖于下层(实体),下层(实体)应该依赖于上层(抽象)。

这道理其实都懂,但是有意的事情是,如果定期做重构的话,你会发现有些代码还真这样。

另外多提一下2个原则
◆ 迪米特法则,又称最少知道原则(Demeter Principle)

一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。

◆ 合成复用原则(Composite Reuse Principle)

合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。

其实也没有什么内容,就当自己的笔记整理了一下。


欢迎大家的意见和交流

email: li_mingxie@163.com