面向对象设计五个基本原则

简介: 只有聪明人才能看见的简介~( ̄▽ ̄~)~

开闭原则

里氏代换原则

依赖倒置原则

接口隔离原则

单一职责原则


开闭原则,在面向对象编程领域中,规定“软件中的对象,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的”,这意味着一个实体允许在不改变它的源代码的前提下变更它的行为。该特性在产品化的环境中是特别有价值的,在这种环境中,改变源代码需要代码审查单元测试以及诸如此类的用以确保产品使用质量的过程。遵循这种原则的代码在扩展时并不发生改变,因此无需上述的过程。

里氏代换原则(LSP)是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

依赖倒置原则(Dependence Inversion Principle)是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。面向过程的开发,上层调用下层,上层依赖于下层,当下层剧烈变动时上层也要跟着变动,这就会导致模块的复用性降低而且大大提高了开发的成本。面向对象的开发很好的解决了这个问题,一般情况下抽象的变化概率很小,让用户程序依赖于抽象,实现的细节也依赖于抽象。即使实现细节不断变动,只要抽象不变,客户程序就不需要变化。大大降低了客户程序与实现细节的耦合度。


接口隔离原则。使用多个专门的接口比使用单一的总接口要好。一个类对另外一个类的依赖性应当建立在最小的接口上。一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。如果强迫客户使用它们不使用的方法,那么这些客户就会面临由于这些不使用的方法的改变所带来的改变。


单一职责原则(SRP:Single Responsibility Principle)。它规定一个类应该只有一个发生变化的原因。该原则基于内聚性原则发展出。所谓职责是指类变化的原因。每一个职责都是变化的一个轴线,如果一个类有一个以上的职责,这些职责就耦合在了一起。一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当发生变化时,设计会遭受到意想不到的破坏。而如果想要避免这种现象的发生,就要尽可能的遵守单一职责原则。此原则的核心是高内聚低耦合

内聚性对一个模块内部各个组成元素之间相互结合的紧密程度的度量指标。模块中组成元素结合得越紧密,模块的内聚性就越高,模块的独立性也就越高。理想的内聚性要求模块的功能应明确、单一,即一个模块只做一件事情。高内聚性一般和许多理想的软件特性有关,包括鲁棒性、可靠度、可复用性及易懂性等特性,而低内聚性一般也代表不易维护、不易测试、不易复用以及难以理解。耦合性是和内聚性相对的概念。一般而言高内聚性代表低耦合性,反之亦然。

鲁棒是Robust的音译,也就是健壮和强壮的意思。鲁棒性(robustness)就是系统的健壮性。它是指一个程序中对可能导致程序崩溃的各种情况都充分考虑到,并且作相应的处理,在程序遇到异常情况时还能正常工作,而不至于死机。比如说,计算机软件在输入错误、磁盘故障、网络过载或有意攻击情况下,能否不死机、不崩溃,就是该软件的鲁棒性。相应的处理,例如输入检查、异常捕获与处理等等,这些要靠程序员的经验来完成。所谓“鲁棒性”,是指控制系统在一定的参数摄动下,维持某些性能的特性。

相关文章
|
存储 Java
【JVM】 程序计数器(Program Counter Register)
【JVM】 程序计数器(Program Counter Register)
430 1
|
存储 程序员 编译器
|
8月前
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
351 29
|
存储 JSON NoSQL
数据库- 动态属性策略
数据库- 动态属性策略
233 2
|
11月前
|
缓存 安全 Java
Java中 final、finally、finalize 有什么区别?
本文详细阐述了Java中`final`、`finally`和`finalize`的区别:`final`用于修饰类、方法和变量以表示不可变性;`finally`是用于确保在`try-catch`结构中无论是否发生异常都能执行的代码块;而`finalize`是`Object`类的方法,用于在对象被垃圾回收前执行清理工作,但在JDK 9中已被标记为弃用。
288 0
Java中 final、finally、finalize 有什么区别?
|
存储 Java C++
JVM内存模型和结构详解(五大模型图解)
JVM内存模型和结构详解(五大模型图解)
|
JSON 负载均衡 Java
SpringCloud Feign 远程调用(史上最详细讲解)
SpringCloud Feign 远程调用(史上最详细讲解)
13653 0
SpringCloud Feign 远程调用(史上最详细讲解)
|
SQL 监控 Java
Seata常见问题之报找不到全局事务可能已经完成如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集
2043 0
leetcode-2140:解决智力问题
leetcode-2140:解决智力问题
106 0