一、面向对象与面向过程
(一)面向过程
首先认识什么是面向过程,面向过程就是面向解决问题的过程进行编程,仔细思考一下,我们在学习和工作中,当我们去实现某项功能或者某项任务时,是不是会不自觉的按部就班的罗列出我们要做的事情?(如果没有,建议以后试着步骤化解决问题)。而当我们按着我们罗列的步骤去解决问题时,实质上就是按照面向过程的思想去解决问题。我们罗列的步骤就是过程,按照步骤解决问题就是面向过程。
传统的面向过程的编程思想总结起来就八个字------自顶而下,逐步细化!实现步骤如下:
1.将要实现的功能描述为一个从开始到结束按部就班的连续的步骤(过程)
2.依次做不完成这些步骤,如果某一步的难度较大,又可以将该步骤再次细化若干个子步骤,以此类推,一直到结束得到想要的结果
3.程序的主体是函数,一个函数就是一个封装起来的模块,可以实现一定的功能,各个子步骤往往就是通过各个函数来完成的,从而实现代码的重用和模块化编程!
案例:学生到校报到注册
面向过程的流程图:
面向过程,就是按照我们分析好的步骤,按部就班的依次执行就行了!所以当我们用面向过程的思想去编程或解决问题时,首先一定要把详细的实现过程弄清楚。一旦过程设计清楚,代码的实现简直轻而易举。
(二)面向对象
所谓的面向对象,就是在编程的时候尽可能的去模拟真实的现实世界,按照现实世界中的逻辑去处理一个问题,分析问题中参与其中的有哪一些实体,这些实体应该有什么属性和方法,我们如何通过调用这些实体的属性和方法去解决问题。
现实世界中,任何一个操作或者是业务逻辑的实现都需要一个实体来完成,也就是说,实体就是动作的支配者,没有实体,就肯定没有动作发生!
现在我们思考下,上述注册报名的每一个步骤都有哪一些动词?
提出 提供 缴 收 获得 分配 增加
有动词就一定有实现这个动作的实体
所谓的模拟现实世界,就是使计算机的编程语言在解决相关业务逻辑的方式,与真实的业务逻辑的发生保持一致!需要使每一个动作的背后都一个完成这个动作的实体!
因为任何功能的实现都是依赖于一个具体的实体的“动作|操作|行动”,可以看作一个又一个的实体在发挥其各自的能力并在内部进行协调有序的调用过程!
当采用面向对象的思想解决问题时,可以分为下面几步:
1.分析哪些动作是由哪些实体发出的;
2.定义这些实体,为其增加相应的属性和功能;
3.让实体去执行相应的功能或者动作
采用面向对象的思想,解决上面的报名问题,应该如下:
第一步:分析哪些动作是由哪些实体发出
(1)学生提出报名
(2)学生缴费
(3)机构收费
(4)教师分配教师
(5)班级增加学生信息
于是在整个过程中,一共有四个实体:学生、机构、教师、班级!
在现实的一个具体的实体,就是计算机编程中的对象!
第二步:定义这些实体,为其增加相应的属性和功能
属性就是实体在现实世界中的一些特征表现。如:
(1)人的属性:姓名、性别、身高、三围、体重、电话号码、家庭住址、籍贯等
(2)手机的属性:品牌、价格、颜色、尺寸、待机时间等
功能就是能完成的动作,在面向对象的术语中,动作就叫方法或者函数。如:
(1)人的动作(功能):吃饭、睡觉、学习、打游戏、走路、跑步、缴费!
(2)手机的动作(功能):打电话、发短信、拍照、打游戏、视频、看电影等
下图显示了在上述实例中出现的实体以及相应的属性和功能:
第三步:让实体去执行相应的功能或动作
(1)学生提出缴费
(2)学生缴费
(3)学校收费
(4)教师分配教室
(5)班级增加学生信息
所以说,面向过程主要是针对功能,而面向对象主要是针对能实现功能的背后的实体。面向对象实质是面向实体,所以当我们使用面向对象进行编程时,一定要建立这样一个观念:万物皆对象!
(三)面向对象和面向过程的比较
在我们将面向过程和面向对象讨论完后,会明显的感觉两者之间有着很大的区别。面向过程简单直接,易于入门理解,模块化程度较低。而面向对象相对于面向过程较为复杂,不易理解,模块化程度较高。可总结尾下面三点:
1.都可以实现代码重用和模块化编程,但是面向对象的模块化更深,数据更封闭,业更安全!因为面向对象的封装性更强!
2.面向对象的思维方式冯家贴近于现实生活,更容易解决大型的复杂的业务逻辑
3.从前期开发角度上来看,面对对象远比面向过程要复杂,但是从维护和扩展功能的角度上来看,面向对象远比面向过程要简单!
如何选择面向对象还是面向过程,对于一个有着丰富开发经验的老手来说,这是一个得心应手的过程。而对于一个新手而言,其实从两者的对比就可以看出,当我们的业务逻辑比较简单时,使用面向过程能更快的实现。但是当我们的业务逻辑比较复杂时,为了将来的维护和扩展,还是面向对象更靠谱点!
注:以上理论内容参考了北国、风光https://www.cnblogs.com/BeiGuo-FengGuang/p/5935763.html
二、相关项目的代码实现
(一)银行系统实战
在银行系统的功能模块中,主要分为以下几个实体:
人的属性:姓名,身份证号,电话号码,卡
ATM:开户,查询,存款,取款,改密,锁卡,解锁,退出
卡的属性:卡号,密码,账户余额
管理员属性:开机
1.主界面代码
#/user/bin/env/python #-*- coding:utf-8 -*- ''' author:baizhou ''' ''' 主界面模块 '''
'''
人:
类名:Person
属性:姓名 身份证号 电话号 卡
行为:
卡:
类名:Card
属性:卡号 密码 余额
行为:
银行:
类名:bank
属性:用户列表 提款机
提款机:
类名:ATM
属性:用户字典
行为:开户,查询,取款,存款,转账,改密,锁定,解锁,补卡,销户,退出
界面类:
类名:View
属性:
行为:管理员界面,管理员验证,系统功能界面
'''
from admin import Admin from atm import ATM import time def main(): allUser = {} # user对象实例化 admin = Admin() atm = ATM(allUser) # 打印user下的欢迎界面 admin.printWelecom() # 请管理员登录,并开机 res1 = admin.adminLogin() if not res1: return -1 time.sleep(2) # 打印用户功能界面 while True: admin.printFunctionSys() res = input("请输入您要办理的业务:") if res == "1": atm.openAccount() if res == "2": atm.inqure() if res == "3": atm.getMoney() if res == "4": atm.saveMoney() if res == "5": atm.changePassword() if res == "6": atm.cardLock() if res == "7": atm.unCardLock() if res == "8": print("补卡") atm.reMakeCard() if res == "9": # 销户功能有问题 atm.closeAccount() if res == "t": atm.Exit() time.sleep(2) return 0 time.sleep(2) if __name__ == "__main__": main()
2.ATM机模块代码
#/user/bin/env/python #-*- coding:utf-8 -*- ''' author:baizhou ''' """ ATM机模块 """ from card import Card import random from user import User import time class ATM(object): def __init__(self,alluser): self.alluser = alluser def openAccount(self): # 收集身份信息,包括姓名,身份证号码,电话号码,密码(密码要进行二次认定),账户余额 name = input("请输入您的姓名:") id = input("请输入您的身份证号:") phone = input("请输入您的手机号码:") money = int(input("请输入您的预存金额:")) passWord = input("请输入您的密码:") # 验证两次密码是否相同 passWord2 = input("请再次输入密码") if passWord != passWord2: print("两次密码输入不同。。。") return -1 print("密码设置成功,请牢记密码%s"%passWord) cardId = self.creatCardNum() card = Card(cardId,passWord,money) user = User(name,id,phone,card) # 存入到字典中 self.alluser[card.cardId] = user print("您的开户以完成,请牢记开户账号%d" % cardId) # 查询 def inqure(self): cardNumInput = int(input("请输入您的卡号")) user = self.alluser.get(cardNumInput) # 如果卡号不存在,则self.alluser.get(cardNumInput)返回none,not self.alluser.get(cardNumInput)则为Ture, #下面代码就会执行 if not self.alluser.get(cardNumInput): print("此卡号不存在。。。") return -1 # 如果密码相等,self.verify(user.card.passWord)返回True,not self.verify(user.card.passWord)返回False # return -1 就不执行,反之,重复输入三次以后,执行return -1. if not self.verify(user.card.passWord): return -1 print("您的余额为:%d"%user.card.money) def getMoney(self): cardNumInput = int(input("请输入您的卡号")) user = self.alluser.get(cardNumInput) # 如果卡号不存在,则self.alluser.get(cardNumInput)返回none,not self.alluser.get(cardNumInput)则为Ture, # 下面代码就会执行 if not self.alluser.get(cardNumInput): print("此卡号不存在。。。") return -1 # 如果密码相等,self.verify(user.card.passWord)返回True,not self.verify(user.card.passWord)返回False # return -1 就不执行,反之,重复输入三次以后,执行return -1. if not self.verify(user.card.passWord): return -1 num = int(input("请输入您的取款金额:")) if not self.judgeNum(num): return -1 user.card.money -= num print("取款成功,您的余额为%d"%user.card.money) def saveMoney(self): cardNumInput = int(input("请输入您的卡号")) user = self.alluser.get(cardNumInput) # 如果卡号不存在,则self.alluser.get(cardNumInput)返回none,not self.alluser.get(cardNumInput)则为Ture, # 下面代码就会执行 if not self.alluser.get(cardNumInput): print("此卡号不存在。。。") return -1 # 如果密码相等,self.verify(user.card.passWord)返回True,not self.verify(user.card.passWord)返回False # return -1 就不执行,反之,重复输入三次以后,执行return -1. if not self.verify(user.card.passWord): return -1 num = int(input("请输入您的取存款金额:")) if not self.judgeNum(num): return -1 user.card.money += num print("取款成功,您的余额为%d" % user.card.money) def cardLock(self): cardNumInput = int(input("请输入您的卡号")) user = self.alluser.get(cardNumInput) # 如果卡号不存在,则self.alluser.get(cardNumInput)返回none,not self.alluser.get(cardNumInput)则为Ture, # 下面代码就会执行 if not self.alluser.get(cardNumInput): print("此卡号不存在。。。") return -1 # 如果密码相等,self.verify(user.card.passWord)返回True,not self.verify(user.card.passWord)返回False # return -1 就不执行,反之,重复输入三次以后,执行return -1. if not self.verify(user.card.passWord): return -1 user.card.cardLock = True print("卡已锁定") def unCardLock(self): cardNumInput = int(input("请输入您的卡号")) user = self.alluser.get(cardNumInput) # 如果卡号不存在,则self.alluser.get(cardNumInput)返回none,not self.alluser.get(cardNumInput)则为Ture, # 下面代码就会执行 if not self.alluser.get(cardNumInput): print("此卡号不存在。。。") return -1 # 如果密码相等,self.verify(user.card.passWord)返回True,not self.verify(user.card.passWord)返回False # return -1 就不执行,反之,重复输入三次以后,执行return -1. if not self.verify(user.card.passWord): return -1 user.card.cardLock = False print("卡已解锁") def changePassword(self): cardNumInput = int(input("请输入您的卡号")) user = self.alluser.get(cardNumInput) # 如果卡号不存在,则self.alluser.get(cardNumInput)返回none,not self.alluser.get(cardNumInput)则为Ture, # 下面代码就会执行 if not self.alluser.get(cardNumInput): print("此卡号不存在。。。") return -1 # 如果密码相等,self.verify(user.card.passWord)返回True,not self.verify(user.card.passWord)返回False # return -1 就不执行,反之,重复输入三次以后,执行return -1. if not self.verify(user.card.passWord): return -1 changePassWord = int(input("请您输入要修改的密码:")) user.card.passWord = changePassWord print("密码修改成功,请牢记密码%d"%changePassWord) def closeAccount(self): cardNumInput = int(input("请输入您的卡号")) user = self.alluser.get(cardNumInput) # 如果卡号不存在,则self.alluser.get(cardNumInput)返回none,not self.alluser.get(cardNumInput)则为Ture, # 下面代码就会执行 if not self.alluser.get(cardNumInput): print("此卡号不存在。。。") return -1 # 如果密码相等,self.verify(user.card.passWord)返回True,not self.verify(user.card.passWord)返回False # return -1 就不执行,反之,重复输入三次以后,执行return -1. if not self.verify(user.card.passWord): return -1 del user def reMakeCard(self): cardNumInput = int(input("请输入您的卡号")) user = self.alluser.get(cardNumInput) # 如果卡号不存在,则self.alluser.get(cardNumInput)返回none,not self.alluser.get(cardNumInput)则为Ture, # 下面代码就会执行 if not self.alluser.get(cardNumInput): print("此卡号不存在。。。") return -1 idInput = input("请输入您的身份证号码:") if idInput == user.id: print("现在为您重新开户,请稍后。。。") time.sleep(2) self.openAccount() else: return 0 def Exit(self): print("系统正在退出。。。") return -1 # 判断密码输入是否正确 def verify(self,password): for i in range(3): psd2 = input("请输入密码") if password == psd2 : return True print("密码输错三次,系统自动退出。。。") return False #随机生成六位数的卡号 def creatCardNum(self): return random.randrange(100000,1000000) #判断金额输入是否有屋 def judgeNum(self,num): while num <= 0: num= int(input("您输入的金额有误:")) return -1
3.管理员模块
#/user/bin/env/python #-*- coding:utf-8 -*- ''' author:baizhou ''' ''' 管理员模块 ''' class Admin(object): admin = "1" password = "1" def printWelecom(self): # 打印欢迎界面 print("******************************************************") print("* *") print("* *") print("* 欢迎光临 *") print("* *") print("* *") print("******************************************************") def printFunctionSys(self): # 打印功能界面 print("******************************************************") print("* 开户(1) 查询(2) *") print("* 取款(3) 存款(4) *") print("* 改密(5) 锁定(6) *") print("* 解锁(7) 补卡(8) *") print("* 销户(9) 退出(t) *") print("* *") print("******************************************************") def adminLogin(self): adminInput = input("请输入管理员账户:") if self.admin != adminInput: print("管理员账户输入错误。。。。") return 0 passwordInput = input("请输入密码:") if self.password != passwordInput: print("输入密码有误。。。。。") return 0 else: print("登录成功,请稍后。。。。") return -1
4.用户模块
#/user/bin/env/python #-*- coding:utf-8 -*- ''' author:baizhou ''' class User(object): def __init__(self,name,id,phone,card): self.name = name self.id = id self.phone = phone self.card = card
5.卡模块
#/user/bin/env/python #-*- coding:utf-8 -*- ''' author:baizhou ''' class Card(object): def __init__(self,cardId,passWord,money): self.cardId = cardId self.passWord = passWord self.money = money self.cardLock = False
注:此代码还需要后期完善,只实现了大体的功能模块,在合法性判断,程序的稳定性方面还需要进一步加强