難道一開始就要代碼設計做得復雜嗎?

      網(wǎng)友投稿 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小時內刪除侵權內容。

      上一篇:Atlas 200DK 開發(fā)環(huán)境搭建
      下一篇:云市場11月新品一覽
      相關文章
      亚洲免费观看在线视频| 亚洲精品动漫在线| 亚洲男人的天堂在线| 夜夜春亚洲嫩草影院| 亚洲成A人片在线观看无码3D| 亚洲人成电影网站色| 亚洲影视自拍揄拍愉拍| 亚洲国产美女在线观看| 亚洲福利电影一区二区?| 亚洲Aⅴ无码专区在线观看q| 国产成人精品日本亚洲| 亚洲国产日韩在线视频| 国产亚洲真人做受在线观看| 亚洲精品国产字幕久久不卡| 国产亚洲精AA在线观看SEE| 亚洲国产精品福利片在线观看 | 国产AV无码专区亚洲AVJULIA | 伊伊人成亚洲综合人网7777| 77777亚洲午夜久久多人| 亚洲真人无码永久在线| 亚洲精品亚洲人成在线观看| 日韩va亚洲va欧洲va国产| 亚洲AV日韩AV天堂久久| 亚洲自偷自拍另类图片二区| 亚洲电影中文字幕| 久久久亚洲欧洲日产国码是AV| 亚洲精品韩国美女在线| 亚洲Av高清一区二区三区| 亚洲精品美女网站| 亚洲AV无码资源在线观看| 青青青亚洲精品国产| 亚洲av成人无码网站…| 亚洲欧洲国产成人综合在线观看 | 亚洲精品无码专区2| 日韩亚洲变态另类中文| 国产L精品国产亚洲区久久| 国产亚洲精品a在线观看| 久久久久亚洲精品无码系列| 久久久久亚洲AV无码观看 | 在线观看国产一区亚洲bd| 亚洲成AV人影片在线观看|