無代碼開發(fā)平臺(國內無代碼開發(fā)平臺推薦)">國內無代碼開發(fā)平臺(國內無代碼開發(fā)平臺推薦)
616
2022-05-30
看著自己每次根據(jù)設計原則及模式的代碼重構,雖然效果還不錯,但你肯定也自省過:
如果我的每段代碼都這么寫,是不是過度設計了?把握設計的度,確需長久錘煉。行業(yè)也總結了很多原則,幫助我們把握設計的度。它們是一種思考方法、一種行為準則。
KISS
Keep it simple, stupid,保持簡單、愚蠢。
提醒我們大多數(shù)系統(tǒng),與其變得復雜,保持簡單能讓系統(tǒng)運行更好。
越資深的人,越覺得這大有道理。因為大佬們見識過因為復雜而引發(fā)的各種問題。
堆太多功能,調整起來就很費勁。具體到一些場景:
有現(xiàn)成庫,就不自己寫
能用文本做協(xié)議,就別用二進制
方法越短小精悍越好
能把一個基本流程打通,軟件就能發(fā)布,無需那么多功能(MVP)
看起來很接地氣??!真是吸引crud boy呢,但無法指導具體的工作。因為,啥叫保持簡單,怎么就叫復雜?這都沒有標準。
所以,有人基于自己的理解給了具體原則:
YAGNI
You aren’t gonna need it,你用不著它。如非必要,勿增功能。
軟件設計對抗的是需求規(guī)模:
通過努力,讓軟件在需求規(guī)模膨脹之后,依然能平穩(wěn)發(fā)展
努力控制需求規(guī)模
很多需求不需要做。很多產(chǎn)品經(jīng)理以為很重要的功能實際上是沒什么用的。真正重要的功能大約只占20%,80%的功能可能大多數(shù)人都用不到。做了更多的功能,并不會得到更多的回報,但是,做了更多的功能,軟件本身卻會不斷地膨脹,越發(fā)難以維護。
所以,在現(xiàn)實經(jīng)??吹揭恍┕δ芎唵蔚臇|西不斷涌現(xiàn),去顛覆更復雜的東西。比如,雖然Word已經(jīng)很強大了,但對于很多人而言,它還只是一個寫字的工具,甚至它的重點排版功能都用得非常少。而Markdown簡單地讓我們專注寫內容,而且簡單的幾個排版標記在日常溝通中就完全夠用了。
盡量可能不去做不該做的事,從源頭堵住問題吧!
DRY
Don’t repeat yourself,不要重復自己。在一個系統(tǒng)中,每一處知識都必須有單一、明確、權威地表述。Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.
最簡單理解:“不要做cv工程師”。這還遠遠不夠,DRY針對的是你對知識和意圖的復制:在兩個不同地方的兩樣東西表達形式不同,但表達內容卻可能相同。
如下打印賬戶信息,這種寫法肯定很常見:
public void printBalance(final Account account) { System.out.printf("Debits: %10.2f\n", account.getDebits()); System.out.printf("Credits: %10.2f\n", account.getCredits()); if (account.getFees() < 0) { System.out.printf("Fees: %10.2f-\n", -account.getFees()); } else { System.out.printf("Fees: %10.2f\n", account.getFees()); } System.out.printf(" ----\n"); if (account.getBalance() < 0) { System.out.printf("Balance: %10.2f-\n", -account.getBalance()); } else { System.out.printf("Balance: %10.2f\n", account.getBalance()); } }
這段隱藏一些重復。比如,對負數(shù)的處理顯然是復制的,可通過增加一個方法消除:
String formatValue(final double value) { String result = String.format("%10.2f", Math.abs(value)); if (value < 0) { return result + "-"; } else { return result + " "; } } void printBalance(final Account account) { System.out.printf("Debits: %10.2f\n", account.getDebits()); System.out.printf("Credits: %10.2f\n", account.getCredits()); System.out.printf("Fees:%s\n", formatValue(account.getFees())); System.out.printf(" ----\n"); System.out.printf("Balance:%s\n", formatValue(account.getBalance())); }
數(shù)字字段格式反復出現(xiàn),不過,格式與我們抽取出來的方法是一致的,所以,可以復用一下:
String formatValue(final double value) { String result = String.format("%10.2f", Math.abs(value)); if (value < 0) { return result + "-"; } else { return result + " "; } } void printBalance(final Account account) { System.out.printf("Debits: %s\n", formatValue(account.getDebits())); System.out.printf("Credits: %s\n", formatValue(account.getCredits())); System.out.printf("Fees:%s\n", formatValue(account.getFees())); System.out.printf(" ----\n"); System.out.printf("Balance:%s\n", formatValue(account.getBalance())); }
打印格式其實也重復,如果我要在標簽和金額之間加一個空格,相關的代碼都要改,所以,這也是一個可以消除的重復:
String formatValue(final double value) { String result = String.format("%10.2f", Math.abs(value)); if (value < 0) { return result + "-"; } else { return result + " "; } } void printLine(final String label, final String value) { System.out.printf("%-9s%s\n", label, value); } void reportLine(final String label, final double value) { printLine(label + ":", formatValue(value)); } void printBalance(final Account account) { reportLine("Debits", account.getDebits()); reportLine("Credits", account.getCredits()); reportLine("Fees", account.getFees()); System.out.printf(" ----\n"); reportLine("Balance", account.getBalance()); }
重構后:
改金額打印格式,就去改formatValue
改標簽格式,就去改reportLine
有人說這種調整粒度太小。如你這樣感覺,證明你看問題的粒度太大。品味這個修改,與分離關注點和單一職責原則異曲同工:粒度要小。
DRY不局限于寫代碼:
注釋和代碼之間存在重復,可以嘗試把代碼寫得更清晰
內部API在不同的使用者之間存在重復,可以通過中立格式進行API的定義,然后用工具生成文檔、模擬 API 等等
開發(fā)人員之間做的事情存在重復,可以建立溝通機制降低重復;
……
都是在試圖減少重復,其實也是減少了維護成本。
簡單設計
Simple Design,提出者Kent Beck,只包含如下規(guī)則,后3條規(guī)則是重構方向
1 通過所有測試
保證系統(tǒng)能夠按照預期工作。怎么知道系統(tǒng)按照預期工作,就需要有配套自動化測試,最好能TDD,最根本的還是要懂設計,否則,你的代碼就是不可測。
2 消除重復
正如DRY原則所說,你得能發(fā)現(xiàn)重復,就需要你對分離關注點有理解
3 表達出程序員的意圖
編寫有表達性的代碼,這也需要你對“什么是有表達性的代碼”有認識。代碼要說明做什么,而不是怎么做
4 讓類和方法的數(shù)量最小化
讓類和方法的數(shù)量最小化,則告訴我們不要過度設計,除非你已經(jīng)看到這個地方必須要做一個設計,比如,留下適當?shù)臄U展點,否則,就不要做。
能做出過度設計的前提,是已經(jīng)懂得了各種設計,這時才需要用簡單設計的標準對自己進行約束。所以,所謂簡單設計,對大多數(shù)人并不“簡單”。
沒有良好設計,代碼就沒有可測試的接口,根本沒有辦法測試,TDD也就無從談起。不懂設計,重構就只是簡單提取方法,改改名字,對代碼的改進也是相當有限的。
當然了,簡單設計的前提是,把編程基礎打牢。片面地追求敏捷實踐,而忽視基本功,是舍本逐末。
API
版權聲明:本文內容由網(wǎng)絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內刪除侵權內容。