在网上用中文搜Ruby SOLID
,出来的很多文章都是英文,不过这也许是我用谷歌搜的结果。
SOLID原则,是面向对象编程的几个重要概念的英文首字母缩写,也是面向对象编程中最基础的几个概念。最早是由《代码清洁之道》的作者Bob Martin和《修改代码的艺术》的作者Michael Feathers 提出来。
但是,基础,并不意味着很多人都掌握,其实,不掌握的还是很多。对于掌握了的人来说,能用好的也不多。为什么会这样呢?也许因为对我们人类来说,它却恰好是反模式
。
SOLID 原则是什么
SOLID 不是一个原则,他是一组面向对象设计原则的简称,他代表下面5种设计原则:
S
ingle Responsibility Principle 单一职责原则O
pen/Closed Principle 开闭原则L
iskov Substitution Principle 里氏替换原则I
nterface Segregation Principle 接口分离原则D
ependency Inversion Principle 依赖倒置原则
以上就是SOLID中的5种面向对象设计原则,下面分别看看他们具体指的是什么。
单一职责原则,即 Single Responsibility Principle
单一职责原则是修改一个类的理由从来不应超过一个。
这条原则虽然看上去简单,但是实施起来非常难。因为你很难去界定一个类的职责。
这个职责的确定有一些技巧,比如说你在实现这个类的时候,不需要去关注其他的类;还有就是你修改这个类的时候,如果影响到这个类的其他职责的实现,那说明我们需要拆分这个类了。
比如说Rails中Model的职责,主要是用来处理Ruby对象和数据库中的相应的表的关系。现在我们的写REST API的时候,都需要为用户生成一个Token。通常的写法会是:
class User < ActiveRecord::Base ... def generate_token # generate unique token end ... end
但是很显然,生成Token这个职责和User本身的关系并不大, 因此我们应该把它单独提出来。
关闭原则(Open/Closed Principle)
类或者方法,应该对扩展是开放的,对修改是关闭的
有没有一种感觉,突然发现Rails项目不用维护了 :》
这个原则的主要作用是希望进一步提升我们的代码的模块化。开关原则主要是通过各种设计模式来实现,例如策略模式。
以我们生活中的手机充电器为例:
class Charger def charge case phone_type when android_phone use_type_c_for_charging when iphone use_lightning_for_charging end end private def use_type_c_for_charging # charging end def use_ligntning_for_charging # charging end end
假如说我们希望支持旧手机,那我们必须修改这个类:
class Charger def charge case phone_type when android_phone use_type_c_for_charging when iphone use_lightning_for_charging when old_android_phone use_micro_usb_for_charging end end private def use_type_c_for_charging # charging end def use_ligntning_for_charging # charging end def use_micro_usb_for_charging # charging end end
很显然这违反了开关原则。为了使得我们的代码遵守开关原则,我们可以使用以下代码:
class Charger def initialize(phone) @phone = phone end def charge @phone.charge end end class Android def charge p "Android phone is charging..." end end class Iphone def charge p "Iphone is charging..." end end vivo = Android.new charger = Charger.new(vivo) charger.charge
即便后续手机接口又变了,我们可以再声明一个类来实现charge的功能,而我们的Charger类并不需要改变。