最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

軟件架構(gòu)的23個(gè)基本原則

2022-12-06 20:45 作者:數(shù)字化技術(shù)專(zhuān)家  | 我要投稿

軟件體系架構(gòu)基于一組適用于各種軟件系統(tǒng)的基本原則,有經(jīng)驗(yàn)的架構(gòu)師知道這些原則,并且能夠在軟件產(chǎn)品的正確位置實(shí)現(xiàn)特定的原則。下面我們快速瀏覽一下架構(gòu)師日常遵循的基本原則。 1. 依賴(lài)倒置(Dependency Inversion) 這一原則表明依賴(lài)的方向應(yīng)該是抽象的,而不是具體實(shí)現(xiàn)。如果編譯時(shí)依賴(lài)在運(yùn)行時(shí)執(zhí)行的方向上流動(dòng),就形成了直接依賴(lài)。通過(guò)依賴(lài)倒置,可以反轉(zhuǎn)依賴(lài)控制的方向。 2. 關(guān)注點(diǎn)分離(Separation of Concerns) 這一原則指出,軟件系統(tǒng)應(yīng)該按照所做的工作類(lèi)型來(lái)劃分。比方說(shuō)可以按照業(yè)務(wù)邏輯、基礎(chǔ)設(shè)施或用戶(hù)界面劃分為不同的部分。通過(guò)將系統(tǒng)劃分為基于不同活動(dòng)區(qū)域的不同部分,使得開(kāi)發(fā)/測(cè)試/部署更加容易。SoC是軟件架構(gòu)模式(如領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)、六邊形架構(gòu)、整潔架構(gòu))背后的驅(qū)動(dòng)力。 3. 控制反轉(zhuǎn)(Inversion of Control) 該原則類(lèi)似于依賴(lài)倒置原則,但適用于更廣泛的背景。IoC反轉(zhuǎn)了由不同的第三方框架(如Spring Framework)管理的控制流。與傳統(tǒng)Java EE程序(由開(kāi)發(fā)工程師按程序初始化Beans)不同,Spring控制Bean的配置,這意味著控制倒置。 4. 依賴(lài)注入(Dependency Injection) 該原則意味著依賴(lài)應(yīng)該在運(yùn)行時(shí)通過(guò)構(gòu)造函數(shù)注入。在下面的例子中,Action Interface通過(guò)HumanAction Implementation注入到Human類(lèi)中,從而決定在運(yùn)行時(shí)實(shí)現(xiàn)哪個(gè)特定的動(dòng)作。這種技術(shù)提供了控制依賴(lài)的靈活性: package az.alizeynalli.di; public interface Action { void do(); } public class HumanAction implements Action { @Override public void do() { System.out.print("run"); } } public class Human { Action action; public Human(Action action) { this.action = action; } @Override public void do() { actoin.do(); } } public static void main(String[] args) { Human human = new Human(new HumanAction); human.do(); } 5. 單一職責(zé)(Single Responsibility) 該原則的主要思想是限定軟件系統(tǒng)的每個(gè)構(gòu)建塊只承擔(dān)唯一的責(zé)任。無(wú)論構(gòu)建塊的作用域是什么,是插件、包、類(lèi)、函數(shù),甚至是變量,應(yīng)該只有一個(gè)職責(zé)。這篇文章更深入的討論了這一原則: https://medium.com/p/6b886f6d943e 6. DRY(Don’t Repeat Yourself) 該原則旨在通過(guò)避免重復(fù)代碼來(lái)消除冗余。如果存在針對(duì)某些行為的現(xiàn)有功能,則應(yīng)該重復(fù)使用,而不是在多個(gè)實(shí)例中拷貝相同的代碼片段。 每個(gè)知識(shí)片段在系統(tǒng)中都必須有單一、明確、權(quán)威的表示。 7. 開(kāi)閉原則(Open-Closed) 軟件構(gòu)件應(yīng)該對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。 這一原理的簡(jiǎn)單描述首先是由Bertrand Meyer提出的。每次都需要修改的軟件系統(tǒng)只會(huì)變得一團(tuán)糟,并且這種混亂的程序很容易在每次修改時(shí)出現(xiàn)錯(cuò)誤。每個(gè)新功能都應(yīng)該最大限度的增加新代碼,最小限度減少舊代碼的更改,理想情況下對(duì)舊代碼的更改為零。 8. 持久化透明(Persistence Ignorance) 持久化透明的理念是,代碼應(yīng)該不受任何數(shù)據(jù)庫(kù)或持久性技術(shù)的影響。業(yè)務(wù)邏輯應(yīng)該與任何技術(shù)無(wú)關(guān)。如果明天,有更好、更有效、更便宜的持久化技術(shù),應(yīng)該能夠以不影響上層抽象的方式改變系統(tǒng)的這一部分。 9. YAGNI 全稱(chēng)為 You ain’t gonna need it. —— 這一原則試圖避免軟件系統(tǒng)的過(guò)早優(yōu)化。開(kāi)發(fā)人員通常會(huì)在系統(tǒng)中過(guò)度設(shè)計(jì)一些東西,以期在將來(lái)的某個(gè)時(shí)候會(huì)有幫助,但這一時(shí)刻往往不會(huì)到來(lái)。 10. 童子軍規(guī)則(Boy Scout Rule) 在離開(kāi)的時(shí)候要讓露營(yíng)地比來(lái)的時(shí)候更干凈。 這里的主要思想是,當(dāng)開(kāi)發(fā)時(shí)遇到反模式,要堅(jiān)持重構(gòu)代碼。隨著時(shí)間的推移,這會(huì)提高代碼質(zhì)量。 11. 里氏替換原則(Liskov-Subsititution) 如果對(duì)于每個(gè)類(lèi)型為S的對(duì)象o1,都有一個(gè)類(lèi)型為T(mén)的對(duì)象o2,這樣對(duì)于用T定義的所有程序P,當(dāng)o1取代o2時(shí),P的行為不變,那么S就是T的子類(lèi)型。 Barbara Liskov的這個(gè)定義可能聽(tīng)起來(lái)很混亂,但本質(zhì)上這個(gè)原則簡(jiǎn)單易懂。如果重述上面的定義,該原則的意思是: 在使用繼承時(shí),繼承的層次結(jié)構(gòu)應(yīng)該在功能和業(yè)務(wù)邏輯方面保持一致。子類(lèi)應(yīng)該是可以相互替換的,并且不能改變父類(lèi)的行為。作為一個(gè)簡(jiǎn)單的例子,可以用“臭名昭著的正方形/矩形”問(wèn)題。其中正方形不應(yīng)該是矩形的子類(lèi)型,因?yàn)檫@兩個(gè)幾何形狀的高度和長(zhǎng)度的定義是不同的(正方形的高度和長(zhǎng)度是相等的,而矩形的高度和長(zhǎng)度是不同的)。 12. 封裝(Encapsulation) 軟件系統(tǒng)的不同構(gòu)建塊應(yīng)該通過(guò)封裝來(lái)限制外界對(duì)其組件的訪問(wèn),可以通過(guò)在類(lèi)范圍內(nèi)設(shè)置組件為私有或在插件范圍內(nèi)設(shè)置訪問(wèn)限制來(lái)實(shí)現(xiàn)(就Java而言),從而隱藏信息。 13. 松耦合(Loose Coupling) 軟件架構(gòu)中最重要的原則之一是松耦合,這一原則表明軟件系統(tǒng)的依賴(lài)關(guān)系應(yīng)該松散,系統(tǒng)的一部分發(fā)生變化,對(duì)其他部分的影響應(yīng)該最小。松耦合可以通過(guò)依賴(lài)倒置、異步消息中間件、事件源等實(shí)現(xiàn)。 下面的文章深入探討了軟件工程中不同形式的耦合: https://medium.com/p/4d5cf2b3e99e 14. 內(nèi)聚(Cohesion) 內(nèi)聚是指模塊內(nèi)的元素依賴(lài)的程度。某種意義上說(shuō),是對(duì)類(lèi)的方法和數(shù)據(jù)以及該類(lèi)所服務(wù)的某種統(tǒng)一目的或概念之間關(guān)系強(qiáng)度的度量。 構(gòu)建高內(nèi)聚的類(lèi)是一種最佳實(shí)踐,有利于實(shí)現(xiàn)單一責(zé)任原則、松耦合等。 15. 接口隔離(Interface Segregation) 接口隔離原則指出,不應(yīng)強(qiáng)迫客戶(hù)端依賴(lài)不使用的方法。 應(yīng)該明確的是,這個(gè)原則主要適用于靜態(tài)類(lèi)型的編程語(yǔ)言,如Java、C等。在像Python或Ruby這樣的動(dòng)態(tài)類(lèi)型語(yǔ)言中,這個(gè)原則沒(méi)有太大意義。 可以想象這樣一種情況,我們的Income和Expense用例都依賴(lài)于支持這兩種用例的業(yè)務(wù)邏輯功能。因此Income用例的很多依賴(lài)都和Expense用例相關(guān),而Expense用例的依賴(lài)情況也有相同的問(wèn)題。基于以上討論,ISP違規(guī)情況如下。 package az.alizeynalli.cashflow.core.service; public interface ConverterService { Income convertIncome(Income income); Expense convertExpense(Expense expense); } @Component public class ExpenseConverterServiceImpl implements ConverterService { @Override public Income convertIncome(Income income) { throw new UnsupportedOperationException(); } @Override public Expense convertExpense(Expense expense) { // convert expense here return expense; } } @Component public class IncomeConverterServiceImpl implements ConverterService { @Override public Income convertIncome(Income income) { // convert income here return income; } @Override public Expense convertExpense(Expense expense) { throw new UnsupportedOperationException(); } } 16. 限界上下文(Bounded Context) 限界上下文是領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的中心模式。通過(guò)將大型應(yīng)用程序或組織分解為單獨(dú)的概念模塊,提供了一種處理復(fù)雜性的方法。每個(gè)概念模塊代表一個(gè)上下文,該上下文與其他上下文分離(因此是有邊界的),并且可以獨(dú)立發(fā)展。理想情況下,每個(gè)限界上下文應(yīng)該可以自由的為其中的概念選擇自己的名稱(chēng),并且應(yīng)該獨(dú)占的訪問(wèn)自己的持久化存儲(chǔ)。 17. 依賴(lài)穩(wěn)定原則(Stable Dependencies) 這一原則指出,軟件系統(tǒng)的不同構(gòu)建塊應(yīng)該只依賴(lài)于可靠、穩(wěn)定的工件。這個(gè)原則在Docker鏡像術(shù)語(yǔ)中更有意義,當(dāng)我們從docker hub導(dǎo)入不同的依賴(lài)時(shí),甚至不知道它們是否可靠/穩(wěn)定。 18. 多態(tài)(Polymorphism) 這實(shí)際上屬于面向?qū)ο缶幊痰?大支柱,鼓勵(lì)使用可以以多種形式提供的接口,多態(tài)性意味著具有多種形式的實(shí)體。 19. 模塊化(Modularization) 模塊化是將軟件系統(tǒng)劃分為多個(gè)獨(dú)立模塊的過(guò)程,每個(gè)模塊獨(dú)立工作。這一原則是應(yīng)用于軟件系統(tǒng)靜態(tài)架構(gòu)的單一職責(zé)分離原則的另一種形式。 20. 抽象(Abstraction) 這也屬于面向?qū)ο缶幊痰乃拇笾е? 在研究物體或系統(tǒng)時(shí)去除物理的、空間的或時(shí)間的細(xì)節(jié)或?qū)傩砸约凶⒁饬τ诟匾牟糠?,本質(zhì)上與泛化過(guò)程相似。 21. KISS(Keep It Simple, Stupid) 按照字面意思理解,這一原則激勵(lì)工程師保持代碼簡(jiǎn)單和愚蠢(容易理解),避免他人誤解。 22. 增量/迭代方法(Incremental/Iterative Approach) 這一原則是敏捷軟件開(kāi)發(fā)宣言的基礎(chǔ),基于軟件系統(tǒng)應(yīng)該以增量和迭代的方式開(kāi)發(fā)的思想,每一次迭代都會(huì)增加系統(tǒng)功能并保證其運(yùn)行。 23. 最少知識(shí)原則(Least Knowledge) 或者叫信息嫉妒(information envying),是封裝或信息隱藏原則的另一個(gè)術(shù)語(yǔ),規(guī)定軟件系統(tǒng)的不同部分應(yīng)該只擁有需要的知識(shí)。

軟件架構(gòu)的23個(gè)基本原則的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
龙山县| 镇原县| 阿荣旗| 九寨沟县| 阿坝县| 浦北县| 衡阳市| 济宁市| 禹城市| 平罗县| 荥经县| 武穴市| 永和县| 个旧市| 宜州市| 东辽县| 新疆| 于都县| 凤城市| 淳化县| 准格尔旗| 杭锦旗| 云霄县| 义乌市| 南丰县| 丽水市| 大同县| 陈巴尔虎旗| 共和县| 三亚市| 红安县| 成安县| 焦作市| 高青县| 延安市| 香河县| 双牌县| 杭州市| 左云县| 翁源县| 平罗县|