软件开发的坚实原则

软件开发的坚实原则

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

1.单一职责原则(srp)

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

示例:

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()}")# usageclass item:    def __init__(self, name, price):        self.name = name        self.price = priceitems = [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 totalclass 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.amountdef calculate_total(order, discount):    total = order.calculate_total()    return discount.apply(total)# usagediscount = percentagediscount(10)print(calculate_total(order, discount))

在此示例中,discount 类由 percentagediscount 和 fixdiscount 扩展,无需修改基类,遵循 ocp。

3.里氏替换原理(lsp)

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

示例:

class bird:    def fly(self):        passclass 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()# usagesparrow = 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, abstractmethodclass printer(abc):    @abstractmethod    def print_document(self, document):        passclass scanner(abc):    @abstractmethod    def scan_document(self, document):        passclass 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}")# usagemfp = 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, abstractmethodclass Database(ABC):    @abstractmethod    def save(self, data):        passclass 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)# Usagemysql_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中的实际示例,我们可以看到如何应用这些原则来创建健壮且可维护的系统。

以上就是软件开发的坚实原则的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1348675.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
“警惕时间复杂度陷阱”
上一篇 2025年12月13日 12:15:00
如何使用 Beautiful Soup 从公共网络中提取数据
下一篇 2025年12月13日 12:15:16

相关推荐

  • 红米13c内存不足如何清理?

    红米13c内存不足如何清理?红米13c内存不足如何清理?红米13c内存不足如何清理?红米13c内存不足如何清理?

    清理 Redmi 13C 内存的实用指南Redmi 13C 作为今年的热门机型,其出色的性能和时尚的外观备受用户喜爱。但随着使用时间的增加,内存不足的问题可能会困扰用户。php小编柚子特此整理了这篇实用指南,将详细介绍如何有效清理 Redmi 13C 内存,释放存储空间,优化设备性能。通过阅读以下内…

    2026年10月5日 • 用户投稿
    100
  • 在Java中实现整数到字符串的支付方式转换并存储到MySQL数据库

    在Java中实现整数到字符串的支付方式转换并存储到MySQL数据库在Java中实现整数到字符串的支付方式转换并存储到MySQL数据库在Java中实现整数到字符串的支付方式转换并存储到MySQL数据库在Java中实现整数到字符串的支付方式转换并存储到MySQL数据库

    本文旨在解决在Java应用程序中,如何将整型的支付方式选择转换为对应的字符串描述,并最终存储到MySQL数据库中的问题。文章将提供多种解决方案,包括使用简单的JDBC,以及利用JPA的转换器功能,帮助开发者根据实际项目情况选择最合适的实现方式。 在Java应用程序中,经常会遇到需要将整型数据转换为字…

    2026年10月5日 • 用户投稿
    300
  • Java 中如何将整数映射为 MySQL 中的字符串类型?

    Java 中如何将整数映射为 MySQL 中的字符串类型?Java 中如何将整数映射为 MySQL 中的字符串类型?Java 中如何将整数映射为 MySQL 中的字符串类型?Java 中如何将整数映射为 MySQL 中的字符串类型?

    本文旨在解决 Java 程序中将整数类型的支付方式映射到 MySQL 数据库中字符串类型的问题。通过结合 JDBC 和条件判断,或者利用 JPA 的 Converter 接口,可以实现整数到字符串的转换,从而满足数据库存储的需求,同时保持 Java 代码的类型一致性。 在开发 Java 应用,特别是…

    2026年10月5日 • 用户投稿
    100
  • Java如何调用Python脚本 Java通过ProcessBuilder实现跨语言

    Java如何调用Python脚本 Java通过ProcessBuilder实现跨语言Java如何调用Python脚本 Java通过ProcessBuilder实现跨语言Java如何调用Python脚本 Java通过ProcessBuilder实现跨语言Java如何调用Python脚本 Java通过ProcessBuilder实现跨语言

    java 调用 python 脚本最常见方式是通过 processbuilder 执行外部命令,1. 可调用系统命令并传递参数,2. 支持设置环境变量与工作目录,3. 可捕获输出与错误信息,4. 需读取输入输出流避免阻塞,5. 通过 exitcode 判断执行结果,适用于 python 作为独立模块…

    2026年10月5日 • 用户投稿
    000
  • 在Java和MySQL之间使用整数代表字符型数据:一种解决方案

    在Java和MySQL之间使用整数代表字符型数据:一种解决方案在Java和MySQL之间使用整数代表字符型数据:一种解决方案在Java和MySQL之间使用整数代表字符型数据:一种解决方案在Java和MySQL之间使用整数代表字符型数据:一种解决方案

    在Java和MySQL数据库交互时,有时会遇到需要在Java中使用整数代表某些字符型数据,并在数据库中以字符型存储的需求。例如,使用整数1代表“信用卡”,2代表“借记卡”等支付方式。直接在Java代码中尝试将字符串转换为整数(如Integer.parseInt(“Debit”…

    2026年10月5日 • 用户投稿
    100
  • Java怎么实现数据分页 JavaWeb分页查询与页面展示方案

    Java怎么实现数据分页 JavaWeb分页查询与页面展示方案Java怎么实现数据分页 JavaWeb分页查询与页面展示方案Java怎么实现数据分页 JavaWeb分页查询与页面展示方案Java怎么实现数据分页 JavaWeb分页查询与页面展示方案

    在javaweb中实现分页需从数据库查询、后端逻辑、前端展示及提升体验四方面入手。1. 数据库查询使用limit和offset实现分页,如mysql中通过select from table_name limit pagesize offset (pagenum-1)pagesize;2. 后端通过p…

    2026年10月5日 • 用户投稿
    200
  • 使用Yii框架创建社区网站

    在当前互联网时代,网站对于人们来说已经不再是简单地获取信息的工具,更多是成为人们社交交流的重要场所。对于一些社区型的网站来说,使用优质的框架,能够对开发工作提高效率,同时也能够提高网站的可靠性和稳定性。本文介绍如何使用 yii框架创建一个社区网站,涉及到的主要内容包括搭建开发环境、获取yii框架、创…

    用户投稿 2026年10月5日
    000
  • composer如何解决 “The requested PHP extension … is missing” 扩展缺失错误

    composer如何解决 “The requested PHP extension … is missing” 扩展缺失错误composer如何解决 “The requested PHP extension … is missing” 扩展缺失错误composer如何解决 “The requested PHP extension … is missing” 扩展缺失错误composer如何解决 “The requested PHP extension … is missing” 扩展缺失错误

    首先确认缺失的扩展名称,如ext-mongodb;然后检查PHP版本和配置文件路径,确保CLI与Web环境一致;根据操作系统选择对应安装方式:Linux用apt或yum,macOS用brew或pecl,Windows则修改php.ini启用.dll扩展;必要时可临时使用–ignore-p…

    2026年10月5日 • 用户投稿
    000
  • TIOBE 9 月榜单:Perl 重回前十

    TIOBE 9 月榜单:Perl 重回前十TIOBE 9 月榜单:Perl 重回前十TIOBE 9 月榜单:Perl 重回前十TIOBE 9 月榜单:Perl 重回前十

    2025年9月,TIOBE正式发布了最新一期的编程语言排行榜。本月最引人注目的变化是Perl强势回归前十,从一年前的第27位跃升至第10名。这一现象引发了广泛关注,TIOBE CEO Paul Jansen对此表示,尽管Perl曾在2005年3月达到历史巅峰(第3位),但此次复苏依然出人意料,值得深…

    2026年10月5日 • 用户投稿
    200
  • MySQL怎样实现数据校验约束 CHECK约束与触发器验证

    MySQL怎样实现数据校验约束 CHECK约束与触发器验证MySQL怎样实现数据校验约束 CHECK约束与触发器验证MySQL怎样实现数据校验约束 CHECK约束与触发器验证MySQL怎样实现数据校验约束 CHECK约束与触发器验证

    %ign%ignore_a_1%re_a_1%实现数据校验约束主要有两种方式:1. check约束(从8.0.16版本开始真正支持),用于简单的字段取值范围限制,如定义age字段必须在18到65之间;2. 触发器,提供更灵活的校验逻辑,通过before insert或before update等事件…

    2026年10月5日 • 用户投稿
    300
  • 深入理解Java方法返回类型与类型转换机制

    深入理解Java方法返回类型与类型转换机制深入理解Java方法返回类型与类型转换机制深入理解Java方法返回类型与类型转换机制深入理解Java方法返回类型与类型转换机制

    本文旨在探讨Java中方法返回类型与类型转换的机制,并明确指出无法通过对单一方法进行类型转换来使其返回不同数据类型值的行为。我们将深入分析Java的强类型特性、方法签名规则以及类型转换的本质,并提供常见的替代方案,以帮助开发者设计出更符合Java语言规范且类型安全的代码。 Java方法返回类型与类型…

    2026年10月5日 • 用户投稿
    200
  • 豆包人工智能在线入口 豆包人工智能网页版在线入口

    豆包人工智能在线入口 豆包人工智能网页版在线入口豆包人工智能在线入口 豆包人工智能网页版在线入口豆包人工智能在线入口 豆包人工智能网页版在线入口豆包人工智能在线入口 豆包人工智能网页版在线入口

    豆包的使用方法包括打开官方网页、注册登录、开始对话和获取答案。1. 打开网页:点击提供的链接进入豆包官网;2. 注册/登录:新用户注册或已有用户登录;3. 开始对话:在输入框提出问题或需求,如总结新闻、写文章或翻译;4. 获取答案:根据豆包的回复进一步提问或修改内容。豆包适用于信息查询、内容创作、学…

    2026年10月5日 • 用户投稿
    100
  • Windows 环境通过Virtual Box快速体验TiDB 5.0

    【免责声明】本文仅代表个人观点,与任何公司无关。 来源公众号|SQL和数据库技术(ID:SQLplusDB) 在Windows环境中,通过Virtual Box快速体验TiDB 5.0 安装虚拟机Virtual Box,安装Oracle Linux 7,配置虚拟机联网,使用TiUP Playgrou…

    2026年10月5日
    900
  • MySQL如何查看当前用户权限 权限层级与GRANT/REVOKE操作详解

    MySQL如何查看当前用户权限 权限层级与GRANT/REVOKE操作详解MySQL如何查看当前用户权限 权限层级与GRANT/REVOKE操作详解MySQL如何查看当前用户权限 权限层级与GRANT/REVOKE操作详解MySQL如何查看当前用户权限 权限层级与GRANT/REVOKE操作详解

    要查看mysql当前用户权限,使用show grants命令,并配合用户名和主机信息。例如,执行show grants for ‘testuser’@’localhost’;可查看具体用户的权限,而show grants;则用于查看当前连接用户的权限。…

    2026年10月5日 • 用户投稿
    100
  • MySQL怎样优化索引结构 复合索引与索引选择性优化

    MySQL怎样优化索引结构 复合索引与索引选择性优化MySQL怎样优化索引结构 复合索引与索引选择性优化MySQL怎样优化索引结构 复合索引与索引选择性优化MySQL怎样优化索引结构 复合索引与索引选择性优化

    索引优化的核心在于合理构建复合索引和提升索引选择性,以加快mysql查询效率。1. 构建复合索引时应遵循最左前缀原则,并优先选择区分度高、查询频率高的列;2. 索引选择性越高,查询效率越高,低选择性列可与其他高选择性列组合成复合索引或采用其他策略;3. 使用explain命令分析索引使用情况,关注t…

    2026年10月5日 • 用户投稿
    100
  • 为 jupyterlab 添加 debugger 扩展

    如何安装并使用 anaconda、jupyterlab、node.js 和 xpython 进行调试?以下是详细的步骤指南。 基本流程 安装 Anaconda安装 JupyterLab安装 Node.js安装 XPython建立 JupyterLab 工程搜索并安装插件使用插件进行调试 具体步骤 安…

    2026年10月5日
    200
  • Ubuntu 25.10 将默认搭载 Linux 6.17 内核

    Ubuntu 25.10 将默认搭载 Linux 6.17 内核Ubuntu 25.10 将默认搭载 Linux 6.17 内核Ubuntu 25.10 将默认搭载 Linux 6.17 内核Ubuntu 25.10 将默认搭载 Linux 6.17 内核

    Canonical 内核团队已将 Linux 6.17 的快照版本纳入 Ubuntu 25.10(Questing Quokka)的默认内核行列。目前该内核已集成至最新的每日构建版(daily ISOs),用户在安装 Ubuntu 25.10 时将自动搭载 Linux 6.17。 预计 Linux …

    2026年10月5日 • 用户投稿
    200
  • VSCode如何集成机器人开发工具链 VSCodeROS项目开发的配置指南

    zuojiankuohaophpc++nol> vscode中ros开发的核心扩展有:ros扩展、c/c++扩展、python扩展、cmake tools扩展、remote – ssh和dev containers扩展;2. 配置vscode正确识别ros环境和c++头文件的方法是…

    2026年10月4日
    100
  • MySQL如何查看锁等待 死锁检测与锁等待分析工具

    MySQL如何查看锁等待 死锁检测与锁等待分析工具MySQL如何查看锁等待 死锁检测与锁等待分析工具MySQL如何查看锁等待 死锁检测与锁等待分析工具MySQL如何查看锁等待 死锁检测与锁等待分析工具

    mysql中查看锁等待的核心方法包括使用show engine innodb status、性能模式表和专用工具。首先,执行show engine innodb status可查看死锁和事务锁信息;其次,查询events_waits_current等性能模式表定位当前或历史锁等待事件;最后,借助pt…

    2026年10月4日 • 用户投稿
    100
  • VSCode如何管理密码学项目 VSCode加密算法开发安全实践

    使用vscode dev containers实现环境隔离,确保开发环境纯净且可复现;2. 精确锁定依赖版本并定期使用pip-audit、npm audit等工具进行依赖审计,防止引入漏洞;3. 集成bandit、eslint安全规则、sonarlint等静态分析工具,在编码阶段实时检测安全问题;4…

    2026年10月4日
    100

发表回复

登录后才能评论
关注微信