SOLID 是電腦程式設計中五個良好原則(規則)的縮寫。 SOLID 允許程式設計師編寫更易於理解和稍後更改的程式碼。 SOLID 通常與使用物件導向設計的系統一起使用。
讓我們使用車輛範例來解釋 SOLID 原理。想像一下,我們正在設計一個系統來管理不同類型的車輛,例如汽車和電動車,以提供運輸服務。
車輛範例:假設您有一輛汽車。它負責駕駛,但不應該負責處理自己的維護(例如換油或輪胎旋轉)。相反,由單獨的機械師負責。
說明:在我們的程式碼中,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
車輛範例:假設您有一輛基本型汽車,現在您想在系統中增加一輛電動車。您不必修改現有的汽車類別即可添加電動車的功能。相反,您可以透過為電動車創建新類別來擴展現有功能。
說明: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
車輛範例:假設您有一支車隊,並且您可以毫無問題地用電動車替換任何普通汽車。兩者都應該能夠在不破壞系統的情況下執行其基本功能 - 駕駛 - 。
說明:任何子類別(如 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
車輛範例:想像一下您有不同類型的車輛:有些可以充電(如電動車),有些只能駕駛(如汽油車)。您不希望汽油車必須處理與充電相關的方法。
解釋:類別應該只實作它們需要的介面(或行為)。例如,電動車輛可能同時實現可駕駛和可充電接口,而普通車輛僅實現可駕駛。
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
車輛範例:想像一輛汽車可以有不同類型的引擎:燃氣引擎或電動引擎。汽車不應該直接依賴特定的引擎類型,而應該依賴更通用的引擎接口,這樣它就可以使用任何類型的引擎。
說明:高階模組(如車輛)不應依賴低階模組(如 GasEngine 或 ElectricEngine)。兩者都應該依賴抽象(如引擎介面)。這使得系統更加靈活並且更容易更改。
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/
以上是SOLID 原則使用一些有趣的類比與車輛範例的詳細內容。更多資訊請關注PHP中文網其他相關文章!