什麼樣的程式員是一個好的程式員?學會很多門程式設計語言,就是一個好的程式員了麼?事實上,學會一門程式設計語言不是一件很難的事,而“學會”一門程式設計語言是非常難的一件事。前一個“會”強調“能”,懂文法,能寫簡單的程式就算是前者的“會”了;後一個“會”,強調“精”,顯然,光能寫出“hello world”并不算是後者的“會”,能熟練應用,并用程式設計語言解決各種問題,才算是真正的“會”。程式設計語言就像是世界上任何有意義的東西一樣,它在一直變化,一直進化,此刻學會的程式設計語言,到了下一刻,就可能有新東西出來,跟上它進步的節奏,本身就是一件非常費精力的事,更别說去在這個基礎上,去“會”第二門程式設計語言了。因而,個人認為,使用過很多種的程式設計語言,并不是成為一個好的程式員的充分條件。一個好的程式員,更多的展現不應該在他會使用多少“工具”,而是他能使用這些“工具”,創造多麼大的成績,解決多麼大的問題。掌握解決問題的方法,能用自己精通的程式設計語言解決各種問題,這才是成為一個優秀程式所必備的。
正因為如此,我們才需要學習設計模式。設計模式是面對各種問題進行提煉和抽象而形成的解決方案。這些設計方案是前人不斷試驗,考慮了封裝性、複用性、效率、可修改、可移植等各種因素的高度總結。它不限于一種特定的語言,它是一種解決問題的思想和方法。
現在社會的發展可謂突飛猛進,過去常常被當作軟體行業标杆的“軟體工程”設計模型,逐漸讓出了它的半壁江山,給了一種叫作“靈活開發、快速疊代”的軟體開發方式。快速疊代的環境下,需求就顯得不那麼明确,需求常常伴随着整個項目的進行而變化。需求的不确定性,對程式編寫的要求就會比較高了。首先要考慮各種可能需求的相容,但考慮的需求越多,就很容易陷入整個軟體架構設計的深淵,不可自拔。設計模式對需求變更與代碼重用的考慮,可以被作為軟體設計的參考,由于設計模式基本上本着“高内聚、低耦合”的原則,遵循設計模式而設計的代碼結構,常常會有着對需求的适應性。
一個大型的軟體項目,不可能由一個人完成,此類項目常常需要多個軟體開發工程師的協同開發。既然是協同開發,就一定會涉及到子產品間的互相影響,一個工程師編寫的一行代碼,可能會影響到其它工程師代碼的諸多因子。如果工程師之間的互相影響過大,那麼整個項目無法形成合力,也就無法按時保質完成。最理想的情況下,一個工程師的代碼不要影響到别人的子產品,但有時,又不得不去借用或者被借到其它子產品。這其中的組織,也是需要智慧的。設計模式同樣可以作為協同作業的參考,遵循設計模式而設計的代碼結構,盡可能地減少子產品間的不必要依賴,在協同工作條件下,對項目的有序進行有着非常大的幫助。
公司人事會有變動,程式員也會成長。不管是哪種情況,代碼非常有可能會被移交,即代碼的編寫者和維護者很有可能會是不同的人。那麼代碼的可讀性就顯得非常重要了。由于進階語言的出現,讓機器讀懂你的意圖已經不是最主要的“沖突”,而讓人讀懂你的意圖才是最重要。按照設計模式編寫的代碼,其可讀性也會大大提升,利于團隊項目的繼承和擴充。
設計模式可以分為三個大類:建立類設計模式、結構類設計模式、行為類設計模式。建立類設計模式可以分為單例模式、工廠模式、抽象工廠模式、原型模式、建造者模式;結構類設計模式可以分為裝飾器模式、擴充卡模式、門面模式、組合模式、享元模式、橋梁模式;行為類設計模式可以細分為政策模式、責任鍊模式、指令模式、中介者模式、模闆模式、疊代器模式、通路者模式、觀察者模式、解釋器模式、備忘錄模式、狀态模式。本課程主要針對這23種設計模式進行基于python代碼的執行個體學習。
随着現代社會各類業務規模越來越大,挑戰越來越多,開源技術不斷發展,設計模式也衍生出了很多的新的種類,不局限于這23種,在介紹這些基本的設計模式時,針對些新的“品種”也會簡單進行介紹。
軟體架構随着軟體工程的發展而出現,所謂的軟體架構,是提取了特定領域的軟體的共性部分所形成的軟體體系,它并不是一個成熟的軟體,而更像是一個“半成品”,程式員在架構之上,可以很友善地某些特定領域實作又快又可靠的二次開發。
設計模式和軟體架構在軟體設計中是兩個不同的研究領域:a、設計模式如前邊的定義所講,它指的是針對一類問題的解決方法,一個設計模式可應用于不同的架構和被不同的語言所實作;而架構則是一個應用的體系結構,是一種或多種設計模式和代碼的混合體;b、設計模式相較于架構更容易移植,并且可以用各種語言實作,而軟體架構則受限于領域大環境。雖然設計模式和軟體架構有很多不同,但在某些方面他們二者是統一的,即重視軟體複用,提高開發效率。
軟體架構是個比較大的概念,架構要考慮軟體的整體結構、層次劃分以及不同部分間的協作和互動等,架構的着眼點偏整體。相比之下,架構和設計模式的範圍則具體很多,架構着眼于領域内的解決方法,而設計模式則針對一類問題的解決方案和設計思路。
總體來說,軟體架構可以由不同的架構和不同的設計模式,再加上特定的構件組合來實作;架構可以根據設計模式結合特定程式設計語言和環境來實作。設計模式就是解決單一問題的設計思路和解決方法。