python 面向?qū)ο蟮某绦蛟O計

一:什么是編程范式悉尾?

編程是程序員用特定的語法 + 數(shù)據(jù)結(jié)構(gòu) + 算法組成的代碼來告訴計算機如何執(zhí)行任務的過程。

如果把編程的過程比喻為練習武功挫酿,那么編程范式指的就是武林中的各種流派构眯,而在編程的世界里最常見的兩大流派便是:面向過程與面向?qū)ο蟆?/p>

“功夫的流派沒有高低之分,只有習武的人才有高低之分 “早龟,在編程世界里更是這樣鸵赖,面向過程與面向?qū)ο笤诓煌膱鼍跋露几饔袃?yōu)劣,誰好誰壞不能一概而論拄衰。

一個程序是程序員為了得到一個任務結(jié)果而編寫的一組指令的集合,正所謂條條大路通羅馬饵骨,實現(xiàn)一個任務的方式有很多種不同的方法翘悉,對這些不同的編程方式的特點進行歸納總結(jié)得出來的編程方式類別,即為編程范式居触,不同的編程范式本質(zhì)上代表對各種各類的任務采取的不同的解決問題的思路妖混,大多數(shù)語言只支持一種編程范式,當然也有一些語言可以同時支持多種編程范式轮洋。兩種最重要的編程范式分別是面向過程編程和面向?qū)ο缶幊獭?/p>

二:什么是面向過程編程制市?

面向過程編程依賴 - procedures,一個 procedure 包含一組要被進行計算的步驟弊予, 面向過程又被稱為 top-down languages祥楣, 就是程序從上到下一步步執(zhí)行,一步步從上到下,從頭到尾的解決問題 误褪≡瘅ⅲ基本設計思路就是程序一開始是要著手解決一個大的問題,然后把一個大問題分解成很多個小問題或子過程兽间,這些子過程再執(zhí)行的過程再繼續(xù)分解直到小問題足夠簡單到可以在一個小步驟范圍內(nèi)解決历葛。

舉個典型的面向過程的例子, 寫一個數(shù)據(jù)遠程備份程序嘀略, 分三步恤溶,本地數(shù)據(jù)打包,上傳至云服務器帜羊,測試備份文件可用性咒程。

def cloud_upload(file):
 
        print("\nconnecting cloud storage center...")
        print("cloud storage connected.")
        print("upload file...xxx..to cloud...", file)
        print('close connection.....')
 
 
def data_backup(folder):
    print("找到要備份的目錄...", folder)
    print("將備份文件打包,移至相應目錄...")
    return '/tmp/backup20181103.zip'
 
def data_backup_test():
 
    print("\n從另外一臺機器將備份文件從遠程cloud center下載逮壁,看文件是否無損")
 
 
def main():
    zip_file = data_backup("c:\\users\\alex\歐美100G高清無碼")
 
    cloud_upload(zip_file)
 
    data_backup_test()
 
 
if __name__ == '__main__':
    main()

這個變量孵坚,那這個子過程你也要修改,假如又有一個其它子程序依賴這個子過程 窥淆, 那就會發(fā)生一連串的影響卖宠,隨著程序越來越大, 這種編程方式的維護難度會越來越高忧饭。

test = 1
 
def cloud_upload(file):
 
    if test == 1:
        print("\nconnecting cloud storage center...")
        print("cloud storage connected.")
        print("upload file...xxx..to cloud...", file)
        print('close connection.....')
        return True
    else:
        print("不備份")
        return False
 
def data_backup(folder):
    print("找到要備份的目錄...", folder)
    print("將備份文件打包扛伍,移至相應目錄...")
    return '/tmp/backup20181103.zip'
 
def data_backup_test(upload_res):
    if upload_res == 1:
        print("\n從另外一臺機器將備份文件從遠程cloud center下載,看文件是否無損")
    else:
        print("upload error,不備份")
 
def main():
    zip_file = data_backup("c:\\users\\alex\歐美100G高清無碼")
 
    res = cloud_upload(zip_file)
 
    data_backup_test(res)
 
 
if __name__ == '__main__':
    main()

所以我們一般認為词裤, 如果你只是寫一些簡單的腳本刺洒,去做一些一次性任務,用面向過程的方式是極好的吼砂,但如果你要處理的任務是復雜的逆航,且需要不斷迭代和維護 的, 那還是用面向?qū)ο笞罘奖懔恕?/p>

三:面向?qū)ο缶幊痰囊?/h3>

你現(xiàn)在是一家游戲公司的開發(fā)人員渔肩,現(xiàn)在需要你開發(fā)一款叫做 <人狗大戰(zhàn)> 的游戲因俐,你就思考呀,人狗作戰(zhàn)周偎,那至少需要 2 個角色抹剩,一個是人, 一個是狗蓉坎,且人和狗都有不同的技能澳眷,比如人拿棍打狗, 狗可以咬人蛉艾,怎么描述這種不同的角色和他們的功能呢钳踊?

你搜羅了自己掌握的所有技能衷敌,寫出了下面的代碼來描述這兩個角色

person = {
    'name':'Alex',
    'attack': 100, #殺傷力
    'life_value':1000
}
 
 
dog = {
    'name':'Peiqi',
    'attack': 200, #殺傷力
    'life_value':800
}

一個字典表示一個角色實體,但是如果有多條狗和多個人一起打呢箍土?那就得寫多個字典

person = {
    'name':'Alex',
    'attack': 100, #殺傷力
    'life_value':1000
}
person2 = {
    'name':'Black Girl',
    'attack': 100, #殺傷力
    'life_value':600
}
 
 
dog = {
    'name':'Peiqi',
    'attack': 200, #殺傷力
    'life_value':800
}

這樣是有問題的逢享,因為如果你字典里的值不小心定義錯了,把 attack 寫成了了 atteck 的話吴藻,那整個程序就有問題了瞒爬。so 你很快想出了改進方案,把字典放進函數(shù)

def person(name,attack,life_value):
    data = {
        'name':name,
        'attack':attack,
        'life_value':life_value,
    }
    return data
 
 
def dog(name, attack, life_value):
    data = {
        'name': name,
        'attack': attack,
        'life_value': life_value,
    }
    return data
 
 
alex = person("Alex",100,1000)
rain = person("Black girl",80,700)
 
d = dog("PeiQi",200,800)

好沟堡,現(xiàn)在角色定義好了侧但,還差每個角色的功能,人打狗航罗,狗咬人的功能要定義出來

def attack(p,d):
    """人打狗功能"""
 
    d['life_value'] -= p['attack'] #被打了禀横,要掉血
    print("人[%s] 打了 狗[%s]。粥血。柏锄。,[%s]的生命值還有[%s]" % (p['name'], d['name'],d['name'],d['life_value']))
 
def bite(d,p):
    """狗咬人功能"""
    p['life_value'] -= d['attack']
    print("狗[%s] 咬了 人[%s]。复亏。趾娃。,[%s]的生命值還有[%s]" % (d['name'], p['name'],p['name'],p['life_value']))
 
alex = person("Alex",100,1000)
black_girl = person("Black girl",80,700)
 
d = dog("PeiQi",200,800)
 
attack(alex,d)
bite(d,black_girl)

但是要設定許多許多的功能,我們是不是要一點點的加缔御?那么久特別麻煩抬闷,改這個改那個的,為了解決上面的問題耕突,我們使用面向?qū)ο蟆?/p>

四:什么是面向?qū)ο螅?/h3>

OOP(Object Oriented Programing)編程是利用 “類” 和“對象”來創(chuàng)建各種模型來實現(xiàn)對真實世界的描述笤成。

怎么說呢?

核心是 “對象” 二字眷茁,要理解對象為何物炕泳,必須把自己當成上帝,在上帝眼里上祈,世間存在的萬物皆為對象喊崖,不存在的也可以創(chuàng)造出來。程序員基于面向?qū)ο笤O計程序就好比如來設計西游記雇逞,如來要解決的問題是把經(jīng)書傳給東土大唐,如來并沒有考慮問題的解決流程茁裙,而是設計出了負責取經(jīng)的師傅四人:唐僧塘砸,沙和尚,豬八戒晤锥,孫悟空掉蔬,負責騷擾的一群妖魔鬼怪廊宪,以及負責保駕護航的一眾神仙,這些全都是對象女轿,然后取經(jīng)開始箭启,就是師徒四人與妖魔鬼怪神仙交互著直到完成取經(jīng)任務。所以說基于面向?qū)ο笤O計程序就好比在創(chuàng)造一個世界蛉迹,世界是由一個個對象組成傅寡,而你就是這個世界的上帝。

我們從西游記中的任何一個人物對象都不難總結(jié)出:對象是特征與技能的結(jié)合體北救。比如孫悟空的特征是:毛臉雷公嘴荐操,技能是:七十二變、火眼金睛等珍策。

與面向過程機械式的思維方式形成鮮明對比托启,面向?qū)ο蟾幼⒅貙ΜF(xiàn)實世界而非流程的模擬,是一種 “上帝式” 的思維方式攘宙。

面向過程 == 個人視角

我要去做大保健屯耸,我只需考慮,我有沒有錢蹭劈,去哪家店疗绣,怎么去,做什么價位的就可以链方,``你的每一步都要通過程序定義出來持痰,寫死了,在這個程序里祟蚀,你只被設定了去做大保健的功能工窍,``你說中途我想去個ktv,那可能會導致整個程序的邏輯都得更改。 用面向過程的方式寫代碼前酿,``那你care的就是整個事情的執(zhí)行過程 |

面向?qū)ο?== 上帝視角

如果你是上帝患雏,你現(xiàn)在要創(chuàng)世紀,把這么多人罢维、動物淹仑、山河造出來,上帝光靠自己干肺孵,``一個一個的造人匀借,多累呀,讓你干這個活平窘,你肯定是先造模子吓肋,一個男人模子, 一個女人模子是鬼,剩下的就一個個復制就行啦肤舞。這個模子的作用是什么? 模子定義了人這個物種所具備的所有特征\(或者說李剖,我們把具備這些特征的個體歸為人類\)。 這個世界上所有的東西都是你定義的紫皇,你需要用最高效的方式去造世界慰安, 最高效的方式就是,先把世界按物種聪铺、樣貌化焕、有無生命等各種維度分類, 然后給每類東西建模型铃剔,再讓其在不脫離你基本橫型定義的框架下撒桨,``自我繁衍(世界要多姿多彩,所以即使是同一物種键兜,也要有些不一樣) |

五:面向?qū)ο蠛兔嫦蜻^程的優(yōu)缺點對比

面向過程

優(yōu)點

  • 復雜的問題流程化凤类,進而簡單化(一個復雜的問題,分成一個個小的步驟去實現(xiàn)普气,實現(xiàn)小的步驟將會非常簡單)
  • 舉個典型的面向過程的例子谜疤, 寫一個數(shù)據(jù)遠程備份程序, 分三步现诀,本地數(shù)據(jù)打包夷磕,上傳至云服務器,測試備份文件可用性仔沿。

缺點

  • 一套流水線或者流程就是用來解決一個問題坐桩,比如生產(chǎn)汽水的流水線無法生產(chǎn)汽車,即便是能封锉,也得是大改绵跷,改一個組件,與其相關的組件都需要修改成福,牽一發(fā)而動全身碾局,擴展性極差。
  • 比如我們修改了步驟二的函數(shù) cloud_upload 的邏輯奴艾,那么依賴于步驟二結(jié)果才能正常執(zhí)行的步驟三的函數(shù) data_backup_test 相關的邏輯也需要修改擦俐,這就造成了連鎖反應,而這一弊端會隨著程序的增大而變得越發(fā)的糟糕握侧,我們程序的維護難度將會越來越大蚯瞧。

應用場景

面向過程的程序設計思想一般用于那些功能一旦實現(xiàn)之后就很少需要改變的場景, 如果你只是寫一些簡單的腳本品擎,去做一些一次性任務埋合,用面向過程的方式是極好的,著名的例子有 Linux 內(nèi)核萄传,git甚颂,以及 Apache HTTP Server 等。但如果你要處理的任務是復雜的秀菱,且需要不斷迭代和維護 的振诬, 那還是用面向?qū)ο笞罘奖懔恕?/p>

面向?qū)ο?/h4>

 優(yōu)點:

解決了面向過程可擴展性低的問題,需要強調(diào)的是衍菱,對于一個軟件質(zhì)量來說赶么,面向?qū)ο蟮某绦蛟O計并不代表全部,面向?qū)ο蟮某绦蛟O計只是用來解決擴展性問題脊串。

image.png

缺點:

編程的復雜度遠高于面向過程辫呻,不了解面向?qū)ο蠖⒓瓷鲜植⒒谒O計程序,極容易出現(xiàn)過度設計的問題琼锋,而且在一些擴展性要求低的場景使用面向?qū)ο髸皆鼍幊屉y度放闺,比如管理 linux 系統(tǒng)的 shell 腳本程序就不適合用面向?qū)ο笕ピO計,面向過程反而更加適合缕坎。

應用場景:

當然是應用于需求經(jīng)常變化的軟件中怖侦,一般需求的變化都集中在用戶層,互聯(lián)網(wǎng)應用谜叹,企業(yè)內(nèi)部軟件匾寝,游戲等都是面向?qū)ο蟮某绦蛟O計大顯身手的好地方。

六:為什么要用面向?qū)ο螅?/h3>
  1. 使程序更加容易擴展和易更改叉谜,使開發(fā)效率變的更高
  2. 基于面向?qū)ο蟮某绦蚩梢允顾烁尤菀桌斫饽愕拇a邏輯旗吁,從而使團隊開發(fā)變得更從容。

七:面向?qū)ο竺~解釋

  類:一個類即是對一類擁有相同屬性的對象的抽象停局、藍圖很钓、原型、模板董栽。在類中定義了這些對象的都具備的屬性(variables(data))码倦、共同的方法

  屬性:人類包含很多特征,把這些特征用程序來描述的話锭碳,叫做屬性袁稽,比如年齡、身高擒抛、性別推汽、姓名等都叫做屬性补疑,一個類中,可以有多個屬性

  方法:人類不止有身高歹撒、年齡莲组、性別這些屬性,還能做好多事情暖夭,比如說話锹杈、走路、吃飯等迈着,相比較于屬性是名詞竭望,說話、走路是動詞裕菠,這些動詞用程序來描述就叫做方法咬清。

  實例 (對象):一個對象即是一個類的實例化后實例,一個類必須經(jīng)過實例化后方可在程序中調(diào)用糕韧,一個類可以實例化多個對象枫振,每個對象亦可以有不同的屬性,就像人類是指所有人萤彩,每個人是指具體的對象粪滤,人與人之前有共性,亦有不同

  實例化:把一個類轉(zhuǎn)變?yōu)橐粋€對象的過程就叫實例化

八:面向?qū)ο笕筇匦?/h3>

1雀扶,Encapsulation 封裝

在類中對數(shù)據(jù)的賦值杖小、內(nèi)部調(diào)用對外部用戶是透明的,這使類變成了一個膠囊或容器愚墓,里面包含著類的數(shù)據(jù)和方法

2予权,Inheritance 繼承

一個類可以派生出子類,在這個父類里定義的屬性浪册、方法自動被子類繼承

3扫腺,Polymorphism 多態(tài)

多態(tài)是面向?qū)ο蟮闹匾匦? 簡單點說:“一個接口,多種實現(xiàn)”村象,指一個基類中派生出了不同的子類笆环,且每個子類在繼承了同樣的方法名的同時又對父類的方法做了不同的實現(xiàn),這就是同一種事物表現(xiàn)出的多種形態(tài)厚者。

編程其實就是一個將具體世界進行抽象化的過程躁劣,多態(tài)就是抽象化的一種體現(xiàn),把一系列具體事物的共同點抽象出來, 再通過這個抽象的事物, 與不同的具體事物進行對話库菲。

對不同類的對象發(fā)出相同的消息將會有不同的行為账忘。比如,你的老板讓所有員工在九點鐘開始工作, 他只要在九點鐘的時候說:“開始工作”即可,而不需要對銷售人員說:“開始銷售工作”鳖擒,對技術人員說:“開始技術工作”, 因為 “員工” 是一個抽象的事物, 只要是員工就可以開始工作溉浙,他知道這一點就行了。至于每個員工蒋荚,當然會各司其職放航,做各自的工作。

多態(tài)允許將子類的對象當作父類的對象使用圆裕,某父類型的引用指向其子類型的對象, 調(diào)用的方法是該子類型的方法。這里引用和調(diào)用方法的代碼編譯前就已經(jīng)決定了, 而引用所指向的對象可以在運行期間動態(tài)綁定

九:Python 中關于 OPP 的常用術語

9.1 抽象 / 實現(xiàn)

抽象指對現(xiàn)實世界問題和實體的本質(zhì)表現(xiàn), 行為和特征建模, 建立一個相關的子集, 可以用于 繪程序結(jié)構(gòu), 從而實現(xiàn)這種模型荆几。抽象不僅包括這種模型的數(shù)據(jù)屬性, 還定義了這些數(shù)據(jù)的接口吓妆。

對某種抽象的實現(xiàn)就是對此數(shù)據(jù)及與之相關接口的現(xiàn)實化 (realization)。現(xiàn)實化這個過程對于客戶 程序應當是透明而且無關的吨铸。

9.2 封裝 / 接口

封裝描述了對數(shù)據(jù) / 信息進行隱藏的觀念, 它對數(shù)據(jù)屬性提供接口和訪問函數(shù)行拢。通過任何客戶端直接對數(shù)據(jù)的訪問, 無視接口, 與封裝性都是背道而馳的, 除非程序員允許這些操作。作為實現(xiàn)的 一部分, 客戶端根本就不需要知道在封裝之后, 數(shù)據(jù)屬性是如何組織的诞吱。在 Python 中, 所有的類屬性都是公開的, 但名字可能被 “混淆” 了, 以阻止未經(jīng)授權的訪問, 但僅此而已, 再沒有其他預防措施了舟奠。這就需要在設計時, 對數(shù)據(jù)提供相應的接口, 以免客戶程序通過不規(guī)范的操作來存取封裝的數(shù)據(jù)屬性。

注意:封裝絕不是等于 “把不想讓別人看到房维、以后可能修改的東西用 private 隱藏起來”

真正的封裝是沼瘫,經(jīng)過深入的思考,做出良好的抽象咙俩,給出 “完整且最小” 的接口耿戚,并使得內(nèi)部細節(jié)可以對外透明

(注意:對外透明的意思是外部調(diào)用者可以順利的得到自己想要的任何功能阿趁,完全意識不到內(nèi)部細節(jié)的存在)

9.3 合成

合成擴充了對類的 述, 使得多個不同的類合成為一個大的類, 來解決現(xiàn)實問題膜蛔。合成 述了 一個異常復雜的系統(tǒng), 比如一個類由其它類組成, 更小的組件也可能是其它的類, 數(shù)據(jù)屬性及行為, 所有這些合在一起, 彼此是 “有一個” 的關系。

9.4 派生 / 繼承 / 繼承結(jié)構(gòu)

派生描述了子類衍生出新的特性, 新類保留已存類類型中所有需要的數(shù)據(jù)和行為, 但允許修改或者其它的自定義操作, 都不會修改原類的定義脖阵。
繼承描述了子類屬性從祖先類繼承這樣一種方式
  繼承結(jié)構(gòu)表示多 “代” 派生, 可以述成一個“族譜”, 連續(xù)的子類, 與祖先類都有關系皂股。

9.5 泛化 / 特化

基于繼承
  泛化表示所有子類與其父類及祖先類有一樣的特點。
  特化描述所有子類的自定義, 也就是, 什么屬性讓它與其祖先類不同命黔。

9.6 多態(tài)與多態(tài)性

多態(tài)指的是同一種事物的多種狀態(tài):水這種事物有多種不同的狀態(tài):冰呜呐,水蒸氣

多態(tài)性的概念指出了對象如何通過他們共同的屬性和動作來操作及訪問, 而不需考慮他們具體的類。

冰纷铣,水蒸氣卵史,都繼承于水,它們都有一個同名的方法就是變成云搜立,但是冰. 變云 (), 與水蒸氣. 變云() 是截然不同的過程以躯,雖然調(diào)用的方法都一樣

9.7 自省 / 反射

自省也稱作反射,這個性質(zhì)展示了某對象是如何在運行期取得自身信息的。如果傳一個對象給你, 你可以查出它有什么能力, 這是一項強大的特性忧设。如果 Python 不支持某種形式的自省功能, dir 和 type 內(nèi)建函數(shù), 將很難正常工作刁标。還有那些特殊屬性, 像dict,namedoc

十:小白容易犯的錯誤

1. 面向?qū)ο蟮某绦蛟O計看起來高大上,所以我在編程時就應該保證通篇 class址晕,這樣寫出的程序一定是好的程序(面向?qū)ο笾贿m合那些可擴展性要求比較高的場景)

2. 很多人喜歡說面向?qū)ο笕筇匦裕ㄟ@是從哪傳出來的膀懈,封裝,多態(tài)谨垃,繼承启搂?漏洞太多太多,好吧暫且稱為三大特性)刘陶,那么我在基于面向?qū)ο缶幊虝r胳赌,我一定要讓我定義的類中完整的包含這三種特性,這樣寫肯定是好的程序

好家伙匙隔,我說降龍十八掌有十八掌疑苫,那么你每次跟人干仗都要從第一掌打到第 18 掌這才顯得你會了是么:面對敵人,你打到第三掌對方就已經(jīng)倒下了纷责,你說捍掺,不行,你給老子起來再膳,老子還沒有 show 完...

3. 類有類屬性挺勿,實例有實例屬性,所以我們在定義 class 時一定要定義出那么幾個類屬性饵史,想不到怎么辦满钟,那就使勁的想,定義的越多越牛逼

這就犯了一個嚴重的錯誤胳喷,程序越早面向?qū)ο笈确赖脑皆纾瑸樯睹嫦驅(qū)ο罂月叮驗槲覀円獙?shù)據(jù)與功能結(jié)合到一起吠撮,程序整體的結(jié)構(gòu)都沒有出來,或者說需要考慮的問題你都沒有搞清楚個八九不離十讲竿,你就開始面向?qū)ο罅四嗬迹@就導致了,你在那里干想题禀,自以為想通了鞋诗,定義了一堆屬性,結(jié)果后來又都用不到迈嘹,或者想不通到底應該定義啥削彬,那就一直想吧全庸,想著想著就瘋了。

你見過哪家公司要開發(fā)一個軟件融痛,上來就開始寫壶笼,肯定是頻繁的開會討論計劃。

4. 既然這么麻煩雁刷,那么我徹底解脫了覆劈,我們不要用面向?qū)ο缶幊塘耍惆∨胬阌写蟛旁鹩铮隳艹墒掳。挡妗?/p>

十一:面向?qū)ο蟮能浖_發(fā)

很多人在學完了 python 的 class 機制之后目派,遇到一個生產(chǎn)中的問題鹦筹,還是會懵逼,這其實太正常了址貌,因為任何程序的開發(fā)都是先設計后編程,python 的 class 機制只不過是一種編程方式徘键,如果你硬要拿著 class 去和你的問題死磕练对,變得更加懵逼都是分分鐘的事,在以前吹害,軟件的開發(fā)相對簡單螟凭,從任務的分析到編寫程序,再到程序的調(diào)試它呀,可以由一個人或一個小組去完成螺男。但是隨著軟件規(guī)模的迅速增大,軟件任意面臨的問題十分復雜纵穿,需要考慮的因素太多下隧,在一個軟件中所產(chǎn)生的錯誤和隱藏的錯誤、未知的錯誤可能達到驚人的程度谓媒,這也不是在設計階段就完全解決的淆院。

所以軟件的開發(fā)其實一整套規(guī)范,我們所學的只是其中的一小部分句惯,一個完整的開發(fā)過程土辩,需要明確每個階段的任務,在保證一個階段正確的前提下再進行下一個階段的工作抢野,稱之為軟件工程

面向?qū)ο蟮能浖こ贪ㄏ旅鎺讉€部:

1. 面向?qū)ο蠓治觯╫bject oriented analysis 拷淘,OOA)

軟件工程中的系統(tǒng)分析階段,要求分析員和用戶結(jié)合在一起指孤,對用戶的需求做出精確的分析和明確的表述启涯,從大的方面解析軟件系統(tǒng)應該做什么,而不是怎么去做。面向?qū)ο蟮姆治鲆凑彰嫦驅(qū)ο蟮母拍詈头椒ㄊ藕浚趯θ蝿盏姆治鲋斜馄埃瑥目陀^存在的事物和事物之間的關系,貴南出有關的對象(對象的‘特征’和‘技能’)以及對象之間的聯(lián)系补君,并將具有相同屬性和行為的對象用一個類 class 來標識引几。

建立一個能反映這是工作情況的需求模型,此時的模型是粗略的挽铁。

2 面向?qū)ο笤O計(object oriented design伟桅,OOD)

根據(jù)面向?qū)ο蠓治鲭A段形成的需求模型,對每一部分分別進行具體的設計叽掘。

首先是類的設計楣铁,類的設計可能包含多個層次(利用繼承與派生機制)。然后以這些類為基礎提出程序設計的思路和方法更扁,包括對算法的設計盖腕。

在設計階段并不牽涉任何一門具體的計算機語言,而是用一種更通用的描述工具(如偽代碼或流程圖)來描述

3 面向?qū)ο缶幊蹋╫bject oriented programming浓镜,OOP)

根據(jù)面向?qū)ο笤O計的結(jié)果溃列,選擇一種計算機語言把它寫成程序,可以是 python

4 面向?qū)ο鬁y試(object oriented test膛薛,OOT)

在寫好程序后交給用戶使用前听隐,必須對程序進行嚴格的測試,測試的目的是發(fā)現(xiàn)程序中的錯誤并修正它哄啄。

面向?qū)Φ臏y試是用面向?qū)ο蟮姆椒ㄟM行測試雅任,以類作為測試的基本單元。

5 面向?qū)ο缶S護(object oriendted soft maintenance咨跌,OOSM)

正如對任何產(chǎn)品都需要進行售后服務和維護一樣沪么,軟件在使用時也會出現(xiàn)一些問題,或者軟件商想改進軟件的性能锌半,這就需要修改程序成玫。

由于使用了面向?qū)ο蟮姆椒ㄩ_發(fā)程序,使用程序的維護比較容易拳喻。

因為對象的封裝性,修改一個對象對其他的對象影響很小冗澈,利用面向?qū)ο蟮姆椒ňS護程序钦勘,大大提高了軟件維護的效率,可擴展性高亚亲。

在面向?qū)ο蠓椒ㄖ谐共桑钤绨l(fā)展的肯定是面向?qū)ο缶幊?(OOP), 那時 OOA 和 OOD 都還沒有發(fā)展起來腐缤,因此程序設計者為了寫出面向?qū)ο蟮某绦颍€必須深入到分析和設計領域肛响,尤其是設計領域岭粤,那時的 OOP 實際上包含了現(xiàn)在的 OOD 和 OOP 兩個階段,這對程序設計者要求比較高特笋,許多人感到很難掌握剃浇。

現(xiàn)在設計一個大的軟件,是嚴格按照面向?qū)ο筌浖こ痰?5 個階段進行的猎物,這個 5 個階段的工作不是由一個人從頭到尾完成的虎囚,而是由不同的人分別完成,這樣 OOP 階段的任務就比較簡單了蔫磨。程序編寫者只需要根據(jù) OOd 提出的思路淘讥,用面向?qū)ο笳Z言編寫出程序既可。

轉(zhuǎn)自:
http://www.cnblogs.com/wj-1314/p/8668481.html

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末堤如,一起剝皮案震驚了整個濱河市蒲列,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌搀罢,老刑警劉巖畔咧,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件崔赌,死亡現(xiàn)場離奇詭異您单,居然都是意外死亡钳吟,警方通過查閱死者的電腦和手機薇溃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門聚假,熙熙樓的掌柜王于貴愁眉苦臉地迎上來般甲,“玉大人夹抗,你說我怎么就攤上這事杰标”樱” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵腔剂,是天一觀的道長媒区。 經(jīng)常有香客問我,道長掸犬,這世上最難降的妖魔是什么袜漩? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮湾碎,結(jié)果婚禮上宙攻,老公的妹妹穿的比我還像新娘。我一直安慰自己介褥,他們只是感情好座掘,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布递惋。 她就那樣靜靜地躺著,像睡著了一般溢陪。 火紅的嫁衣襯著肌膚如雪萍虽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天形真,我揣著相機與錄音杉编,去河邊找鬼。 笑死没酣,一個胖子當著我的面吹牛王财,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播裕便,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼绒净,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了偿衰?” 一聲冷哼從身側(cè)響起挂疆,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎下翎,沒想到半個月后缤言,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡视事,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年胆萧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俐东。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡跌穗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出虏辫,到底是詐尸還是另有隱情蚌吸,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布砌庄,位于F島的核電站羹唠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏娄昆。R本人自食惡果不足惜佩微,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望萌焰。 院中可真熱鬧喊衫,春花似錦、人聲如沸杆怕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至寝杖,卻和暖如春违施,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瑟幕。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工磕蒲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人只盹。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓辣往,卻偏偏與公主長得像,于是被迫代替她去往敵國和親殖卑。 傳聞我的和親對象是個殘疾皇子站削,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容