面向對象的程序設計看起來高大上,因此我在編程時就應該保證通篇class,這樣寫出的程序必定是好的程序(面向對象只適合那些可擴展性要求比較高的場景)程序員
不少人喜歡說面向對象三大特性(這是從哪傳出來的,封裝,多態,繼承?漏洞太多太多,好吧暫且稱爲三大特性),那麼我在基於面向對象編程時,我必定要讓我定義的類中完整的包含這三種特性,這樣寫確定是好的程序算法
好傢伙,我說降龍十八掌有十八掌,那麼你每次跟人幹仗都要從第一掌打到第18掌這才顯得你會了是麼:面對敵人,你打到第三掌對方就已經倒下了,你說,不行,你給老子起來,老子尚未show完...
這就犯了一個嚴重的錯誤,程序越早面向對象,死的越早,爲啥面向對象,由於咱們要將數據與功能結合到一塊兒,程序總體的結構都沒有出來,或者說須要考慮的問題你都沒有搞清楚個八九不離十,你就開始面向對象了,這就致使了,你在那裏幹想,自覺得想通了,定義了一堆屬性,結果後來又都用不到,或者想不通到底應該定義啥,那就一直想吧,想着想着就瘋了。 你見過哪家公司要開發一個軟件,上來就開始寫,確定是頻繁的開會討論計劃
抽象指對現實世界問題和實體的本質表現,行爲和特徵建模,創建一個相關的子集,能夠用於繪製程序結構,從而實現這種模型。抽象不只包括這種模型的數據屬性,還定義了這些數據的接口。編程
對某種抽象的實現就是對此數據及與之相關接口的現實化(realization)。現實化這個過程對於客戶程序應當是透明並且無關的。函數
封裝描述了對數據/信息進行隱藏的觀念,它對數據屬性提供接口和訪問函數。經過任何客戶端直接對數據的訪問,無視接口,與封裝性都是背道而馳的,除非程序員容許這些操做。做爲實現的 一部分,客戶端根本就不須要知道在封裝以後,數據屬性是如何組織的。在Python中,全部的類屬性都是公開的,但名字可能被「混淆」了,以阻止未經受權的訪問,但僅此而已,再沒有其餘預防措施了。這就須要在設計時,對數據提供相應的接口,以避免客戶程序經過不規範的操做來存取封裝的數據屬性。工具
注意:封裝毫不是等於「把不想讓別人看到、之後可能修改的東西用private隱藏起來」,真正的封裝是,通過深刻的思考,作出良好的抽象,給出「完整且最小」的接口,並使得內部細節能夠對外透明(對外透明的意思是,外部調用者能夠順利的獲得本身想要的任何功能,徹底意識不到內部細節的存在)oop
合成擴充了對類的描述,使得多個不一樣的類合成爲一個大的類,來解決現實問題。合成了一個異常複雜的系統,好比一個類由其它類組成,更小的組件也多是其它的類,數據屬性及行爲,全部這些合在一塊兒,彼此是「有一個」的關係。性能
派生描述了子類衍生出新的特性,新類保留已存類類型中全部須要的數據和行爲,但容許修改或者其它的自定義操做,都不會修改原類的定義。測試
繼承描述了子類屬性從祖先類繼承這樣一種方式。設計
繼承結構表示多「代」派生,能夠述成一個「族譜」,連續的子類,與祖先類都有關係。
泛化和特化都基於繼承
多態指的是同一種事物的多種狀態:水這種事物有多種不一樣的狀態:冰,水蒸氣
多態性的概念指出了對象如何經過他們共同的屬性和動做來操做及訪問,而不需考慮他們具體的類。
冰,水蒸氣,都繼承於水,它們都有一個同名的方法就是變成雲,可是冰.變雲(),與水蒸氣.變雲()是大相徑庭的過程,雖然調用的方法都同樣
自省也稱做反射,這個性質展現了某對象是如何在運行期取得自身信息的。若是傳一個對象給你,你能夠查出它有什麼能力,這是一項強大的特性。若是Python不支持某種形式的自省功能,dir和type內建函數,將很難正常工做。還有那些特殊屬性,像__dict__,__name__及doc。
不少人在學完了python的class機制以後,遇到一個生產中的問題,仍是會懵逼,這其實太正常了,由於任何程序的開發都是先設計後編程,python的class機制只不過是一種編程方式,若是你硬要拿着class去和你的問題死磕,變得更加懵逼都是分分鐘的事,在之前,軟件的開發相對簡單,從任務的分析到編寫程序,再到程序的調試,能夠由一我的或一個小組去完成。可是隨着軟件規模的迅速增大,軟件任意麪臨的問題十分複雜,須要考慮的因素太多,在一個軟件中所產生的錯誤和隱藏的錯誤、未知的錯誤可能達到驚人的程度,這也不是在設計階段就徹底解決的。
因此軟件的開發其實一整套規範,咱們所學的只是其中的一小部分,一個完整的開發過程,須要明確每一個階段的任務,在保證一個階段正確的前提下再進行下一個階段的工做,稱之爲軟件工程
面向對象的軟件工程包括下面幾個部:
軟件工程中的系統分析階段,要求分析員和用戶結合在一塊兒,對用戶的需求作出精確的分析和明確的表述,從大的方面解析軟件系統應該作什麼,而不是怎麼去作。面向對象的分析要按照面向對象的概念和方法,在對任務的分析中,從客觀存在的事物和事物之間的關係,貴南出有關的對象(對象的‘特徵’和‘技能’)以及對象之間的聯繫,並將具備相同屬性和行爲的對象用一個類class來標識。 創建一個能反映這是工做狀況的需求模型,此時的模型是粗略的。
根據面向對象分析階段造成的需求模型,對每一部分分別進行具體的設計。 首先是類的設計,類的設計可能包含多個層次(利用繼承與派生機制)。而後以這些類爲基礎提出程序設計的思路和方法,包括對算法的設計。 在設計階段並不牽涉任何一門具體的計算機語言,而是用一種更通用的描述工具(如僞代碼或流程圖)來描述。
根據面向對象設計的結果,選擇一種計算機語言把它寫成程序,能夠是python。
在寫好程序後交給用戶使用前,必須對程序進行嚴格的測試,測試的目的是發現程序中的錯誤並修正它。 面向對的測試是用面向對象的方法進行測試,以類做爲測試的基本單元。
正如對任何產品都須要進行售後服務和維護同樣,軟件在使用時也會出現一些問題,或者軟件商想改進軟件的性能,這就須要修改程序。 因爲使用了面向對象的方法開發程序,使用程序的維護比較容易。 由於對象的封裝性,修改一個對象對其餘的對象影響很小,利用面向對象的方法維護程序,大大提升了軟件維護的效率,可擴展性高。
在面向對象方法中,最先發展的確定是面向對象編程(OOP),那時OOA和OOD都尚未發展起來,所以程序設計者爲了寫出面向對象的程序,還必須深刻到分析和設計領域,尤爲是設計領域,那時的OOP實際上包含了如今的OOD和OOP兩個階段,這對程序設計者要求比較高,許多人感到很難掌握。
如今設計一個大的軟件,是嚴格按照面向對象軟件工程的5個階段進行的,這個5個階段的工做不是由一我的從頭至尾完成的,而是由不一樣的人分別完成,這樣OOP階段的任務就比較簡單了。程序編寫者只須要根據OOd提出的思路,用面嚮對象語言編寫出程序既可。