? 愚蠢的實(shí)現(xiàn)各有各的蠢法,好的代碼有相似的氣質(zhì)濒憋。比如說吧悲伶,在一個(gè)既有的函數(shù)里增加一個(gè)分支郊尝,寫法包括
1. 敲一顆釘子進(jìn)去
foo()
{
? ? ……
? ? if(condition)
? ? ? ? ? {statements;}
? ? else
? ? ? ? {other statements;}
? ? ……
}
2. 稍微優(yōu)雅的敲一顆釘子秕铛,封裝個(gè)函數(shù)
foo()
{
……
? ? if(condition)
? ? ? ? ? func1();
? ? else
? ? ? ? func2();
……
}
3. 分離條件和行為
foo()
{
? ? funcs[] = {func1, func2};
? ? ……
? ? funcs[toFuncIdx(condition)]();
? ? ……
}
4.? 策略模式
//init.c
init()
{
? ? ……
? ? func = selector()
? ? ……
}
foo()
{
? ? ……
? ? func();
? ? ……
}
5. 設(shè)計(jì)一種DSL 語法描述它比如
def bhvname prototype {condition_i implement_i};
foo()
{
? ? ……
? ? bhvname();
? ? ……
}
方法5的好處是,隱藏了策略模式的實(shí)現(xiàn)細(xì)節(jié)缩挑。還可以再改進(jìn)但两,設(shè)計(jì)更完整的語法體系,只描述這個(gè)特定領(lǐng)域的業(yè)務(wù)本質(zhì)豹缀,將實(shí)現(xiàn)細(xì)節(jié)盡可能的隱藏叹俏。
講起道理來稠曼,大部分人至少在口頭承認(rèn)不應(yīng)該做霰彈式的改動(dòng),應(yīng)該封裝紧阔,應(yīng)該做一些設(shè)計(jì)。但具體coding的時(shí)候续担,方式1超級簡單啊擅耽。日積月累函數(shù)就長大了;有時(shí)候自己也看不過去了物遇,抽取一個(gè)函數(shù)局部改造一下秫筏;團(tuán)隊(duì)別的同學(xué)稍微有點(diǎn)追求,對某些改動(dòng)采用方法3或4來實(shí)現(xiàn)挎挖≌饩矗總之,怎么做的都有蕉朵,就一個(gè)具體的改動(dòng)而言崔涂,程序員總能找到一個(gè)理由說明自己為何以這種方式實(shí)現(xiàn)而非其它。代碼長得千奇百怪始衅。
大型項(xiàng)目冷蚂,這樣的問題后果尤為嚴(yán)重。
分析這個(gè)過程汛闸,核心問題是將決策點(diǎn)遺留到了最后一步蝙茶。coding的時(shí)候程序員才最終決策行為要怎么拆分,數(shù)據(jù)要怎么設(shè)計(jì)怎么封裝诸老,已經(jīng)最終采用的實(shí)現(xiàn)方式如何隆夯。架構(gòu)設(shè)計(jì),業(yè)務(wù)分析(BA)的原則和意圖沒辦法有效的傳遞下來别伏。最終coding的那個(gè)同學(xué)蹄衷,能力,眼界和職責(zé)都不足以讓他做出長期看最佳的設(shè)計(jì)和實(shí)現(xiàn)厘肮。他只關(guān)心這個(gè)需求盡快交付愧口,如何希望能對代碼演進(jìn)做出合適的判斷呢?
一個(gè)解是通過某種機(jī)制类茂,讓coding的人最終沒有選擇耍属,只能以某種(比較好的)方式來實(shí)現(xiàn)代碼托嚣,且并不需要大量知識(shí)和經(jīng)驗(yàn)來做判斷和選擇。
架構(gòu)師(組)應(yīng)該對系統(tǒng)做頂層設(shè)計(jì)厚骗,劃分業(yè)務(wù)邊界和抽取系統(tǒng)核心復(fù)雜度注益。在軟件設(shè)計(jì)方面的工作內(nèi)容包括定義
1. 系統(tǒng)的框架結(jié)構(gòu)(不是業(yè)務(wù)框架,而是分層結(jié)構(gòu)和核心元素)溯捆;
2. 行為和數(shù)據(jù)的種類丑搔,拆分的原則和必須標(biāo)明的屬性,
3. 根據(jù)這種拆分應(yīng)選擇的實(shí)現(xiàn)形式提揍;
4. 定義DSL和設(shè)計(jì)轉(zhuǎn)換器啤月,將1-3的內(nèi)容固化;
5. 抽取系統(tǒng)特有的基礎(chǔ)設(shè)施層劳跃。
6. 定義業(yè)務(wù)分析和開發(fā)的邊界和工作方式谎仲;
業(yè)務(wù)分析,將系統(tǒng)有效的分解刨仑,并定義開發(fā)所需要完成的元素郑诺。他們描述業(yè)務(wù)本質(zhì),一般并不關(guān)心最終代碼實(shí)現(xiàn)的形式杉武。
架構(gòu)組的工作在項(xiàng)目的早期和中期會(huì)非常繁重辙诞,架構(gòu)師輸出的并非文檔或PPT,而是非常具體的語法轻抱,轉(zhuǎn)換器飞涂,demo∑硭眩可以定義和約束后續(xù)的業(yè)務(wù)分析和開發(fā)较店。
我們談到資源前移時(shí),往往擔(dān)心前移了容燕,未必會(huì)帶來收益梁呈。對于注定長期運(yùn)行的大型項(xiàng)目,一方面要堅(jiān)定資源前移的信念蘸秘,反正一二十人投到故障解決中官卡,恐怕浩瀚的bug海上連一點(diǎn)漣漪都激不起來,不如放到前期設(shè)計(jì)和探索上去秘血,倒可能產(chǎn)生價(jià)值味抖;另一方面,總要給一套具體前移的方法灰粮,畫個(gè)餅說清楚如何更細(xì)致的做好設(shè)計(jì)。注意這個(gè)餅必須要能迭代交付忍坷。目標(biāo)宏大粘舟,夢想著上市敲鐘熔脂,卻拉不來一點(diǎn)投資,再報(bào)怨資本有眼無珠柑肴。投資要一輪一輪來霞揉,一方面看療效,另一方面資本被裹挾進(jìn)來了晰骑,花的越多适秩,資本自然會(huì)幫你一起想辦法,往往事就成了硕舆。