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