【0718作业】收集和整理面向对象的六大设计原则

面向对象的六大设计原则

(1)单一职责原则——SRP

(2)开闭原则——OCP

(3)里式替换原则——LSP

(4)依赖倒置原则——DIP

(5)接口隔离原则——ISP

(6)迪米特原则——LOD

——————————————————————————————

单一职责原则

一个类,只有一个引起它变化的原因,只有一个职责。

如果一个类承担的职责过多,就等于把这些职责耦合在一起了。一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当发生变化时,设计会遭受到意想不到的破坏。而如果想要避免这种现象的发生,就要尽可能的遵守单一职责原则。此原则的核心就是解耦和增强内聚性

 

(1)可以降低类的复杂度(2)提高类的可读性,和系统的维护性(3)当发生变化的时候,能将变化的影响降到最小,因为只会在这个类中做出修改。

 

开闭原则

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

当需求发生改变的时候,我们需要对代码进行修改,这个时候我们应该尽量去扩展原来的代码,而不是去修改原来的代码,用抽象去构建框架,用实现扩展细节。这样当发生修改的时候,我们就直接用抽象了派生一个具体类去实现修改。

 

里氏替换原则

在面向对象的程序设计中,里氏替换原则是对子类型的特别定义。“派生类(子类)对象可以在程式中代替其基类(超类)对象。”子类可以去扩展父类的功能,但是不能改变父类原有的功能。【里氏替换原则和开闭原则往往是相互依存的。】

 

1)子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法。

2)子类可以增加自己独有的方法。

3)当子类的方法重载父类的方法时候,方法的形参要比父类的方法的输入参数更加宽松。

4)当子类的方法实现父类的抽象方法时,方法的返回值要比父类更严格。

 

依赖倒置原则

是指一种特定的解耦(传统的依赖关系创建在高层次上,而具体的策略设置则应用在低层次的模块上)形式,使得高层次的模块不依赖于低层次的模块的实现细节,依赖关系被颠倒(反转),从而使得低层次模块依赖于高层次模块的需求抽象。高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。依赖于抽象,不要依赖于具体。

 

 接口隔离原则

客户端应该不依赖于它不使用的方法。使用多个隔离的接口,比使用单个接口要好。目的是系统解开耦合,从而容易重构,更改和重新部署。在面向对象设计中,接口(interface)提供了便于代码在概念上解释的抽象层,并创建了避免依赖的一个屏障。

建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少

 △接口隔离原则使用注意:

1)接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性是不挣的事实,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度。
2)为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。
3)提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。

 

迪米特原则

一个对象应该对其他对象保持最少的了解因为类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大,所以这也是我们提倡的软件编程的总的原则:低耦合,高内聚。一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类来说,无论逻辑多么复杂,都尽量地的将逻辑封装在类的内部,对外除了提供的public方法,不对外泄漏任何信息。

 

转载于:https://www.cnblogs.com/yanglanlan/p/11222995.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/392361.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据科学 python_适用于数据科学的Python vs(和)R

数据科学 pythonChoosing the right programming language when taking on a new project is perhaps one of the most daunting decisions programmers often make.在进行新项目时选择正确的编程语言可能是程序员经常做出的最艰巨的决定之一。 Python and R are no doubt amon…

如何进行有效的需求调研

一、什么是需求调研?需求调研对于一个应用软件开发来说,是一个系统开发的开始阶段,它的输出“软件需求分析报告”是设计阶段的输入,需求调研的质量对于一个应用软件来说,是一个极其重要的阶段,它的质量在一…

java中直角三角形第三条边,Java编程,根据输入三角形的三个边边长,程序能判断三角形类型为:等边、等腰、斜角、直角三角形,求代码...

private static Scanner sc;private static int edge[] new int[3];public static void main(String[] args) {System.out.println("请输入三角形的三条边");sc new Scanner(System.in);input();}public static void input() {int index 0;//数组下标while (sc.ha…

react中使用构建缓存_使用React和Netlify从头开始构建电子商务网站

react中使用构建缓存In this step-by-step, 6-hour tutorial from Coding Addict, you will learn to build an e-commerce site from scratch using React and create-react-app.在这个Coding Addict的分步,为时6小时的教程中,您将学习使用React和creat…

Django+Vue前后端分离项目的部署

部署静态文件: 静态文件有两种方式 1:通过django路由访问 2:通过nginx直接访问 方式1: 需要在根目录的URL文件中增加 url(r^$, TemplateView.as_view(template_name"index.html")),作为入口,在setting中更改…

leetcode 547. 省份数量(bfs)

有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。 省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。 给你一…

r怎么对两组数据统计检验_数据科学中最常用的统计检验是什么

r怎么对两组数据统计检验Business analytics and data science is a convergence of many fields of expertise. Professionals form multiple domains and educational backgrounds are joining the analytics industry in the pursuit of becoming data scientists.业务分析和…

win10专业版激活(cmd方式)

转载于:https://www.cnblogs.com/bug-baba/p/11225322.html

mit景观生成技术_永远不会再为工作感到不知所措:如何使用MIT技术

mit景观生成技术by Sihui Huang黄思慧 永远不会再为工作感到不知所措:如何使用MIT技术 (Never feel overwhelmed at work again: how to use the M.I.T. technique) Have you ever felt exhausted after a day at work? At the end of a busy day, you couldn’t …

leetcode 189. 旋转数组

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 示例 1: 输入: [1,2,3,4,5,6,7] 和 k 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转 1 步: [7,1,2,3,4,5,6] 向右旋转 2 步: [6,7,1,2,3,4,5] 向右旋转 3 步: [5,6,7,1,2,3,4] 代码 cla…

aws ec2 php,如何使用php aws sdk启动和停止ec2实例

以下是从定义的AMI启动计算机的基本示例:$image_id ami-3d4ff254; //Ubuntu 12.04$min 1; //the minimum number of instances to start$max 1; //the maximum number of instances to start$options array(SecurityGroupId > default, //replace with your …

python3 递归

递归调用:  在调用一个函数的过程中,直接或者简介调用了该函数本身 必须有一个明确的结束条件 递归特性:  1. 必须有一个明确的结束条件  2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少  3. 递归效率不高,…

深度学习概述_深度感测框架概述

深度学习概述I have found the DeepSense framework as one of the promising deep learning architectures for processing Time-Series sensing data. In this brief and intuitive overview, I’ll present the main ideas of the original paper titled “Deep Sense: A Un…

css响应式网格布局生成器_如何使用网格布局模块使用纯CSS创建响应表

css响应式网格布局生成器TL; DR (TL;DR) The most popular way to display a collection of similar data is to use tables, but HTML tables have the drawback of being difficult to make responsive.显示相似数据集合的最流行方法是使用表,但是HTML表具有难以响…

Axure注册码

适用版本 Axure 8.1.0.3377 zdfans.com gP5uuK2gHiIVO3YFZwoKyxAdHpXRGNnZWN8Obntqv7FF3pAz7dTu8B61ySxli 转载于:https://www.cnblogs.com/mengjianzhou/p/11226260.html

命令行窗口常用的一些小技巧

一. 打开命令行窗口的方式 1. 按住【shift】键,在桌面右击,选择“在此处打开命令行窗口(W)”,如下图所示: 2. 按住【开始】 R快捷键,弹出运行窗口,输入cmd,回车(确定)即可。 二. 常用…

php soapserver 参数,PHP SoapServer – 节点中的属性

PHP肥皂功能是如此疯狂,我从来没有发现它的错误.我试图通过SOAP API连接和更新数据到zimbra,并且有很多问题.所以我使用了SimpleXMLElement&卷曲:)在那里你可以像这样构建你的XML:$xml new SimpleXMLElement(); // create your base$xml $xml->addChild(ta…

leetcode 123. 买卖股票的最佳时机 III(dp)

给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 示例 1: 输入&…

为什么即使在班级均衡的情况下,准确度仍然令人困扰

Accuracy is a go-to metric because it’s highly interpretable and low-cost to evaluate. For this reason, accuracy — perhaps the most simple of machine learning metrics — is (rightfully) commonplace. However, it’s also true that many people are too comfo…

filebeat向kafka传输数据,无数据现象

通过netstat 能够看到filebeat确实是有向kafka传输数据, filebeat 日志显示 那就需要修改 /etc/hosts文件 将kafka主机的名字和ip写入filebeat主机的hosts文件中。 转载于:https://www.cnblogs.com/liuYGoo/p/11226272.html