SOLID原则与GRASP原则的区别2025 年 4 月 21 日 | 阅读 7 分钟 SOLID 和 GRASP 是面向对象设计中的两组不同原则,它们的上下文以及它们的出现/实现/工作的含义都截然不同。 什么是 SOLID?SOLID 是 面向对象编程 的五个主要原则的定义。它在增强软件的可维护性、可扩展性和模块化方面发挥作用,从而促进类之间的松耦合和高内聚。 SOLID 代表了面向对象设计的五个原则,这些原则可以带来可维护、可扩展且风险较低的系统,减少了系统中的变更和错误。 1. S - 单一职责原则 (Single Responsibility Principle)定义: 一个类应该只有一个改变的理由,这意味着它应该只有一个且仅有一个工作。 目的: 它缩小了类的职责范围,从而简化了类的实现,以提高可读性和可维护性。 示例: Bill 类应该只负责与账单本身相关的事务,例如计算总额,而不是像通过电子邮件发送发票这样的事务,这些事务由 EmailService 处理。 2. O - 开闭原则 (Open/Closed Principle)定义: 一个类应该对扩展开放,对修改关闭。 目的: 该原则允许在不修改类源代码的情况下扩展类的功能,从而可能减少引入新错误。 示例: 一个例子是支付系统,我们创建一个名为 PaymentProcessor 的基类,它可以扩展为在单独的类中实现不同的功能,例如 CreditCardPaymentProcessor 或 PayPalPaymentProcessor,并且仍然工作相同。 3. L - 里氏替换原则 (Liskov Substitution Principle)定义: 超类对象的实例应该可以用子类对象的实例替换,而不会影响程序的正确性。 目的: 它提供了保证,确保派生类在不改变预期行为的情况下扩展其父类的行为。 示例: 如果我们将“Rectangle”作为等效基类,“Square”作为派生类,那么 King 用“Square”替换“Rectangle”应该不会破坏程序的逻辑。 4. I - 接口隔离原则 (Interface Segregation Principle - ISP)定义: 客户端不应被迫依赖于那些不服务于它们的接口。 目的: 该原则提倡使用更小、更内聚的接口,而不是更大、更通用的接口,以对客户端施加有限程度的依赖。 示例: 不要设计一个像 Worker 这样包含 eat()、work() 和 sleep() 方法的大型接口。相反,应有两个隔离的接口,例如用于 work() 的 IWorker 和用于 eat() 的 IEater,以便类只实现它们需要的内容。 5. D - 依赖倒置原则 (Dependency Inversion Principle - DIP)定义: 高层模块不应依赖于低层模块。两者都应依赖于抽象。 目的: 该原则鼓励使用接口或抽象类来解耦高层和低层组件,从而增强整体系统的灵活性。 示例: 类应使用像 IDataStore 这样的接口,而不是直接实例化 Database 对象。这提供了灵活性,允许注入任何类型的数据存储(例如,SQL、NoSQL)。 什么是 GRASP 原则?GRASP 是用于表示“通用责任分配软件模式”(General Responsibility Assignment Software Patterns) 的首字母缩写。它们是一组设计模式,有助于开发人员在面向对象设计中决定哪些对象承担哪些责任。GRASP 侧重于系统中类的职责。 1. 信息专家 (Information Expert)定义: 将责任分配给拥有完成该责任所需信息的类。 目的: 该原则通过将一些职责从一个类转移到拥有完成任务所需信息的类来减轻该类的负担。 示例: 在图书馆应用程序中,Book 类应负责检查其可用性,因为它知道其当前状态。 2. 创建者 (Creator)定义: 将聚合、包含或紧密使用对象的类的职责分配给该类,负责实例化该类的实例。 目的: 它确定哪个类应承担创建对象的责任,并提供更高的内聚性、更低的耦合性和更易于维护性。 示例: 可能有一个 Library 类负责创建 Book 类的实例,因为它收藏了整本藏书并跟踪它们。 3. 控制器 (Controller)定义: 将系统事件处理的责任分配给代表特定用例或 UI 控制器的控制器类。 目的: 它有助于处理输入、处理以及系统中各个部分之间的通信。 示例: LibraryController 可以处理用户与图书借阅相关的交互并与系统进行通信。 4. 低耦合 (Low Coupling)定义: 以使相应依赖级别降低的方式将职责分配给类。 目的: 它有助于减少维护开销,从而一个类的任何后续更改都不会导致许多其他类的更改。 示例: 通过接口和依赖注入可以降低 Library 类与 BookDatabase 中特定实现的耦合。 5. 高内聚 (High Cohesion)定义: 以一种方式分配职责,使得相互关联的功能保留在一个类中,并且对特定类应该做什么有清晰的定义。 目的: 它使系统更易于理解和维护,因为每个类都做好一件事。 示例: Book 类负责与书本身相关的所有事务(例如,标题、作者和可用性),而不是将此责任委托给其他不相关的类。 6. 多态 (Polymorphism)定义: 将职责分配给根据类型具有不同实现的行为,使用多态方法,其中子类覆盖基类中的方法。 目的: 这是一个允许系统中灵活扩展的原则,可以添加新类型而对现有代码的更改最小。 示例: 如果有一个 Notification 基类和像 EmailNotification 和 SMSNotification 这样的子类,每个子类都将实现自己的 send() 版本。 SOLID 原则与 GRASP 原则之间的主要区别![]() SOLID 原则和 GRASP 原则之间存在一些主要区别。一些主要区别如下
结论总而言之,SOLID 和 GRASP 面向对象设计原则在不同层面上倡导先进的软件开发原则。SOLID 原则为所有原则提供了清晰的抽象:单一职责、开闭、里氏替换、接口隔离和依赖倒置。目标是通过类级别设计改进来创建更可维护、更灵活、更可扩展的系统,最大限度地减少方法和类依赖的复杂性,它过度强调了高内聚的某些方面。它还试图在不进行修改的情况下使代码可扩展。 另一方面,GRASP 原则处理面向对象设计中的责任分配。设计人员在实现其设计时,始终以低耦合和高内聚为目标。GRASP 原则的词汇,如信息专家、低耦合和高内聚,为系统中的每个实体定义了不同的角色,并确保更顺畅的协作,从而降低了维护成本。虽然 SOLID 原则优化类,但 GRASP 原则更多地用于构建系统的整体架构。这两种方法是互补的,共同构成了创建功能性面向对象系统的基础。 |
印度古典音乐是一个古老而庞大的传统,已有数百年历史。它包含各种音乐风格和形式,每种风格都有其独特的特征。印度古典音乐以其复杂的旋律、精妙的节奏和对即兴演奏的强调而闻名。印度斯坦尼音乐和……
11 分钟阅读
在本文中,我们将学习敏捷 (Agile) 和 DevOps 之间的区别,但首先让我们讨论一下敏捷和 DevOps 的含义。敏捷的含义是什么?敏捷是一种项目管理方法,有助于创建有效的软件。它以其适应性而闻名……
5 分钟阅读
引言:理解经济学中短期和长期的区别。这些术语是用于宏观经济还是微观经济环境,决定了它们的定义方式。短期和长期在微观经济中的区分也可以从几个角度来看。短期:在...
阅读 6 分钟
您可以使用本文深入比较进程、父进程和子进程。在比较进程、父进程和子进程之前,让我们先定义它们。什么是进程?进程是指正在执行的计算机程序的实例...
5 分钟阅读
在金融分析领域,每个决策都具有重大影响,确定公司的财务韧性至关重要。这项分析的核心是对公司偿还债务的能力进行审查。这项研究不仅仅是……
18 分钟阅读
介绍 校准和验证是两个经常互换使用的术语,但它们具有不同的含义和目的。在制造、医疗和技术等各个行业中,校准和验证在确保准确性、可靠性和安全性方面发挥着至关重要的作用。校准是指调整...的过程。
阅读9分钟
人们喜欢受到法规的约束,因为这些法规为他们在特定情况下应避免做什么提供了指导。规则是特定环境中的个人必须遵循的既定指南,因为违反规则将导致后果。如果一个组织有...
阅读 4 分钟
Redis Redis 是 Remote Dictionary Server 的缩写。它是一个开源的内存数据存储。它被广泛用作缓存、消息代理、数据库或搜索引擎。它在希望执行快速查询、高端缓存和高性能的开发人员中很受欢迎。它是...
阅读 10 分钟
虽然“预算赤字”和“财政赤字”经常被互换使用,但它们在经济学和公共财政领域实际上代表着不同的概念。了解它们之间的区别对于经济学家、官员和普通人至关重要。本次全面分析将探讨和定义这些概念……
阅读 12 分钟
论文定义 论文是一部全面的文学作品,强调作者的意识形态或观点。它以叙事格式书写,侧重于特定主题,并为作者提供论证。论文用于评估一个人的观点、理解...
阅读 8 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India