Ruby面向对象编程之SOLID(一)

简介: Ruby面向对象编程之SOLID(一)

在网上用中文搜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类并不需要改变。

相关文章
|
8月前
|
设计模式 Java API
Ruby 面向对象编程之 SOLID
Ruby 面向对象编程之 SOLID
|
8月前
|
设计模式 Java API
Ruby面向对象编程之SOLID(完全篇)
Ruby面向对象编程之SOLID(完全篇)
Ruby面向对象编程之SOLID(完全篇)
|
Ruby 数据安全/隐私保护 索引
《面向对象设计实践指南:Ruby语言描述》—第1章 1.4节 面向对象编程简介
面向对象的应用程序由对象和它们之间传递的消息构成。其中,消息相对更为重要。但在本节的简介里(以及在本书的前面几个章节里),这两个概念都同等重要。
1725 0
|
3月前
|
Ruby
|
3月前
|
Ruby
|
2月前
|
数据采集 Web App开发 数据处理
Ruby网络爬虫教程:从入门到精通下载图片
Ruby网络爬虫教程:从入门到精通下载图片
|
3月前
|
JSON 数据格式 Ruby
|
3月前
|
JSON Ubuntu Linux
|
3月前
|
存储 JSON 数据格式
|
3月前
|
安全 Ruby