0

0

SOLID 原则使用一些有趣的类比与车辆示例

WBOY

WBOY

发布时间:2024-08-22 19:45:54

|

720人浏览过

|

来源于dev.to

转载

SOLID 原则使用一些有趣的类比与车辆示例

solid 是计算机编程中五个良好原则(规则)的缩写。 solid 允许程序员编写更易于理解和稍后更改的代码。 solid 通常与使用面向对象设计的系统一起使用。
让我们使用车辆示例来解释 solid 原理。想象一下,我们正在设计一个系统来管理不同类型的车辆,例如汽车和电动汽车,以提供运输服务。

s - 单一职责原则(srp)

车辆示例:想象你有一辆汽车。它负责驾驶,但不应该负责处理自己的维护(例如换油或轮胎旋转)。相反,由一名单独的机械师负责。
说明:在我们的代码中,vehicle 类应该只处理与车辆本身相关的事情,比如存储其品牌和型号。如果我们需要管理维护,我们会为此创建一个单独的维护类。这样,每个类都有一个工作或职责,使代码更易于管理。

class vehicle
  def initialize(make, model)
    @make = make
    @model = model
  end
end

class maintenance
  def initialize(vehicle)
    @vehicle = vehicle
  end

  def perform_maintenance
    puts "performing maintenance on #{@vehicle.make} #{@vehicle.model}"
  end
end

o - 开/闭原理(ocp)

车辆示例:假设您有一辆基本型汽车,现在您想在系统中添加一辆电动汽车。您不必修改现有的汽车类别即可添加电动汽车的功能。相反,您可以通过创建新的电动汽车类来扩展现有功能。
说明:vehicle类是开放扩展的(你可以创建新类型的车辆,如electricvehicle),但它是封闭修改的(你不需要更改vehicle类本身来添加新类型)。

class vehicle
  def initialize(make, model)
    @make = make
    @model = model
  end

  def description
    "#{@make} #{@model}"
  end
end

class electricvehicle < vehicle
  def initialize(make, model, battery_range)
    super(make, model)
    @battery_range = battery_range
  end

  def description
    "#{super} with #{@battery_range} miles battery range"
  end
end

l - 里氏替换原理 (lsp)

车辆示例:假设您有一支车队,并且您可以毫无问题地用电动汽车替换任何普通汽车。两者都应该能够在不破坏系统的情况下执行其基本功能 - 驾驶 - 。
说明:任何子类(如 electricvehicle)都应该能够替换其父类(vehicle),而不改变程序的行为。这确保我们的代码可以以相同的方式处理不同类型的车辆。

class vehicle
  def initialize(make, model)
    @make = make
    @model = model
  end

  def drive
    puts "driving the #{@make} #{@model}"
  end
end

class electricvehicle < vehicle
  def drive
    puts "driving the electric #{@make} #{@model} quietly"
  end
end

def test_drive(vehicle)
  vehicle.drive
end

car = vehicle.new("toyota", "corolla")
ev = electricvehicle.new("tesla", "model 3")

test_drive(car)  # driving the toyota corolla
test_drive(ev)   # driving the electric tesla model 3 quietly

i - 接口隔离原则(isp)

车辆示例:想象一下您有不同类型的车辆:有些可以充电(如电动汽车),有些只能驾驶(如汽油车)。你不希望汽油车必须处理充电相关的方法。
说明:类应该只实现它们需要的接口(或行为)。例如,电动车辆可能同时实现可驾驶和可充电接口,而普通车辆仅实现可驾驶。

module drivable
  def drive
    raise notimplementederror, "this #{self.class} cannot drive"
  end
end

module chargeable
  def charge
    raise notimplementederror, "this #{self.class} cannot be charged"
  end
end

class vehicle
  include drivable

  def initialize(make, model)
    @make = make
    @model = model
  end

  def drive
    puts "driving the #{@make} #{@model}"
  end
end

class electricvehicle < vehicle
  include chargeable

  def initialize(make, model, battery_range)
    super(make, model)
    @battery_range = battery_range
  end

  def drive
    puts "driving the electric #{@make} #{@model} quietly"
  end

  def charge
    puts "charging the #{@make} #{@model}"
  end
end

d - 依赖倒置原理(dip)

车辆示例:想象一辆汽车可以有不同类型的发动机:燃气发动机或电动发动机。汽车不应该直接依赖于特定的引擎类型,而应该依赖于更通用的引擎接口,这样它就可以使用任何类型的引擎。
说明:高级模块(如车辆)不应依赖于低级模块(如 gasengine 或 electricengine)。两者都应该依赖于抽象(如引擎接口)。这使得系统更加灵活并且更容易更改。

EasySub – AI字幕生成翻译工具
EasySub – AI字幕生成翻译工具

EasySub 是一款在线 AI 字幕生成器。 它提供AI语音识别、AI字幕生成、AI字幕翻译,本来就很简单的视频剪辑。

下载
class Engine
  def start
    raise NotImplementedError, "This #{self.class} cannot start"
  end
end

class GasEngine < Engine
  def start
    puts "Starting gas engine"
  end
end

class ElectricEngine < Engine
  def start
    puts "Starting electric engine"
  end
end

class Vehicle
  def initialize(engine)
    @engine = engine
  end

  def start
    @engine.start
  end
end

gas_engine = GasEngine.new
electric_engine = ElectricEngine.new

gas_car = Vehicle.new(gas_engine)
electric_car = Vehicle.new(electric_engine)

gas_car.start        # Starting gas engine
electric_car.start   # Starting electric engine

通过遵循此车辆示例中的 solid 原则,我们可以构建一个易于维护、扩展和适应新需求的系统。

领英:https://www.linkedin.com/in/anandsoni11/

相关文章

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

56

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

49

2025.11.27

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

56

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

49

2025.11.27

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

56

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

49

2025.11.27

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1023

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

65

2025.10.17

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号