? 程序中的各種類(Class),包(package)等首先體現(xiàn)的是架構(gòu)設(shè)計(jì)中的一種概念分布. 一個(gè)良好的設(shè)計(jì)相當(dāng)于是建立一個(gè)結(jié)構(gòu)合理的概念框架, 隨著系統(tǒng)的不斷發(fā)展, 作為概念載體的類(Class)不斷吸收相關(guān)的實(shí)現(xiàn), 從而使其外延不斷豐富起來, 而其內(nèi)涵也愈加變得明晰. 系統(tǒng)中概念的分化, 最顯著的不是業(yè)務(wù)模塊的劃分, 而是技術(shù)層面與業(yè)務(wù)層面的分離. 因?yàn)榧夹g(shù)手段與業(yè)務(wù)在很大程度上是相互獨(dú)立的, 因?yàn)?[無論]實(shí)現(xiàn)什么樣的業(yè)務(wù), 我們[都]將用到某種技術(shù)手段.? 而當(dāng)我們可以回答一個(gè)"無論..都" 的問題的時(shí)候, 它意味著某個(gè)概念可以容納眾多變化, 而它自然有資格成為某種獨(dú)立的部分.?
? 作為技術(shù)層面概念聚集的例子, 我們可以看一下spring framework中的JdbcTemplate類, 這個(gè)類在spring的概念體系中對(duì)應(yīng)于"Jdbc調(diào)用幫助類"這一概念, 它的目的是幫助我們盡量通過一次函數(shù)調(diào)用得到我們所要的結(jié)果, 但是我已經(jīng)不止一次的看到很多人使用如下調(diào)用
?? List results = jdbcTemplate.query(...);
?? List ret = new ArrayList();
?? for(int i=0;i<results.size();i++){
???? ret.add(((Map)results.get(i)).get("someField"));
?? }
這段代碼的目的是為了得到某一列的值, 而JdbcTemplate類沒有直接提供這一函數(shù). 為了不等待spring的升級(jí), 顯然我們需要建立一個(gè)JdbcTemplate的擴(kuò)展類, 它直接提供一個(gè)queryScalarList函數(shù), 而不是讓這種純粹技術(shù)性的循環(huán)語句散見在程序代碼的各個(gè)角落.
? 告別裸奔編程是我對(duì)同事的基本要求之一. 即使是考慮最細(xì)致的軟件組件, 它也難以保證能夠預(yù)想到所有的變化形式, 而在系統(tǒng)中集成一些第三方組件的時(shí)候, 一般總要加入一些特定的假設(shè), 此時(shí)也需要一個(gè)技術(shù)隔離層. 例如在頁面開發(fā)中, 我們強(qiáng)制使用witrix平臺(tái)定義的js.Ajax對(duì)象, 而不是prototype.js中原始提供的Ajax.Updater等對(duì)象. 在應(yīng)用一段時(shí)間之后, js.Ajax對(duì)象上聚集了一系列與ajax相關(guān)的調(diào)用指令.
? 作為技術(shù)層面概念聚集的例子, 我們可以看一下spring framework中的JdbcTemplate類, 這個(gè)類在spring的概念體系中對(duì)應(yīng)于"Jdbc調(diào)用幫助類"這一概念, 它的目的是幫助我們盡量通過一次函數(shù)調(diào)用得到我們所要的結(jié)果, 但是我已經(jīng)不止一次的看到很多人使用如下調(diào)用
?? List results = jdbcTemplate.query(...);
?? List ret = new ArrayList();
?? for(int i=0;i<results.size();i++){
???? ret.add(((Map)results.get(i)).get("someField"));
?? }
這段代碼的目的是為了得到某一列的值, 而JdbcTemplate類沒有直接提供這一函數(shù). 為了不等待spring的升級(jí), 顯然我們需要建立一個(gè)JdbcTemplate的擴(kuò)展類, 它直接提供一個(gè)queryScalarList函數(shù), 而不是讓這種純粹技術(shù)性的循環(huán)語句散見在程序代碼的各個(gè)角落.
? 告別裸奔編程是我對(duì)同事的基本要求之一. 即使是考慮最細(xì)致的軟件組件, 它也難以保證能夠預(yù)想到所有的變化形式, 而在系統(tǒng)中集成一些第三方組件的時(shí)候, 一般總要加入一些特定的假設(shè), 此時(shí)也需要一個(gè)技術(shù)隔離層. 例如在頁面開發(fā)中, 我們強(qiáng)制使用witrix平臺(tái)定義的js.Ajax對(duì)象, 而不是prototype.js中原始提供的Ajax.Updater等對(duì)象. 在應(yīng)用一段時(shí)間之后, js.Ajax對(duì)象上聚集了一系列與ajax相關(guān)的調(diào)用指令.