0

0

软件开发的坚实原则

王林

王林

发布时间:2024-08-01 20:31:34

|

788人浏览过

|

来源于dev.to

转载

软件开发的坚实原则

在软件开发领域,solid 原则是一组五个设计原则,旨在创建健壮、可维护和可扩展的软件系统。这些原则由 robert c. martin(也称为 bob 叔叔)提出,为开发人员提供了遵循的指南,以确保他们的代码库干净且可扩展。在这里,我们将探索每个 solid 原则,并通过 python 示例演示如何实现它们。

1.单一职责原则(srp)

定义:一个类应该只有一个改变的理由,这意味着它应该只有一项工作或职责。

示例

MarsX
MarsX

AI驱动快速构建App,低代码无代码开发,改变软件开发的游戏规则

下载
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。

2. 开闭原理(ocp)

定义:软件实体应该对扩展开放,对修改关闭。

示例

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。

3.里氏替换原理(lsp

定义:子类型必须可以替换其基本类型,而不改变程序的正确性。

示例

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 基类。

4. 接口隔离原则(isp)

定义:客户端不应该被迫依赖他们不使用的接口。

示例

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。

5. 依赖倒置原则(dip)

定义:高层模块不应该依赖于低层模块。两者都应该依赖于抽象。抽象不应该依赖于细节。细节应该取决于抽象。

示例

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中的实际示例,我们可以看到如何应用这些原则来创建健壮且可维护的系统。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

755

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

636

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

759

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

618

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1262

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

577

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

708

2023.08.11

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

5

2026.01.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.8万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 793人学习

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

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