在軟件開發領域中,關於如何編寫好可維護的程序一直是一個備受爭議的話題,進而也提出了不少的編程理論,可是這樣的編程理論的理論基礎在哪兒,爲何編程這樣的方法會比那樣的方法要好,爲何一樣能完成結果的代碼,維護起來會千差萬別?今天咱們就來扯扯關於如何寫好代碼的那些個事情!!程序員
關於編程,咱們能夠理解成爲人與計算機交流的一直途徑,就像咱們平時使用語言和人交流同樣,把咱們的意圖告訴對方,那麼與計算機交流和與人交流的時候有哪些區別,我認爲惟一不一樣的是,咱們編程,面對的對象是計算機,而咱們聊天交流的時候,咱們面對的是可以理解咱們語言的人類,那麼在咱們與計算機之間交流的時候 咱們須要注意那些的細節,而後咱們應該要注意那些坑。
編程
其實,縱觀編程的兩個趨勢,主要有兩種主流的派系,一種是面對過程的編程,一種是面對對象的編程,固然,當前還有不少新的編程方式,好比AOP(面對切面的編程,假如我說這個僅僅是面對對象編程的一個分支,會不會有人噴我說,你丫懂個毛線!),面對過程的編程不在咱們今天討論的方位以內,今天咱們主要討論的是面對對象的編程。好吧 進入正題
設計模式
在面對對象的編程當中,不少書上都說了要遵循面對對象的幾個特性,神馬要封裝,什麼要繼承,神馬要多態。可是你去翻翻那些個所謂的JAVA入門到精通,什麼20天學會JAVA編程等諸如此等我把它列爲垃圾書籍的書中講解的並不詳細,甚至有些無良的做者隨便一段代碼抄錄 而後作一些個有的沒的註釋,讓各位讀者看完之後,尼瑪說了個啥都不知道,還白花花的花費了N多白銀,我真心想說,大家正式有業(QU)界(NI)良(MA)心(BI)啊.函數
進入正題,看看面對對象編程中這幾個概念到底都有什麼內涵spa
話說什麼封裝,爲何要封裝,封裝好了有啥效果。
設計
什麼是封裝?對象
答:封裝就是將你的項目中屢次出現相同代碼進行抽象與合併的這麼一個過程叫作封裝。這樣說,應該可以明白很多了吧,其實封裝僅僅是一個爲了描述這個過程的一個名詞而已,說白了就是提煉。繼承
爲何要封裝?接口
不少人應該遇到過這樣的經歷,特別是剛剛進入這一行的新人,滿懷欣喜的啪啪碼好了一對項目模塊的代碼,正準備commit的時候,PM說,丫的,你寫了個啥?滿屏的滿屏的重複代碼,你丫想幹啥?接下來的就是PM的口頭禪!看我嘴型「你-把-這-些-代-碼-封-裝-好-了-再-提-交!!」
開發
首次玩JAVA等相似的面對對象語言的騷年們確定很不解,說,尼瑪我功能完成了就好了,爲何還要封裝來封裝去,不嫌麻煩麼?其實N多的PM也不會告訴你,等你把代碼都提煉出來,你能夠爲你之後減小不少沒必要要的加班。那好了 其實封裝的真正意義就在於,修改和維護的時候會變得更加簡單,試想一下,你的某段代碼,在整個項目中出現了100次(沒有提煉的那種),那麼有一天,要對這段代碼進行修改,騷年,你就等着加班到死吧,假如你將這100屢次一樣的代碼放在一個提煉的方法裏,那麼,你只須要改一個位置,其餘的地方就更着變了,這樣豈不是更加舒服?俗話說 不做就不會死,好好想一想後果吧,那些還不明白爲何要封裝代碼的懵懂少年們,覺醒吧!!
那麼封裝的原則是什麼?什麼樣的封裝算是比較舒服的了?
其實這個沒有定數,我只想告訴你基本一些個原則,當一段一樣的代碼在項目中出項了2次以上,我就可能會考慮把他弄到一個方法裏面了,我這樣作的目的很簡單,就是爲了可以方便的調用和維護,由於你維護一個小小的方法要比你維護一對散落的代碼要容易許多,我把這個種方法叫作「代碼方法集中管理」那麼代碼封裝的另一個原則邊界是什麼,是否是我什麼樣的代碼都放在一個提煉的方法裏面了?答案:不是,封裝的邊界是在於,一個方法最好是隻作一件事情,這樣夠簡單,夠單純,並且這樣作的影響範圍是最小的。因此封裝代碼的方式邊界就是「以影(SHA)響(SHANG)力(LI)最小爲原則邊界」
這個是面對對象的第二步,那麼爲何要繼承??繼承有什麼樣表現形式?
在不少書中都是這樣對繼承進行描述的,說Person Animal是父類,Student,dog,cat是子類,而後尼瑪在Person,Animal類中寫一堆有的沒的方法函數,而後他用所謂extends 繼承,而後告訴你們這個就是繼承!不過這樣寫法是沒有錯,不過讓人看得有點不知因此然就有點不對了!!並且 這樣的書中只是說類能夠繼承,可是沒有說繼承有哪些很差的,屢次深層次繼承會致使類的繼承關係錯綜複雜,可讀性很差,假如在深層數的繼承中,你一般會遇到這樣的狀況,你每每爲了瞭解一個類到底有多少個方法,你有可能要從超類讀到從孫類,假如多來上幾個接口,騷年,等死吧。(因此說,你若是遇到這樣的代碼,基本就是有兩個可能,第一就是設計的這個程序員是個菜鳥,什麼也不懂就一頓糊弄,還有就是你可能真正遇到對手了,對方是個大牛,不過人家可能不想讓你插手他的項目,故意這樣寫 讓你知難而退)
那麼繼承可以帶來什麼樣的好處了?
最大的好處就是「省代碼」這是把雙刃劍,真的,在淺層次的繼承中,你會體會到高潮般的快感,若是你把這個繼承弄到深層數的繼承中,你會體會到蛋疼兩個字怎麼寫,菊緊的感覺怎麼樣諸如此類的感受。
還有一個繼承的內涵就是,實現,也就是實現接口的意思,在面對對象的編程中,萬般皆對象,你把接口理解成爲一個JAVA中的抽象類基本就可以明白 實現也是繼承的一個變種。
多態 這個應該不用多少了,是面對對象中最重要的方式,也是最詭異,最神奇,最難以掌握的一個概念。爲何?
就他麼一句「父類指向子類」就足矣讓不少人望而卻步,爲何 不爲何,由於多態很神奇!!
爲何要用多態?
其實多態是多種形態的簡寫
怎麼理解?
假如Person類是一個父類,StudentA,StudentB,StudentC是一些子類,那麼父類只向之類之後,父類就和悟空同樣有72變了,一下變StudentA,一下變StudentB,一下變StudentC,還分別執行這三個子類裏相同的方法,可是輸出的結果還不同!尼瑪 我都快崩了,這就是多態,一個讓人又愛又恨的超級特性。
多態在實際中怎用
其實在實際的用法中,經過都是「父類指向子類,而後這個父類一般都是抽象類或者方法,裏面一般定義一些個抽象的方法,而後讓他們的子類去實現,不一樣的子類對同一個方法進行不一樣的實現,從而產生不同的執行效果,這種手法就是多態的典型應用」。你看那些設計模式裏面的23種方式,80%都是這麼幹的!!真的 不信你去找些代碼看看!!看我說的有沒有道理!