在軟體開發領域,SOLID 原則是一組五個設計原則,旨在創建健壯、可維護和可擴展的軟體系統。這些原則由 Robert C. Martin(也稱為 Bob 叔叔)提出,為開發人員提供了遵循的指南,以確保他們的程式碼庫乾淨且可擴展。在這裡,我們將探索每個 SOLID 原則,並透過 Python 範例示範如何實現它們。
定義:一個類別應該只有一個改變的理由,這意味著它應該只有一項工作或職責。
範例:
class Order: def __init__(self, items): self.items = items def calculate_total(self): return sum(item.price for item in self.items) class InvoicePrinter: @staticmethod def print_invoice(order): print("Invoice:") for item in order.items: print(f"{item.name}: ${item.price}") print(f"Total: ${order.calculate_total()}") # Usage class Item: def __init__(self, name, price): self.name = name self.price = price items = [Item("Apple", 1), Item("Banana", 2)] order = Order(items) InvoicePrinter.print_invoice(order)
在這個例子中,Order類別只負責管理訂單,而InvoicePrinter類別負責列印發票。這透過確保每個類別都有單一職責來遵守 SRP。
定義:軟體實體應該對擴充開放,但對修改關閉。
範例:
class Discount: def apply(self, total): return total class PercentageDiscount(Discount): def __init__(self, percentage): self.percentage = percentage def apply(self, total): return total - (total * self.percentage / 100) class FixedDiscount(Discount): def __init__(self, amount): self.amount = amount def apply(self, total): return total - self.amount def calculate_total(order, discount): total = order.calculate_total() return discount.apply(total) # Usage discount = PercentageDiscount(10) print(calculate_total(order, discount))
在此範例中,Discount 類別由 PercentageDiscount 和 FixDiscount 擴展,無需修改基類,遵循 OCP。
定義:子類型必須可以取代其基本型,而不改變程式的正確性。
範例:
class Bird: def fly(self): pass class Sparrow(Bird): def fly(self): print("Sparrow is flying") class Ostrich(Bird): def fly(self): raise Exception("Ostrich can't fly") def make_bird_fly(bird): bird.fly() # Usage sparrow = Sparrow() make_bird_fly(sparrow) ostrich = Ostrich() try: make_bird_fly(ostrich) except Exception as e: print(e)
這裡,Ostrich 違反了 LSP,因為它不能飛,因此它不能取代 Bird 基底類別。
定義:客戶端不應該被迫依賴他們不使用的介面。
範例:
from abc import ABC, abstractmethod class Printer(ABC): @abstractmethod def print_document(self, document): pass class Scanner(ABC): @abstractmethod def scan_document(self, document): pass class MultiFunctionPrinter(Printer, Scanner): def print_document(self, document): print(f"Printing: {document}") def scan_document(self, document): print(f"Scanning: {document}") class SimplePrinter(Printer): def print_document(self, document): print(f"Printing: {document}") # Usage mfp = MultiFunctionPrinter() mfp.print_document("Report") mfp.scan_document("Report") printer = SimplePrinter() printer.print_document("Report")
在此範例中,MultiFunctionPrinter 實作了 Printer 和 Scanner 接口,而 SimplePrinter 僅實作了 Printer,遵循 ISP。
定義:高層模組不應該依賴低層模組。兩者都應該依賴抽象。抽像不應該依賴細節。細節應該取決於抽象。
範例:
from abc import ABC, abstractmethod class Database(ABC): @abstractmethod def save(self, data): pass class MySQLDatabase(Database): def save(self, data): print("Saving data to MySQL database") class MongoDBDatabase(Database): def save(self, data): print("Saving data to MongoDB database") class UserService: def __init__(self, database: Database): self.database = database def save_user(self, user_data): self.database.save(user_data) # Usage mysql_db = MySQLDatabase() mongo_db = MongoDBDatabase() user_service = UserService(mysql_db) user_service.save_user({"name": "John Doe"}) user_service = UserService(mongo_db) user_service.save_user({"name": "Jane Doe"})
在此範例中,UserService 依賴資料庫抽象,從而實現靈活性並遵守 DIP。
透過堅持 SOLID 原則,開發人員可以創建更模組化、更易於維護和可擴展的軟體。這些原則有助於管理軟體開發的複雜性,確保程式碼保持整潔和可擴展。透過Python中的實際範例,我們可以看到如何應用這些原則來創建健全且可維護的系統。
以上是軟體開發的堅實原則的詳細內容。更多資訊請關注PHP中文網其他相關文章!