面向對象的設計原則 是OOP編程的核心。儘管如此,我仍是看到大多數Java程序員都在追逐設計模式,好比單例模式, 裝飾圖案,或觀測器模式,並且沒有把足夠的注意力放在學習上面向對象的分析與設計.java
學習面向對象編程的基礎知識(如抽象、封裝、多態性和繼承)是相當重要的。可是,同時,瞭解面向對象的設計原則也一樣重要。程序員
它們將幫助您建立一個乾淨和模塊化的設計,這將是很容易測試,調試,並在將來的維護。
我常常看到具備不一樣經驗級別的Java程序員和開發人員,他們要麼從未據說過這些面向對象的設計原則,要麼從未據說過可靠的設計原則。,或者不知道特定的設計原則有什麼好處,以及如何在編碼中應用這些設計原則。編程
爲了完成個人工做,我已經記下了全部重要的面向對象的設計原則,並把它們放在這裏供快速參考。這些至少會讓你知道他們是什麼,他們提供了什麼好處。設計模式
若是你不能理解一個設計原則,你應該嘗試作一個以上的例子,由於有時咱們鏈接到另外一個模型或做者更好;不過,您必須遵循這些設計原則,並學習如何在代碼中使用它。您能夠作的另外一件事是參加一門全面的面向對象的設計課程,如面向對象設計的堅實原則史提夫·史密斯在「普盧拉明」上。這對我理解和應用這些原則有很大幫助。框架
雖然學習任何設計原則或模式的最好方法是一個真實世界的例子,並理解違反該設計原則的後果,但本文的主題是介紹。面向對象設計原則對於Java程序員來講,他們要麼沒有公開,要麼處於學習階段。編程語言
我以爲這些OOP和實體設計原則須要一篇文章來解釋清楚,我將在這裏嘗試這樣作,但就目前而言,請作好準備,在設計原則上快速騎自行車,城鎮:)ide
咱們的第一個面向對象的設計原則是枯燥的,顧名思義。DRY(不要重複)意思是不要寫重複的代碼,而是使用抽象在一個地方抽象平常事物。模塊化
若是在兩個以上的地方有一個代碼塊,能夠考慮將其做爲一個單獨的方法,或者若是您屢次使用硬編碼的值,則將它們設置爲一個單獨的方法。公共終常數。這種面向對象的設計原則的好處在於維修.函數
重要的是不要濫用它,複製不是爲了代碼,而是爲了功能。
這意味着若是您使用了標準代碼來驗證OrderId 和SSN這並不意味着他們是同樣的,不然他們將在將來保持不變。工具
經過爲兩種不一樣的功能或事物使用標準代碼,您能夠永遠地將它們緊密結合在一塊兒,當OrderId更改其格式時,您的SSN驗證代碼就會中斷。
所以,要當心這種耦合,不要組合使用相似代碼但不相關的任何東西。您能夠進一步查看軟件體系結構基礎與設計模式在關於Udemy的Java課程中,學習更多關於編寫正確的代碼和在設計系統時應遵循的最佳實踐的知識。
在軟件領域,只有一件事是不變的,那就是「更改」,所以封裝您指望或懷疑未來會更改的代碼。
這種面向對象的設計原則的好處是很容易測試和維護正確的封裝代碼。
若是您使用Java編寫代碼,那麼遵循默認狀況下使變量和方法私有並逐步增長訪問權限的原則。
幾個Java中的設計模式使用封裝;工廠設計模式是封裝的一個例子,它封裝了對象建立代碼,並提供了在不影響現有代碼的狀況下引入新產品的靈活性。
順便說一句,若是您有興趣瞭解更多關於java和麪向對象編程中的設計模式的知識,那麼您必須檢查如下內容:設計模式庫關於普魯拉視野的課程。它是關於如何在現實世界中使用它們的設計模式和建議的最佳集合之一。
根據這一面向對象設計原則,「類、方法或函數應開放以供擴展(新功能),並關閉以進行修改。」
這是鮑勃叔叔在他的經典做品中提出的另外一個漂亮的堅實的設計原則。清潔碼本,這樣能夠防止某人更改已經嘗試和測試過的代碼。
這個設計原則的主要好處是嘗試過並測試過的代碼不受影響。這意味着他們不會崩潰。
下面是一個Java代碼示例違反開放式程序設計原則:
在此代碼中,GraphicEditor與形狀緊密耦合,若是須要新形狀,則須要在drawShape(Shape s)方法,這既容易出錯,也不可取。
理想狀況下,若是您只添加新功能,那麼您的代碼應該進行測試,這就是開放封閉設計原則的目標。
順便說一句,開閉原則是固體縮略詞的「O」。若是您想更多地瞭解這個原則,面向對象設計與體系結構的堅實原則關於Udemy的課程是最好的參考資源之一。
單責任原則是另外一個堅實的設計原則,在實體字縮寫中表明「S」。根據SRP,不該該有一個以上的緣由來改變一個類,或者一個級別應該始終處理單個功能。
這個原則的主要好處是它減小了軟件的各個組件與代碼之間的耦合。
例如,若是您在Java中的一個類中放置了多個功能,那麼它將引入耦合在兩個功能之間,即便您更改了一個特性,也有可能破壞耦合功能,這須要進行另外一輪測試,以免對生產環境產生任何意外。
你還能夠看到從0到1:設計模式-24 關於Udemy的課程,學習基於這個原則的模式。
不要要求依賴,它將由框架提供給您。這在Spring框架中獲得了很好的實現,Spring框架是編寫真正有價值的應用程序的最流行的Java框架之一。
這種設計原則的優勢在於,任何由DI框架注入的類都很容易用模擬對象進行測試,並且易於維護,由於對象建立代碼集中在框架中,而且客戶端代碼中並不散落着這些代碼。
有多種實現方法依賴注入,好比使用字節碼工具,一些AOP(面向方面編程)框架就像AspectJ那樣,或者像Spring同樣使用代理。
您能夠進一步看到面向對象設計與體系結構的堅實原則關於Udemy的課程,以瞭解更多關於這個有用的原則。它還表明固體縮略詞的「D」。
下面是一個違背依賴反轉原則或Java中DIP的代碼示例:
你能夠看到AppManager 取決於EventLogWriter 與AppManager。若是您須要使用其餘方式通知客戶端,好比發送推送通知、SMS或電子郵件,則須要更改AppManager 班級。
這個問題能夠用依賴反轉原理來解決。AppManager 索要EventLogWriter,它將由框架注入或提供給AppManager。
你還能夠看到用紮實的原則編寫更好的代碼--速成課程對Udemy更多地瞭解依賴反演原理以及如何解決這些問題。
重用您已經編寫的代碼的通常方法有兩種,即繼承和組合;二者各有優缺點,但通常來講,若是可能的話,您應該老是傾向於組合而不是繼承。
大家中的一些人可能會這麼說,但我發現構圖是否是比繼承.
經過在運行時設置屬性,組合容許在運行時更改類的行爲,經過使用接口組合類,咱們使用多態,它提供了在任什麼時候候以更好的實現代替的靈活性。
甚至約書亞·布洛赫有效Java建議傾向於組合而不是繼承。若是你尚未被說服,那麼你也能夠了解爲何組合比繼承更適合重用代碼和功能。
並且,若是你老是忘記這條規則,這是一個很好的卡通放在你的桌子上:-)
若是您對學習更多關於面向對象編程概念(如組合、繼承、關聯、聚合等)感興趣,也能夠查看Java中的面向對象編程關於古瑟拉的課程。
它能夠自由探索和學習可是,若是你也想參加練習、做業、評估,而且須要在你的LinkedIn我的資料中顯示證書,你將被收取費用。
根據Liskov替換原則,子類型必須是超級類型的替代I指使用超類類型的方法或函數必須可以使用對象子類,沒有任何問題「。
LSP關係密切對單一責任原則和界面分離原理.
若是類具備比子類更多的功能,則可能不支持某些功能,而且確實違反了LSP。
爲了跟隨LSP實體設計原理,派生類或子類必須加強功能,而不是減小它們。LSP表明固體縮略詞的「L」。
下面是一個違背Java中Liskov替換原則的代碼示例:
Liskov替換原理在Java中的應用
若是你有辦法area(Rectangle r),它計算矩形的面積,而後當您傳遞Square 由於Square 不是真正的長方形。
若是您對一個更真實的示例感興趣,那麼面向對象設計的堅實原則Pluralsight課程是一門很是好的課程。
接口隔離原則說明客戶端不該實現界面若是它不使用這個的話。
這種狀況主要發生在一個接口包含多個功能時,而客戶機只須要一個功能,而不須要其餘功能。
毫無疑問,接口設計是一項棘手的工做,由於一旦您釋放了您的接口,您就沒法在不破壞全部實現的狀況下更改它。固然,Java 8的默認或保護方法功能確實爲接口的發展提供了一種方式,但並非全部的編程語言都支持這些特性。
這種設計原則在Java中的另外一個好處是,接口的缺點是在任何類均可以使用它以前實現全部方法,所以擁有單一的功能意味着實現的方法更少。
若是您在編寫代碼時得不到接口的好處,那麼我建議您閱讀個人博客文章,Java中接口的實際使用瞭解更多。
程序員應該老是用於接口的程序,而不是用於實現的;將致使靈活的代碼,它能夠與接口的任何新實現一塊兒工做。
具體而言,您應該對變量使用接口類型,返回方法的類型。類Java中的參數類型SuperClass類型來存儲對象,而不是使用SubClass.
我是說
List numbers= getNumbers();
而不是
ArrayList numbers = getNumbers();
這也在許多Java書籍中獲得了建議,包括有效Java和頭第一設計模式書。
若是您對提升程序的代碼質量感興趣,我還建議您看看重構設計模式關於Udemy的課程,它將幫助您使用C#中的重構技術和設計模式來改進內部設計。
不要本身作全部的事情,把它委託給相應的班級。委託設計原則的經典例子是java中的equals()和hashCode()方法.
爲了比較兩個對象是否相等,咱們要求類自己進行比較,而不是進行比較。Client 作那個檢查。
這個設計原則的主要好處是沒有重複代碼並且很容易改變行爲。事件委託是此原則的另外一個示例,其中將事件委託給處理程序進行處理。
全部這些面向對象設計原則經過努力實現高內聚性和低耦合性,幫助您編寫靈活和更好的代碼。
理論是第一步,但最重要的是培養髮現什麼時候應用這些設計原則的能力.
一旦掌握了這一點,下一步就是學習Java中的設計模式,它使用這些設計模式來解決應用程序開發和軟件工程中常見的問題。
原做者:Java學習提高
原文連接: 每一個Java程序員都應該學習10條編碼原則
原出處:公衆號
侵刪