面向对象和面向过程_程序员给你解释:面向对象和面向过程的区别,到底是怎么回事?...

今天下午在一个组的项目回顾会议上,这个同事讲了自己用DDD思想对三个模块的重构。把之前在Service层的一些业务逻辑下沉到了领域层里,由之而引起的讨论。

部门经理:“其实你的业务逻辑总体并没有少,只是把边界重新划分了一下。”

一起参与开发的同事:“在第二个模块中(任务系统,包括了任务拆分,状态跟踪等)这种思想比较有优势,在一三项目中不是很明显。”

于是引出了我的一个问题:“到底什么是面向对象,什么是面向过程,在什么情况下适合面向对象,什么场景下适用于面向过程?”

11c5bcccd280b5756cf140a74e6ed1c8.png

以C语言和Java语言为例: C语言没有类,但是有结构体,结构体中不能有函数,只能有属性。这说明了什么?说明了在面向过程的思考方式中,数据和操作是严格分离的

C语言中为什么函数需要定义到调用此函数的前面,也就是说先声明后调用?如果按照流程化的思路来看这种设计方式,想要调用一个子流程,势必要在调用之前就定义好

而在java的类中,就没有函数定义先后的问题,这与面向过程和面向对象的最小定义粒度有关,面向过程的最小定义粒度为流程(方法、操作、函数),而在面向对象中,最小定义粒度为对象,这个对象的行为没有先后,包含在对象这个大的容器中。

封装、抽象、继承、多态其实就是类比的对象进行的建模,比如以人为例,人有些属性不想示人,有些属性只能给指定的人了解,这就是封装。人掌握的知识其实是现象的一种抽象。人继承来来自父母的一些生活习惯,而又有所不同,这就是多态。

归总,子类相对父类来说有不同的模型(对真实世界的建模),这是4种面向对象的终极原因。

为什么面向对象的思考方式更有利于扩展维护?拿一个工作岗位为例,一个人在一个工作岗位上,如果有一天这个岗位有了更多的工作要求,如果改动量较小,那么对该岗位的人进行技能培训就可以了。如果要求多到一种程度,拆分成两个人,或者拆分成多个岗位。而如果用面向过程的思路,那么每次改动,都相当于多了一个流程?(这里存疑,多流程的问题在哪?难维护的理由是什么?这里我没有想明白)

面向过程要求人有更好的流程化思维方式,面向对象要求人有更好的抽象思维方式。那么如果有一天出现一个“面向文档编程”呢?要求人有更好的把问题描述清楚的表达能力。换句话说,面向过程就是面向流程思考,面向对象就是针对模型思考

最后距离,如果我们描述入职流程,一个大牛的入职流程可能和一个应届生的入职流程完全不一样,如果把入职这个行为写到employee的方法中,那么这就是面向对象的写法,如果维护一个入职流程的方法,根据不同的人用switch

case的方式进行不同行为的跳转,那么就是面向过程。

db316e14fc1c3a6edc35543880115f49.png

面向过程就是面向流程思考,面向对象就是针对模型思考

作者丨博客园:weggi

想要在程序员生涯内有更高的成就的话,最最重要的是尽可能的提升自己的编程能力,并且,与其想着怎么去提升,不如从现在开始动手动脑,如果对于C/C++感兴趣的话,可以关注+私信小编【编程交流】有一些视频希望可以帮助到你,学习不怕从零开始,就怕从不开始。

377cf63c9240b689be705f5e223b178a.png

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

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

相关文章

Android Bug分析系列:第三方平台安装app启动后,home键回到桌面后点击app启动时会再次启动入口类bug的原因剖析...

前言 前些天,测试MM发现了一个比较奇怪的bug。 具体表现是: 1、将app包通过电脑QQ传送到手机QQ上面,点击安装,安装后选择打开app (此间的应用逻辑应该是要触发 【闪屏页Activity】, 然后跳转 【主页Activit…

SQL语言基础:SQL授权相关知识笔记​

1、数据控制数据控制是控制对用户存取的权力,由DBA来决定。DBMS数据控制与功能:1、通过GRANT和REVOKE将授权通知系统,并存入数据字典。2、当用户发起请求时,根据授权情况检查是否执行操作请求。SQL标准包括 delete、insert、selec…

JVM的位置

对于JVM的位置: JVM是运行在操作系统之上的,它与硬件没有直接的交互JVM是运行在操作系统之上的,与硬件没有直接的交互,但是可以调用底层的硬件,用JIN (Java本地接口调用底层硬件接口,了解下就好&#xff0…

word2010添加b5纸张大小_纸张幅面规格尺寸你了解吗?

点击蓝色文字关注|十七的锚|(单位:mm)关于印前调整若纸张规格标记字母的前面加一个字母R(或S)时,是表示纸张没有切毛边,经过切边修整后,将减少到标准尺寸,例如RA4(或SA4)表示不切边纸张的尺寸为240mm*330mm&#xff0c…

future promise java_第四章 Future和Promise

Netty是一个异步网络处理框架,在实现中大量使用了Future机制,并在Java自带Future的基础上,增加了Promise机制。这两者的目的都是使异步编程更加方便使用。在阅读源码之前,我们需要对Future的机制有很清楚的认识。## 4.1 异步编程模…

在页面最上面显示当前登陆的状态

首先先判断一下session <li> <?php if(session(m_id)) : ?> 您好, <?php echo session(m_username); ?>[<a href"<?php echo U(Member/logout) ; ?>">退出</a>] <?php else : ?> 您好&#xff0c;欢迎来到京西&a…

python入门之运算符的使用的答案_python入门教程之基本算术运算符

一、算术运算符运算符-*/%**(幂)求次方//(取整除&#xff0c;向下取整)如&#xff1a;9//2 4二、比较运算符运算符!<>(不等于&#xff0c;类似&#xff01;)<>><#举例说明&#xff1a;x 10y 20print(x > y) # Falseprint(x < y) # Trueprint(x > …

JVM体系结构

JVM体系结构 Java虚拟机主要分为五大模块&#xff1a; 类装载器子系统运行时数据区执行引擎本地方法接口垃圾收集模块1、JVM一共分为五个区&#xff0c;分别为方法区、堆、Java栈、本地方法栈、程序计 2、方法区、堆为线程共享区域&#xff0c;GC会对二个区进行垃圾回收&…

找数据?这几个数据源网站就够用了?

来源&#xff1a;经管学苑转自&#xff1a;经管学苑大家好&#xff0c;我是小z在这个用数据说话的时代&#xff0c;能够打动人的往往是用数据说话的理性分析&#xff0c;无论是对于混迹职场的小年轻&#xff0c;还是需要数据进行分析和研究的同学&#xff0c;能够找到合适的数据…

solaris11-text-安装GUI(gnome)

http://blog.chinaunix.net/xmlrpc.php?rblog/article&uid45057&id3018467 1.下载所需的资源Text Installer CDRepository Image(a,b)http://www.oracle.com/technetwork/server-storage/solaris11/downloads/index.html2.用text CD安装solaris11安装那是相当的快呀&a…

java replaceall 大小写_Java replaceAll不区分大小写

Java 中replaceAll如何忽略大小写呢?方式一:在正则表达式前面添加(?i)Testpublic void test_replaceAll33(){String input "I like Java,jAva is very easy and jaVa is so popular.";String replacement"cccc";System.out.println(input);System.out.p…

jdk环境变量配置_jmeter及jdk的环境变量配置

jmeter是apache公司基于java开发的一款开源压力测试工具&#xff0c;其内部原理都是源于java的运行&#xff0c;并支持多种外部插件用于接口及性能测试&#xff0c;最主要的还是开源免费&#xff0c;在安装jmeter前必须配置jdk环境。jdk下载地址&#xff1a;https://www.oracle…

jvm是运行在操作系统之上的,他和硬件没有直接的交互

jvm是运行在操作系统之上的&#xff0c;他和硬件没有直接的交互

SQL语言基础:触发器相关知识介绍​

1、触发器 Trigger介绍触发器可以实现完整性规则和保证一些复杂业务规则的实施。针对示警或满足特定 条件下自动执行某项任务来说&#xff0c;触发器是十分有用的机制。触发器是由事件1驱动的特殊过程&#xff0c;一旦由某个用户定义&#xff0c;任何用户对该触发器指定的数据新…

socket与socketServer通信

服务端代码&#xff1a; public class TalkServer {public static void main(String args[]){try {//创建服务器&#xff0c;开放7777端口ServerSocket server new ServerSocket(7777);while(true){Socket socket server.accept();System.out.println("客户端与服务端已…

java struts2值栈ognl_Struts2的值栈和OGNL牛逼啊

Struts2的值栈和OGNL牛逼啊一 值栈简介&#xff1a;值栈是对应每个请求对象的一套内存数据的封装&#xff0c;Struts2会给每个请求创建一个新的值栈&#xff0c;值栈能够线程安全的为每个请求提供公共的数据存取服务。二 OGNL介绍&#xff1a;(1)基本数据&#xff1a;OGNL 是对…

还在用 Notepad++吗? 盘点五款更好用的文本编辑器

来自&#xff1a;oschina.net/news/110987/no-notepad-plus-plus | 责编&#xff1a;乐乐正文 Notepad 一直饱受争议&#xff0c;2018年开始然后引发了大家的关注&#xff0c;这里师长作为技术媒体&#xff0c;不方便带啥节奏&#xff0c;具体事件内容请大家自行百度。其实作…

python3列表_Python3 列表List(十一)

list是一种有序可重复的集合&#xff0c;可以随时添加和删除其中的元素。序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置&#xff0c;或索引&#xff0c;第一个索引是0&#xff0c;第二个索引是1&#xff0c;依此类推。Python有6个序列的内置类型…

ubuntu14.04 boost动态库找不到 libboost_system.so.1.58.0

error while loading shared libraries: : cannot open shared object file: No such file or directory 解决办法&#xff1a;向ld.so.conf文件中添加libboost_system.so.1.58.0所在的目录路径sudo vim /etc/ld.so.conf sudo ldconfig http://blog.csdn.net/smallfish0315/ar…

SQL语言:嵌入式SQL知识笔记

1、概念SQL提供了将SQL语句嵌入到某种高级语言中的使用方式&#xff0c;通常采用预编译的方法将SQL语句嵌入高级语言中。采用的方法由DBMS的预处理程序对源程序进行扫码、识别出SQL语句&#xff0c;把它们转换为主语言调用语句&#xff0c;这样可以让主语言编译程序能识别它&am…