一、面向對象與面向過程
(一)面向過程
首先認識什么是面向過程,面向過程就是面向解決問題的過程進行編程,仔細思考一下,我們在學習和工作中,當我們去實現某項功能或者某項任務時,是不是會不自覺的按部就班的羅列出我們要做的事情?(如果沒有,建議以后試着步驟化解決問題)。而當我們按着我們羅列的步驟去解決問題時,實質上就是按照面向過程的思想去解決問題。我們羅列的步驟就是過程,按照步驟解決問題就是面向過程。
傳統的面向過程的編程思想總結起來就八個字------自頂而下,逐步細化!實現步驟如下:
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
注:此代碼還需要后期完善,只實現了大體的功能模塊,在合法性判斷,程序的穩定性方面還需要進一步加強