面向过程 or 面向对象?一文搞懂!驾驭代码顶层设计!
Hi,大家好,我是晨曦
今天这期推文的主题来源于小伙伴的私信提问
A同学:曦曦,我看你在公众号上更新了python的相关知识,所以趁着过年这段时间,我也去学习了一些python的教程,但是其中有一块我不是很明白,一会教程里面说面向过程,一会又说面向对象,我对于这里实在不是很清楚,想请问曦曦有没有相关的教程可以学习?
晨曦:..........
那么既然小伙伴有不懂的地方,那么笔者自然就专门写了一份教程来给这位小伙伴,也希望各位有相同困惑的小伙伴可以从中得到灵感~
那么,我们开始吧
一、概念辨析
首先,我们需要区分两个概念:面向对象 and 面向过程
这两个概念在笔者看来代表着我们在python中编写代码的方式,举个例子,如果你要举办一场家宴,一种方式是全程都由你来掌管,买菜、洗菜、做饭、摆桌、倒酒等等,一种方式则是你给不同的人分配不同的任务,老婆去买菜、儿子去洗菜,老爸去摆桌等等
那么聪明的小伙伴肯定发现了,第一种方式的优点是非常的直观,直观到甚至很繁琐的地步,而且假设你这中间出现了什么其它情况,整个过程直接停摆,这就是面向过程,那么我们通过例子自然就可以总结出面向过程的优缺点:
那么第二种方式自然就是面向对象的思想,通过把不同的任务进行分工,然后整合起来,通过例子自然就可以总结出面向对象的优缺点:
a. 思想层面:
-- 更接近人类的思考方式,因为我们人本身思考的时候就喜欢一块块思考,并且天生具有把任务交给专人完成的本质
-- 代码条理较为清晰,方便维护
b. 技术层面:
-- 高复用:对重复的代码进行封装,提高开发效率。
-- 高扩展:增加新的功能,不修改以前的代码。
-- 高维护:代码可读性好,逻辑清晰,结构规整。
那么既然知道了面向对象和面向过程这两种代码书写逻辑,这个时候可能会有小伙伴来问,以后到底是使用面向过程还是面向对象?
答案当然是:混合使用了,虽然提倡面向对象,但是笔者在书写练习代码的时候,往往都是面向过程更加的简单一些,然后面向过程的代码编写完毕后,才会考虑是否可以把相似的功能进行整合,从而实现面向对象
二、实例对比
那么,下面我们通过代码来加深我们的理解:
#我们想要制作一个学籍管理系统
#用来储存学生的信息(姓名、性别、成绩)
#一般来说我们的程序架构为MCV,那么这里其实我们做的是C这一部分
#面向过程
list01 = []
iterator = 0
while True:
if int(input("请输入1进入学生信息")) == 1:
iterator += 1
name = input("请输入姓名:")
sex = input("请输入性别:")
grade = int(input("请输入成绩:"))
data = [iterator,name,sex,grade]
list01.append(data)
else:
break
print(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
def __generate(cls,stu):
stu.id = cls.init_id
cls.init_id += 1
def __init__(self):
self.__stu_list = []
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
#exercise
controller = 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出自己的理解和感悟,互相学习,共同进步
我是晨曦,我们下期再见~
微信扫码关注该文公众号作者