Redian新闻
>
面向过程 or 面向对象?一文搞懂!驾驭代码顶层设计!

面向过程 or 面向对象?一文搞懂!驾驭代码顶层设计!

公众号新闻

Hi,大家好,我是晨曦

今天这期推文的主题来源于小伙伴的私信提问

A同学:曦曦,我看你在公众号上更新了python的相关知识,所以趁着过年这段时间,我也去学习了一些python的教程,但是其中有一块我不是很明白,一会教程里面说面向过程,一会又说面向对象,我对于这里实在不是很清楚,想请问曦曦有没有相关的教程可以学习?

晨曦:..........

那么既然小伙伴有不懂的地方,那么笔者自然就专门写了一份教程来给这位小伙伴,也希望各位有相同困惑的小伙伴可以从中得到灵感~

那么,我们开始吧

一、概念辨析

首先,我们需要区分两个概念:面向对象 and 面向过程

这两个概念在笔者看来代表着我们在python中编写代码的方式,举个例子,如果你要举办一场家宴,一种方式是全程都由你来掌管,买菜、洗菜、做饭、摆桌、倒酒等等,一种方式则是你给不同的人分配不同的任务,老婆去买菜、儿子去洗菜,老爸去摆桌等等

那么聪明的小伙伴肯定发现了,第一种方式的优点是非常的直观,直观到甚至很繁琐的地步,而且假设你这中间出现了什么其它情况,整个过程直接停摆,这就是面向过程,那么我们通过例子自然就可以总结出面向过程的优缺点:

那么第二种方式自然就是面向对象的思想,通过把不同的任务进行分工,然后整合起来,通过例子自然就可以总结出面向对象的优缺点:

a. 思想层面:

-- 更接近人类的思考方式,因为我们人本身思考的时候就喜欢一块块思考,并且天生具有把任务交给专人完成的本质

-- 代码条理较为清晰,方便维护

b. 技术层面:

-- 高复用:对重复的代码进行封装,提高开发效率

-- 高扩展:增加新的功能,不修改以前的代码。

-- 高维护:代码可读性好,逻辑清晰,结构规整。

那么既然知道了面向对象和面向过程这两种代码书写逻辑,这个时候可能会有小伙伴来问,以后到底是使用面向过程还是面向对象?



答案当然是:混合使用了,虽然提倡面向对象,但是笔者在书写练习代码的时候,往往都是面向过程更加的简单一些,然后面向过程的代码编写完毕后,才会考虑是否可以把相似的功能进行整合,从而实现面向对象


二、实例对比

那么,下面我们通过代码来加深我们的理解:

#我们想要制作一个学籍管理系统#用来储存学生的信息(姓名、性别、成绩)#一般来说我们的程序架构为MCV,那么这里其实我们做的是C这一部分#面向过程list01 = []iterator = 0while True:    if int(input("请输入1进入学生信息")) == 1:        iterator += 1        name = input("请输入姓名:")        sex = input("请输入性别:")        grade = int(input("请输入成绩:"))        data = [iterator,name,sex,grade]        list01.append(data)    else:        breakprint(list01)#查看结果for i in list01:#输出编号为2的同学信息    if i[0] == 2:        print(i)

上述的流程其实就是一个简单的面向过程的逻辑,因为笔者这里考虑了每一个步骤需要完成的事情,一步步顺利的写了下来,但是代码仍然存在一定问题,比如说并不能判断你输入的是否正确,以及查看起来并不是很方便等等

然后接下来我们来看看面向对象的逻辑应该如何书写:

#首先我们想要构建一个学生管理系统,我们需要考虑很多,但是参考比较普遍的一个架构,即MCV架构,我们只需要考虑三个方面#M——模型,这个模型定义了我们输入数据的类型即我们都需要输入什么样的数据#C——控制,即定义了我们输入的数据需要执行什么样的逻辑计算#V——显示,即我们的输入数据经过逻辑计算后以什么样的方式进行展示#可以很清楚的看到,每一个类的功能单一,类之间产生合作,这个就是面向对象的一个简单逻辑#笔者在参加课程学习的时候,老师曾经说过,面向对象其实总结起来就是封装、继承、多态(分而治之,变则疏之,高内聚,低耦合)
class StudentModel: """ 学生模型类:定义学生输入数据 """ def __init__(self,name,sex,grade): self.name = name self.sex = sex self.grade = grade
class StudentController: """ 学生管理类:定义输入数据的操作 """ init_id = 1000
@classmethod def __generate(cls,stu): stu.id = cls.init_id cls.init_id += 1
def __init__(self): self.__stu_list = []
@property def stu_list(self): return self.__stu_list #def stu_list(self): #区别在于你后续是使用方法还是使用属性 # return self.__stu_list
def add_student(self,stu): StudentController.__generate(stu) self.__stu_list.append(stu)
def remove_student(self,stu_id): for item in self.__stu_list: if item.id == stu_id: self.__stu_list.remove(item) return True return False
def updata_student(self,new_stu): for item in self.__stu_list: if item.id == new_stu.id: item.name = new_stu.name item.sex = new_stu.sex item.grade = new_stu.grade return True return False#exercisecontroller = StudentController()data01 = StudentModel("张三","男",94)data02 = StudentModel("李四","女",90)controller.add_student(data01)controller.add_student(data02)for item in controller.stu_list: print(item.__dict__)

各位小伙伴可以很清楚的看到,我们通过定义了数据类,来告诉我们后续使用学生管理系统的人:你只能输入这些数据,通过定义数据操作类,我们把对数据的添加、更新和删除都囊括在了一起。

这样方便之处在于代码的高度复用以及我们如果后续想要添加学生管理系统的功能,我们可以直接修改对应的类即可;

当然我们上述的流程仍然存在着瑕疵,就是我们不应该在数据操作类中输入数据,而是应该有一个专门的类,也就是数据显示类来通过调用数据操作类来完成数据的输入,那么下面我们把代码补全

class StudentView:    """    学生管理系统显示器    """    def __init__(self):        self.__controller = StudentController()
def __display_menu(self): print("1)添加学生信息") print("2)显示学生信息") print("3)删除学生信息")
def __select_menu(self): item = int(input("请输入选项:")) if item == 1: self.__input_student() elif item == 2: self.__output_student() elif item == 3: self.__delete_student() def main(self): while True: self.__display_menu() self.__select_menu()
def __input_student(self): name = input("请输入学生姓名:") sex = input("请输入学生性别:") grade = input("请输入学生成绩:") stu = StudentModel(name,sex,grade) self.__controller.add_student(stu)
def __output_student(self): for item in self.__controller.stu_list: print("学生编号:%d,学生姓名:%s,性别:%s,成绩:%s" % (item.id,item.name,item.sex,item.grade))
def __delete_student(self): stu_id = int(input("请输入编号:")) if self.__controller.remove_student(stu_id): print("删除成功") else: print("删除失败")
view = StudentView()view.main()

就这样,我们构建了一个数据的输入界面,通过上述的代码示例,我们就应该理解了面向对象和面向过程,简单来说,其实这两种就是编写代码的一种风格,



如果我们想要面面俱到,那么就是面向过程,如果我们想要把相似的功能汇总,功能与功能之间进行调用,那么就是面向对象,这两种没有孰优孰劣,我们只需要在恰当的方式选择合适的风格即可



那么到这里,我们就了解了面向过程和面向对象的区别与联系

笔者学到这里,感觉这个是一个python中比较重要的概念,正好有小伙伴私信问我,所以也是把自己的感悟写了出来

也欢迎大家在评论区po出自己的理解和感悟,互相学习,共同进步

我是晨曦,我们下期再见~


END

撰文丨晨   曦
排版丨三叶虫
编辑丨三叶虫

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
【提示】电子社保卡有什么用?怎么领?一图看懂!刚刚!加国2023预算案出炉!吐血整理一文看懂!这几件事不得不知!两名华男吵架,一人突然拔凶器向对方心脏猛刺!县城体制内女孩,找不到对象?近期防疫政策调整会对经济走势带来什么影响? 官方回应!发改委:扎实推进共同富裕顶层设计,大力促进消费提质升级!在校与老师发生口角,美6岁学童竟然向对方开枪...再接再厉吃火鸡一文轻松图解搞懂Elasticsearch原理!马云为什么选择今天回国?!一文读懂!面向对象就像...【广发策略】能源电子产业顶层设计出炉—新兴产业景气扫描(1月第3期)能驾驭情绪,才能驾驭自己的人生数字中国重磅文件出炉 李晓东:数字化迎来顶层设计框架【十大券商一周策略】部分方向过热!行情演绎仍有支撑,短暂降温提供增配良机今日神图|怎样在拍照时假装有对象?没有保质期的食物能放多久?一文搞清不同食物存储时间澳洲BIS、BA专业!求职、工作、移民前景一文看懂!第二次徒步圣路,750公里葡萄牙之路+英国之路:D11~若有所思数字中国顶层设计来了,一图读懂“2522”框架|政策解读一文看懂!2023 税收优惠政策重大变化事关所有人的钱袋子!加拿大刚刚定了2023大事!吐血整理一文看懂!华人注意!新西兰每年有10万人因此受伤!如何获得免费理赔?一文带你搞懂ACC保险!国务院机构怎么改?一文看懂!希腊移民为何持续 “C” 位不倒?背后原因一文搞懂!军旅故事原创系列(9)上学为什么千万不要找亲戚帮忙介绍对象?在逃!危险!两名华男吵架,一人突然拔凶器向对方心脏猛刺60岁在岗猝死不算工亡,叩问老年人就业环境的顶层设计时光倒流,缅怀老友(圖)“乙类乙管”具体怎么管?一图读懂!银装素裹也妖娆 - 凑个热闹游民坐店门口影响生意,店主求助警方20余次无果后向对方喷水遭谴责“数据二十条”顶层设计出炉,“三权分置”破解数据确权难题韩国地铁“防变态设计”火了!座椅变成“背靠背”,引全网争论!网友:并不认为这是个好设计!如何在抖音电商实现生意增长?一文搞懂巨量千川的基本盘与核心能力
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。