面向-对象的三大原则

面向-对象的三大原则

  • 一、介绍
  • 二、面向-对象
  • 三、三大原则
    • 1.单一职责原则:
    • 2.开放-封闭原则
    • 3.依赖倒转原则
  • 总结:

一、介绍

最近看了一篇关于面向对-象的原则的文章,感觉有所收获,然后我把这几个原则总结一下,希望能提升自身的代码水平和设计代码的水平。

二、面向-对象

这里简单提一下,对于刚刚接触代码的人来说可能不太理解面向-对象,如果还不太明白抽象、继承、多态、封装的可以去看一下我之前的文章
简单工厂设计模式

这里还是要提一下,如果你是一个开发小白还是多去学习一下面向-对象和设计模式,把C#的编码规范化,能为你后期的维护和添加新需求更改需求节约不少时间。

三、三大原则

1.单一职责原则:

这里先直接将变成原理,因为刚开始开发的可能不能白我在说什么,这里举一个简单的例子模拟一下单一职责原则是什么意思:
大家应该都用过手机,手机的功能是不是很多,比如拍照、打电话、手电筒、视频等功能,单独拿出来拍照的功能我们去跟尼康的单反去做一下对比,大家应该心里很清楚到底哪一个拍出来的照片质量会更好吧。
但是不可排除的是手机确实方便,功能比较多,但是不会太专注于做某一块的品质。

例子说完了,针对编程思维这一块,单一职责原则:就一个类而言,应该仅有一个引起它变化的原因,我在开始编程的时候经常的会在一个类中添加各种各样的功能,比如之前公司需求我给公司开发了一个Window版的查字软件,开始的时候我把算法和数据库访问的代码都放在了一个类,这只是我所谓的方便,却没有考虑到后期维护不方便,而且耦合度高,所以后来在重构的时候我也是花了不少时间,重新读了一遍代码,把逻辑都拆分出来,道理来讲的编程应该是高内聚,低耦合

现在让你开发一个WinForm的方块游戏,你会怎么开发?会怎么设计你的程序?
首先我们需要把代码划分一下类,首先我们按照业务逻辑划分分为两层,一个是界面显示层单独一个类,另一个是操作类单独一个类,然后在Form这个类中调用即可。

这里一个类承担的职责过多,就等于把这些职责耦合到了一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当发生变化时,设计会造成意想不到的破坏。

这时候我们在看,如果按照刚才说的进行设计,我们在开发Android或者ios平台的方块游戏时,我们是不是可以直接将业务逻辑层直接拿过来用,因为方块游戏的逻辑都是样的,这时候只有显示层是不同的,这就让我们的代码进行了重复利用,而且单一职责原则还让我们的代码极大的降低了耦合度。

这里在把手机的例子拿过来,手机的发展是有它的特点的,毕竟他们要考虑的因素很多,体积大小,流畅度、功能扩展、系统的升级等问题,然而编程时,我们需要在类的职责分离上多思考,做到单一职责,这样你的代码才能容易维护,易扩展、易复用、灵活多样。


2.开放-封闭原则

讲这个原则之前呢,同样我也举个例子方便大家理解,例子只是用来方便理解编程,不太有攻击性,如有恶意我会删除本文。

大家历史应该都学过邓小平这位伟大的思想政治家,收回香港澳门的知识吧,它这一创造性的**“一国两制”**想法有什么独到之处呢?
换句话说如果当时不采取这个制度,而是直接再用国内的制度方式来处理香港澳门的话,那么是不是就不会成功的收回,这里只是个人的猜想。

然而他这个创造性的提议在编程里面也是有映射的,就是我要提到的开放-封闭原则:这种不能修改,但是可以扩展的思想就是这种原则。是说软件实体(类、模块、函数等等)应该是可以扩展的,但是不可修改。换句话说就是,对扩展开发,对修改封闭。

我们在做任何系统的时候都不要指望一开始时需求确定,就不在变化,这个是不显示的想法,而且需求这种事情我们无法去明确,所以我们需要采用一种方便修改的办法来进行设计,而不是当新需求来了我们要推到之前的逻辑重新去写,所以接下来我们应该思考一个问题,怎么的设计才能面对需求的改变却可以保持相对稳定,从而使得系统可以在第一个版本以后不断推出新的版本呢?

就比如我们每天的工作时间大约在8小时是老板的需求,甚至8小时也不是目的只是一种约束,主要的目的是完成业绩和超额完成业绩,于是改变了方式,比如弹性工作,早到早下班,晚到晚下班。对于市场部门的也是这样他们的时间更是不固定,这其实就是对工作时间的封闭,而对时间制度的开放。

做开发时间久的人来说都明白,无论模块是多么的封闭,都会存在一些无法对之封闭的变化,设计人员必须对他设计的模块应该对哪种变化封闭做出选择。必须先猜测出最有可能的变化种类,然后构造抽象来隔离那些变化。在我们最初编写代码时,假设变化不会发生。当变化发生时,我们就创建抽象类来隔离以后发生的同类变化。面对需求,对程序的改动时通过新增代码进行的,而不是更改现有代码。这就是开放-封闭原则的精髓所在。
就比如我上完提到的工厂设计模式一文中的讲解,我们把运算 + - * / 都作为一个类,继承抽象类实现他的一个方法,在每一个具体的类中写算法。这样以后如果出现开平方的运算或者其他运算,只需要增加一个新的类即可。

3.依赖倒转原则

这里我们拿两个硬件来说一下依赖倒转原则,一个是PC电脑,一个是收音机。

玩过电脑组装的人可能都知道,PC电脑出现问题大部分可能是主板以外的硬件,比如内存条、显卡、硬盘灯的损坏,然而收音机一般坏了就是需要整体的检查,不能像电脑一样方便找出问题,所以这里其实也是用到了编程的原则,这里PC电脑我们通常说易插拔,面向-对象里就是高内聚,低耦合,方便维护和扩展。

这也就是为什么一般显卡制造家AMD和Intel的针脚都是一样的,而不是每家都采用不同的针脚连接电脑。这里仔细想想内存条插槽的扩充是不是用到了开放-封闭原则

**依赖倒转原则:抽象不应该依赖细节,而细节应该依赖于抽象。说白了就是针对接口编程,而不是对实现编程。**无论是主板、CPU、内存、硬盘都是在针对接口设计,如果针对实现来设计,内存就要对应到具体的某个商家的主板,那么就会出现换内存需要把主板也换掉的尴尬局面。
A.高层模块不应该依赖底层模块。两个都应该依赖抽象。
B.抽象不应该依赖细节。细节应该依赖抽象。

这里可能有人对倒转这个概念不理解,我们在做项目的时候是不是会经常把一些通用的类封装起来,或者说我们调用数据库的时候如果不采用抽象类的方式去统一实现,我们只是封装了一个工具类,那么这个时候新需求来了,让我们换一个数据库,这就意味着我们方法也要重构,但是我们代码里调用了很多这个方法,你要一一去修改,然后需求又来了,让你登录的时候用这个数据库,初始化数据的时候用另一个数据库,你是不是要疯了?
所以说巧妙的运用抽象类,如果我们一开始的构架就是用抽象类写的,实现方式也是调用同一个抽象类方法,新需求来了调用两个数据库,那么是不是就不需要修改之前调用的方法了,只需要添加另一个调用数据库的类即可。所以这里我们需要倒转去针对接口去实现,而不是针对实现去实现。

所以这时候在去分析一下收音机,采用的不是针对接口的设计。


总结:

这篇文章全是概念知识,对于开发小白来说可能不太好理解,不过希望还是可以认真看完总会有所收获。

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

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

相关文章

nginx+lua+redis实践

nginxluaredis实践 1.概述 nginx、lua访问redis的三种方式: HttpRedis模块。 指令少,功能单一,适合简单的缓存。只支持get 、select命令。 HttpRedis2Module模块。 功能强大,比较灵活。 lua-resty-redis库 OpenResty。api…

史上最详细的JAVA学生信息管理系统(MySQL实现)

一、项目介绍 为了巩固Java的学习写了一个基于MVC设计模式的学生管理系统。 简单介绍一下MVC设计模式: 1、M也就是Model 模型层(也叫数据层)主要是通过这个类来进行数据的操作。 2、V是Views 视图层,主要就是来显示页面信息。 3、…

开发辅助一(网关gateway+ThreadLocal封装用户信息+远程调用+读取配置文件+统一异常处理)

网关gateway模块 ①、配置文件,添加各个服务模块的路由路径 gateway:routes:-id: server-cart #微服务名称uri: lb://service-cart #负责均衡predicates:- Path/api/order/cart/**ThreadLocal ①、定义一个工具类 public class AuthContextUtil{private static…

新奇性搜索(Novelty Search,NS)

新奇性搜索(Novelty Search,NS)是一种基于进化算法的搜索优化方法,它通过追求新颖性来引导进化过程,而不是仅仅追求目标函数的优化。这种方法的灵感来自于自然进化中的创新和多样性。通过发现新的行为模式,…

【Redis】缓存预热

目录 常见缓存Redis客户端设计缓存key缓存预热 常见缓存 ● Redis(分布式缓存) ● memcached(分布式) ● Etcd(云原生架构的一个分布式存储,存储配置,扩容能力) ● ehcache&#xf…

Facebook自动回复脚本编写教程

在数字时代,社交媒体已经成为人们交流和建立联系的重要渠道,Facebook作为全球最大的社交媒体平台之一,拥有数十亿的用户,为企业和个人提供了无限的社交可能性。 然而,对于企业和个人来说,在Facebook上保持…

脱壳后多dex文件合并进apk反编译

我们遇到加固后的apk,在脱壳后有很多dex文件,有时候我们只反编译有关键代码的dex会存在一些上下文代码找不到的情况,这时候我们需要多dex一起反编译,并且需要同步看看资源文件怎么办?: 我们可以把多dex塞回…

华为eNSP入门实验,Vlan配置,路由配置,用户模式,链路聚合

文章目录 一、同一交换机下的PC通信二、不交换机下的PC通信三、配置静态路由通信四、路由器rip协议配置五、路由器ospf协议配置六、单臂路由七、通过三层交换机使不同的Vlan能连通八、设备consolo密码模式九、设备consolo用户密码模式(AAA模式)十、Telne…

Centos7中KeepAlivedNginx高可用

Centos7中KeepAlived&Nginx高可用 一.部署前规划 角色操作系统IPmasterCentos7.8192.168.56.101backupCentos7.8192.168.56.102 二.keepalived安装 在两台机器上执行安装 yum install -y keepalived三.master角色配置(192.168.56.101) /etc/kee…

虚拟机服务器中了lockbit2.0/3.0勒索病毒怎么处理,数据恢复应对步骤

网络技术的不断发展也为网络威胁带来了安全隐患,近期,对于许多大型企业来说,许多企业的虚拟机服务器系统遭到了lockbit2.0/3.0勒索病毒攻击,导致企业所有计算机系统瘫痪,无法正常工作,严重影响了企业的正常…

Python能做大项目(6)Poetry -- 项目管理的诗和远方之一

[Poetry] 是一个依赖管理和打包工具。Poetry 的作者解释开发 Poetry 的初衷时说: 通过前面的案例,我们已经提出了一些问题。但不止于此。 当您将依赖加入到 requirements.txt 时,没有人帮你确定它是否与既存的依赖能够和平共处,这…

电脑监控软件排行榜(电脑监控软件隐藏安装)

在当今数字化时代,电脑已经成为我们工作、学习和生活中不可或缺的工具。然而,随着电脑使用的普及,电脑监控软件也逐渐浮出水面。这类软件可以对电脑进行全方位的监控和管理,保护电脑安全、提高工作效率。 本文将为您介绍电脑监控…

Unity is running with Administrator privileges, which is not supported

Unity is running with Administrator privileges, which is not supported 如果还是弹出CMD窗口提示输入密码,但无法怎样都无法输入,请关闭窗口,然后右键快捷方式管理员运行一次。 ----------分割线---------- 为什么这样做? 很…

【译文】IEEE白皮书 6G 太赫兹技术的基本原理 2023版

第一章 简介 太赫兹波是介于微波和光波之间的光谱区域,频率从 0.1THz ~ 10THz 之间,波长在 3mm ~ 30μm 之间。提供大块连续的频带范围以满足对 Tbit/s 内极高数据传输速率的需求,使该区域成为下一代无线通信(6G)的重…

数字化时代的探索:学生为何对数据可视化趋之若鹜?

随着信息时代的迅猛发展,数据已经成为我们生活中不可或缺的一部分。而在这个数字化浪潮中,越来越多的学生开始关注数据可视化,这并非偶然。下面,我就从可视化从业者的角度出发,简单聊聊为什么越来越多的学生开始关注数…

在离线环境下也能展示地理空间数据?快来收下这份操作文档

《四维轻云-离线版》是一款操作简单、支持离线展示及编辑的地理空间数据离线管理平台。在《四维轻云-离线版》中,用户可以展示及编辑倾斜模型(.osgb)、激光点云(.las)、正射影像(dom)、数字高程模型(dem)、矢量数据(shp)、人工模型(.obj、.dae、.fbx&…

Midjourney V6 引爆社交媒体,AI图像与照片的差别消失;LangChain的2023AI发展状况总结

🦉 AI新闻 🚀 Midjourney V6 引爆社交媒体,AI图像与照片的差别消失 摘要:Midjourney V6 第二次社区评价震惊网友,神图细节逼真,光影效果逆天,皮肤质感细腻,已超越昨日版本。V6即将…

轻松祛除烦人水印:三款简单易用的图片去水印工具介绍

在图像编辑中,去除水印是一项常见但又相对复杂的任务。图片水印往往成为图像处理和美化过程中的障碍。为了帮助你应对这个问题,下面介绍四款简单易用、效果显著的图片去水印工具。 图片去水印工具一:水印云 工具简介:水印云是一款…

181.【2023年华为OD机试真题(C卷)】查找接口成功率最优时间段(深度优先搜索(DFS)实现JavaPythonC++JS)

请到本专栏顶置查阅最新的华为OD机试宝典 点击跳转到本专栏-算法之翼:华为OD机试 🚀你的旅程将在这里启航!本专栏所有题目均包含优质解题思路,高质量解题代码,详细代码讲解,助你深入学习,深度掌握! 文章目录 【2023年华为OD机试真题(C卷)】查找接口成功率最优时…

高性能内存队列Disruptor入门和实战

目录 Disruptor简介 Disruptor的设计方案 RingBuffer数据结构 一个生产者单线程写数据的流程 多个生产者写数据的流程 消费者读数据 多个生产者写数据 Disruptor核心概念 Disruptor的使用 单生产者单消费者模式 单生产者多消费者模式 多生产者多消费者模式 消费者…