好男人天堂网,久久精品国产这里是免费,国产精品成人一区二区,男人天堂网2021,男人的天堂在线观看,丁香六月综合激情

當(dāng)前位置:首頁(yè) > 網(wǎng)站舊欄目 > 學(xué)習(xí)園地 > 設(shè)計(jì)軟件教程 > Domain Pollution Resolution 域污染解除

Domain Pollution Resolution 域污染解除
2010-01-14 22:31:01  作者:  來(lái)源:
Domain Pollution Resolution
域污染解除

0. Domain 名詞解釋
首先說(shuō)明一下 Domain 在本文中的意思。
<<Domain Driven Design>> 一書(shū),令 Domain 這個(gè)詞很火。引起了廣泛爭(zhēng)論:哪些Logic 應(yīng)該放在 Business Service Layer, 哪些應(yīng)該放在 Domain Object里面。這類(lèi)爭(zhēng)論紛紛揚(yáng)揚(yáng),最后通常都上升到哲學(xué)高度,世界觀高度,認(rèn)知心理學(xué)高度。如果不幸發(fā)展到極端情況,雙方很可能開(kāi)始相互質(zhì)疑對(duì)方的智商和對(duì)世界的基本理解能力。
這個(gè)層次的Domain 紛爭(zhēng),不是本文所關(guān)心的話題。
我一向認(rèn)為,設(shè)計(jì)能夠滿足如下的條件,就可以稱為是一個(gè)好的設(shè)計(jì):能夠使用多態(tài)性,代替Hard-Coded if else switch 等邏輯分支;新需求來(lái)的時(shí)候,不需要在舊代碼里面添加if else switch等邏輯分支,而只需要加入一個(gè)新的Class;盡量避免 Package, Class 級(jí)別的交叉引用。

本文所關(guān)心的Domain 是一個(gè)更高的層次,類(lèi)似于DSL, Domain Specific Language 里面的Domain的意思。
本文主要討論如下議題:

HTML是否只應(yīng)該用來(lái)表示結(jié)構(gòu)?
HTML是否應(yīng)該包含邏輯?
HTML是否應(yīng)該包含服務(wù)器端腳本邏輯?比如,JSP, Velocity, Freemarker.
HTML是否應(yīng)該包含瀏覽器端腳本邏輯?比如,Java Script.

Java 代碼中是否應(yīng)該輸出HTML標(biāo)簽?比如,Taglib, Tapestry Page Component, etc?
Java 代碼中是否應(yīng)該使用框架特殊的HTML View Model? 比如,XMLC, Wicket, Echo, etc.

HTTP Web Server本來(lái)的設(shè)計(jì)宗旨是無(wú)狀態(tài),支持大用戶量,多連接。目前的server side的page flow, web flow, continuation, 力圖使得HTTP Web Server保持用戶的流程狀態(tài)。這種做法是否應(yīng)該推薦?

SQL是一種可讀性很好,應(yīng)用廣泛的一種DSL。如何動(dòng)態(tài)拼裝SQL,一直是一個(gè)難以解決的問(wèn)題。
是否應(yīng)該在Java 代碼中嵌入SQL?
是否應(yīng)該在Java 代碼中使用 Criteria API?
是否應(yīng)該在SQL Template中加入動(dòng)態(tài)語(yǔ)言腳本邏輯?比如 iBatis 使用XML if otherwise,  OR Bridge中使用velocity?
HQL, OQL在SQL中引入了OO語(yǔ)言的特性,似乎操作的是對(duì)象數(shù)據(jù)庫(kù),而不是關(guān)系數(shù)據(jù)庫(kù)。這種做法是否應(yīng)該推薦?

Hibernate 動(dòng)態(tài)期間篡改用戶代碼的做法,是否應(yīng)該推薦?
JDO靜態(tài)期間篡改擁護(hù)代碼的做法,是否應(yīng)該推薦?

Dynamic Proxy, CGLib等動(dòng)態(tài)篡改用戶代碼的做法,是否應(yīng)該推薦?
Reflection繞開(kāi)了 Java 的類(lèi)型檢查機(jī)制,是否應(yīng)該推薦?
Thread Local是一種隱式契約,相當(dāng)于繞開(kāi)了顯式契約(方法簽名method signature),這種做法是否應(yīng)該推薦?

這些屬于開(kāi)發(fā)模式、代碼風(fēng)格方面的問(wèn)題,正如所謂Code Smell的感覺(jué)一樣,也避免不了主觀的成分。所以,下面的陳述并非論斷,而只是“在我看來(lái)”。

1. HTML Template Layer
HTML應(yīng)該盡量只用來(lái)表示結(jié)構(gòu),排除所有邏輯。
JSP, Velocity, Freemarker等服務(wù)器端腳本邏輯,屬于Java Code或者Script Code對(duì)HTML的污染。
不僅應(yīng)該排除JSP, Velocity, Freemarker等服務(wù)器端腳本邏輯,而且應(yīng)該排除瀏覽器端腳本邏輯,比如Java Script.
當(dāng)然,這里不是說(shuō),不用Java Script,而是說(shuō),不要把Java Script放在HTML里面。把Java Script放在一個(gè)單獨(dú)的.js文件里面,在HTML中引入,并使用CSS把HTML Element 和 Java Script Event Handler 聯(lián)系起來(lái)。
這方面的資料有:
Unobtrusive Javascript
http://www.onlinetools.org/articles/unobtrusivejavascript/
http://www.kryogenix.org/code/browser/aqlists/
http://www.bobbyvandersluis.com/articles/goodpractices.php

如何排除HTML中的Server Side Logic呢?
Ajax!
Ajax fans一定反應(yīng)迅速,給出答案。
沒(méi)錯(cuò)。Ajax可以做到。Ajax的主要問(wèn)題在于使用和掌握難度。
除了Ajax呢?
有幾個(gè)選擇,XMLC, Jivan, fastm, Wicket, Echo等。(and Tapestry?)

fastm是我做的一個(gè)模板層,具體內(nèi)容可以在此下載。
https://fastm.dev.java.net/files/documents/1911/25042/fastm1.0c.zip

fastm采用 XML Comment 作為文檔結(jié)構(gòu)標(biāo)記。注意,是結(jié)構(gòu)標(biāo)記,而不是邏輯標(biāo)記。不含有for if else。
可見(jiàn),fastm并不是毫無(wú)污染,只是沒(méi)有邏輯污染。fastm只在HTML中添加了自定義的結(jié)構(gòu)標(biāo)簽,也勉強(qiáng)算沒(méi)有違背HTML只用來(lái)表示結(jié)構(gòu)的原意。
Ajax, XMLC, Jivan 的HTML很干凈,而且對(duì)HTML 結(jié)構(gòu)的控制能力很強(qiáng),能夠用代碼動(dòng)態(tài)控制布局。fastm也能夠動(dòng)態(tài)控制布局。Site mesh, tiles taglib, jsp, velocity, freemarker等做不到。
fastm 里面的例子中,包括一個(gè)分頁(yè)的例子,和一個(gè)動(dòng)態(tài)組裝SQL的例子

2. Java Web Layer
Taglib, Tapestry Page Component, Echo, Wicket等在Java 代碼中輸出HTML標(biāo)簽,這也是一種,而且要求在Java 代碼中使用框架特殊的HTML View Model,比如Table, List, Label, Formbean 等View Object。使用了這些框架,Java 代碼的編譯就需要依賴于這些框架了。
這相當(dāng)于HTML標(biāo)簽對(duì)Java 代碼的污染。
JSP, Velocity, Freemarker都不存在這種情況。Java 代碼只是提供POJO,然后 HTML里面的Server Side Script使用這些POJO.
fastm不支持邏輯,所以這個(gè)方面弱一些。fastm要求Java Code把if, else 等邏輯分支變成一個(gè)Map 結(jié)構(gòu)。由于Map屬于java的基本類(lèi),所以,fastm也不需要在Java code中使用任何特殊的框架相關(guān)的view model。
3. Web Layer - Stateless or Stateful
與其在服務(wù)器端支持 page flow, web flow, continuation,那不如在瀏覽器端支持狀態(tài)。這種場(chǎng)合下,我覺(jué)得,正是使用Ajax的最佳場(chǎng)所。
我傾向于這樣的設(shè)計(jì),服務(wù)器端盡量無(wú)狀態(tài),如果確實(shí)需要狀態(tài),那么盡量在瀏覽器段保持狀態(tài)。
lightweb是我做的一個(gè)Web框架。
https://lightweb.dev.java.net/files/documents/4371/25044/lightweb0.9b.zip

主要的特點(diǎn)是,URL-Centric, 鼓勵(lì)無(wú)狀態(tài)的Service Oriented設(shè)計(jì)。支持三種Service模型,
Action (like WebWork Action),
Controller (like Spring MVC Controller),
Channel (like Struts Action Dispatcher),

lightweb支持多級(jí)模塊尋找,使用幾條匹配規(guī)則,代替龐大的Site Map 配置文件。
lightweb查找View的時(shí)候,不是根據(jù)Site Map 文件里面的那種小型狀態(tài)機(jī)的配置(success -> showIt.jsp;  fail-> this page), 而是直接資源定位。lightweb繼承了fastm的觀點(diǎn),把template看作資源,而不是一段運(yùn)行腳本。

Lightweb設(shè)計(jì)為IoC友好。在各個(gè)環(huán)節(jié)都暴露出插件接口。程序員可以自己選擇IoC策略。可以采用一般的做法,用一個(gè)IoC container集中管理,比如,Spring IoC, Pico, Nano等;也可以分散到各子模塊,進(jìn)行管理;也可以分散到每個(gè)Action Validator里面管理。

4. ORM Layer
Hibernate 動(dòng)態(tài)期間篡改用戶代碼,JDO靜態(tài)期間篡改用戶代碼。
令我想起黑客,木馬,夾帶,偷梁換柱等。這屬于語(yǔ)義上的Pollution。就是說(shuō),從原有的Source看起來(lái),Domain Object并沒(méi)有那樣的行為,運(yùn)行起來(lái)卻有那樣的行為。
iBatis采用reflection,確實(shí)干凈。但是,性能、功能上又不夠強(qiáng)大。某些功能的實(shí)現(xiàn),確實(shí)需要代碼生成。
lightor是我做的一個(gè)ORM框架。
https://lightor.dev.java.net/files/documents/4370/25043/lightor0.5a.zip

lightor也需要代碼生成。區(qū)別在于,lightor不修改任何代碼,只是產(chǎn)生新的Mapper代碼。Domain Object運(yùn)行的時(shí)候,還是你原來(lái)的Domain Object。這就避免了語(yǔ)義的污染。
lightor生成的Mapper代碼,可以編譯期類(lèi)型檢查,可以閱讀,跟蹤,調(diào)試。這些生成的代碼,也都遵循本文的原則。Java 代碼里面不含有SQL片斷,SQL都存在于單獨(dú)的資源文件中。
(另外,不采用CGLib,也是為了實(shí)現(xiàn)的簡(jiǎn)單)
lightor直接使用Native SQL。Lightor的目的不是屏蔽關(guān)系數(shù)據(jù)庫(kù),而是恰好相反。lightor的目的是,幫助程序員更清楚地認(rèn)識(shí)關(guān)系數(shù)據(jù)庫(kù),SQL,JDBC。lightor和JDBC不沖突,可以一起使用。
lightor努力的第一個(gè)主要方向就是效率。大數(shù)據(jù)量查詢和處理的效率。
據(jù)我所知,目前只有l(wèi)ightor才支持大數(shù)據(jù)量批量處理,因?yàn)橹挥衛(wèi)ightor不惜降低ORM的身份和封裝層次,能夠接受ResultSet作為參數(shù)。
lightor的緩存策略比Hibernate更前進(jìn)了一步,把query cache 和 ID Cache集成在一起。以便得到更好的控制。并且,把緩存API暴露給程序員,以便智能的控制某個(gè)特定的緩存。

5. SQL
HQL, OQL在SQL中引入了OO語(yǔ)言的特性,似乎操作的是對(duì)象數(shù)據(jù)庫(kù),而不是關(guān)系數(shù)據(jù)庫(kù)。
我感覺(jué),這是一種語(yǔ)法層次上的Domain Pollution。OO語(yǔ)法對(duì)SQL語(yǔ)法的污染。
正如感覺(jué)LinkQ是數(shù)據(jù)庫(kù)查詢語(yǔ)法對(duì)OO語(yǔ)法的污染。
Java 代碼中使用 Criteria API,也屬于數(shù)據(jù)庫(kù)查詢領(lǐng)域?qū)O領(lǐng)域的污染。

SQL是一種可讀性很好,應(yīng)用廣泛的一種DSL。
我的看法是,盡量把完整的SQL放到單獨(dú)的資源文件中,可以直接Copy到SQL Client就可以運(yùn)行。特殊優(yōu)化過(guò)的Native SQL,也是同樣的地位。
HQL, OQL阻礙了用戶對(duì)SQL進(jìn)行特殊優(yōu)化。

如何動(dòng)態(tài)拼裝SQL,一直是一個(gè)難以解決的問(wèn)題。
直接在Java 代碼中嵌入SQL,肯定不行。前面說(shuō)了,Java里面最好不要有SQL片斷,最好放到另外的資源文件中。
在Java 代碼中使用 Criteria API? 前面也否定了。
在SQL Template中加入動(dòng)態(tài)語(yǔ)言腳本邏輯?比如 iBatis 使用XML if otherwise,  OR Bridge中使用velocity?
這種方法還是不錯(cuò)。不過(guò)仍然在SQL里面引入了腳本邏輯。
我也沒(méi)有好的做法。我采用fastm來(lái)處理。在SQL里面引入結(jié)構(gòu)標(biāo)記。這也相當(dāng)于污染。因?yàn)镾QL和HTML不同。SQL不是描述結(jié)構(gòu)的,而是一門(mén)DSL。
這種做法的一個(gè)好處是,整段SQL還是可以Copy到SQL Client里面,稍微修改一番,就可以直接運(yùn)行。

6. A Demo Forum
farum是我做的一個(gè)簡(jiǎn)單的forum demo. 使用了fastm, lightor, lightweb, 也盡量體現(xiàn)我前面提出的原則。
https://farum.dev.java.net/files/documents/4372/25045/farum0.5a.zip

我覺(jué)得,使用一門(mén)語(yǔ)言,應(yīng)該盡量發(fā)揮它的特長(zhǎng),而不是針對(duì)它的短處,修修補(bǔ)補(bǔ)。
Java作為靜態(tài)類(lèi)型編譯語(yǔ)言的好處,就是編譯期類(lèi)型檢查。那么如何發(fā)揮這個(gè)優(yōu)勢(shì)?前面說(shuō)的Mapper源代碼生成,就是一種嘗試。
另外,其它的類(lèi)似的膠水粘合部分,比如,IoC, Validation等,都可以進(jìn)行這方面的嘗試。目前,farum就是采用這樣的做法,自己寫(xiě)的Validator Source進(jìn)行validation, value setting, service implementation injection等工作。
farum沒(méi)有使用Dynamic Proxy, CGLib等動(dòng)態(tài)篡改用戶代碼的做法。
盡量不使用Reflection,因?yàn)镽eflection繞開(kāi)了 Java 的類(lèi)型檢查機(jī)制。與其使用reflection,真不如使用動(dòng)態(tài)腳本語(yǔ)言。
當(dāng)然,reflection是非常難以避免的。farum也少許使用了reflection。
Thread Local是一種隱式契約,相當(dāng)于繞開(kāi)了顯式契約(方法簽名method signature)。WebWork的一些用法,Spring Framework的Open Session In View,等都是采用了Thread Local。
farum沒(méi)有采用Thread Local,而是采用了另一種方法實(shí)現(xiàn)了Open Session In view。而且如果緩存命中,甚至不需要從connection pool中獲取Connection。

總結(jié)
<<Web開(kāi)發(fā)構(gòu)想>>一文中,我提出了,理想中的Web開(kāi)發(fā)架構(gòu)是這樣的:
開(kāi)發(fā)速度快,運(yùn)行速度快,結(jié)構(gòu)清晰優(yōu)雅。
具體到每一層。
Web框架層主要追求 開(kāi)發(fā)速度快。
O/R層主要追求 運(yùn)行速度快。
頁(yè)面資源層和頁(yè)面模板層主要追求 結(jié)構(gòu)清晰優(yōu)雅。

下面就是我對(duì)這些理想的初步實(shí)現(xiàn)。
還遠(yuǎn)遠(yuǎn)達(dá)不到完美的程度,而只是朝這個(gè)方向努力。

Template Layer
fastm
https://fastm.dev.java.net/files/documents/1911/25042/fastm1.0c.zip

Web Layer
lightweb
https://lightweb.dev.java.net/files/documents/4371/25044/lightweb0.9b.zip

ORM Layer
lightor
https://lightor.dev.java.net/files/documents/4370/25043/lightor0.5a.zip

A forum demo using fastm + lightor + lightweb
farum
https://farum.dev.java.net/files/documents/4372/25045/farum0.5a.zip

安徽新華電腦學(xué)校專業(yè)職業(yè)規(guī)劃師為你提供更多幫助【在線咨詢
相關(guān)熱詞搜索:污染
麻豆网站在线看| 亚欧视频在线| 午夜在线观看视频免费 成人| 国产91精品系列在线观看| a级毛片免费全部播放| 99久久精品费精品国产一区二区| 国产一区二区精品久| 精品国产一级毛片| 国产激情一区二区三区| 成人a大片高清在线观看| 日韩免费在线视频| 99久久精品国产高清一区二区 | 四虎影视库| 四虎久久精品国产| 午夜激情视频在线播放| 欧美激情伊人| 可以免费看毛片的网站| 亚洲女人国产香蕉久久精品| 日韩免费在线| 免费国产一级特黄aa大片在线| 韩国三级视频网站| 日韩在线观看视频免费| 青草国产在线观看| 日韩一级黄色| 久久国产精品只做精品| 精品久久久久久影院免费| 成人免费观看的视频黄页| 日本伦理片网站| 精品国产一区二区三区精东影业| 久久久久久久免费视频| 久草免费在线观看| 午夜欧美成人香蕉剧场| 天天做人人爱夜夜爽2020| 欧美激情一区二区三区视频| 国产网站在线| 国产不卡在线观看| 天天做日日爱| 国产不卡精品一区二区三区| 国产精品自拍一区| 国产视频久久久久| 黄色福利片| 99热视热频这里只有精品| 国产91精品系列在线观看| 成人在免费观看视频国产| 亚州视频一区二区| 韩国毛片免费大片| 国产国语在线播放视频| 久久99爰这里有精品国产| 高清一级片| 美女免费毛片| 日韩综合| 久久99青青久久99久久| a级毛片免费观看网站| 国产伦精品一区二区三区无广告| 精品国产一区二区三区久久久狼 | 久草免费在线视频| 黄色短视屏| 国产网站免费观看| 国产视频一区二区三区四区| 尤物视频网站在线| 久久99这里只有精品国产| 亚洲精品久久玖玖玖玖| 日韩免费在线视频| 精品国产三级a| 精品国产亚一区二区三区| 精品视频在线观看免费| 午夜在线影院| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 亚洲天堂一区二区三区四区| 久久99中文字幕久久| 亚洲 国产精品 日韩| 色综合久久天天综合绕观看| 四虎久久影院| 成人免费观看网欧美片| 91麻豆爱豆果冻天美星空| 欧美一级视频免费观看| 沈樵在线观看福利| 欧美另类videosbestsex高清| 国产成人啪精品视频免费软件| 四虎影视精品永久免费网站| 欧美国产日韩在线| 精品国产一级毛片| 九九热国产视频| 美女免费毛片| 日韩专区一区| 欧美爱爱动态| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 一a一级片| 日韩中文字幕在线播放| 一a一级片| 国产不卡在线观看| 精品国产一区二区三区久久久蜜臀| 国产一区免费观看| 欧美一区二区三区性| 久久久成人网| 四虎影视精品永久免费网站| 四虎影视久久久免费| 日本免费看视频| 欧美爱色| 韩国毛片| 国产精品1024永久免费视频 | 99久久精品国产麻豆| 99久久精品国产片| 日本特黄特色aa大片免费| 人人干人人插| 日韩女人做爰大片| 欧美国产日韩在线| 成人a级高清视频在线观看| 麻豆网站在线免费观看| 国产精品1024永久免费视频 | 午夜欧美福利| 超级乱淫黄漫画免费| 日本在线不卡视频| 成人影院一区二区三区| 黄视频网站在线观看| 欧美激情中文字幕一区二区| 亚洲天堂免费| 成人免费观看视频| 欧美大片一区| 999精品视频在线| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 99久久精品国产片| 精品视频免费观看| 一级毛片视频播放| 国产高清在线精品一区二区| 久久精品欧美一区二区| 99色精品| 欧美a级片视频| 一本伊大人香蕉高清在线观看| 亚洲精品影院| 一级女性全黄久久生活片| 欧美18性精品| 精品视频一区二区三区免费| 日本免费看视频| 成人影视在线播放| 香蕉视频亚洲一级| 一级毛片视频播放| 韩国毛片| 91麻豆精品国产自产在线 | 久久国产精品只做精品| 99热视热频这里只有精品| 国产成人欧美一区二区三区的| 麻豆系列 在线视频| 欧美1区| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 999久久久免费精品国产牛牛| 免费国产在线观看| 99久久网站| 成人在免费观看视频国产| 精品国产亚一区二区三区| 精品久久久久久综合网| 国产麻豆精品hdvideoss| 九九九国产| 国产成a人片在线观看视频| 一本伊大人香蕉高清在线观看| 你懂的日韩| 国产极品精频在线观看| 久久国产精品自由自在| 久久久久久久男人的天堂| 日韩女人做爰大片| 高清一级淫片a级中文字幕 | 二级片在线观看| 国产成人精品在线| 香蕉视频亚洲一级| 国产原创视频在线| 精品久久久久久中文字幕2017| 九九精品影院| 99久久精品国产国产毛片 | 精品国产香蕉在线播出 | 香蕉视频亚洲一级| 亚欧成人乱码一区二区| 亚洲天堂免费| 日本在线www| 美女免费毛片| 国产91丝袜高跟系列| 91麻豆精品国产片在线观看| 久久久久久久免费视频| 国产伦久视频免费观看视频| 国产成人精品影视| 成人免费观看视频| 色综合久久天天综合| 日韩中文字幕在线观看视频| 日韩在线观看视频免费| 九九精品久久久久久久久| 国产国产人免费视频成69堂| 国产美女在线观看| 国产成a人片在线观看视频| 日韩av成人| 美国一区二区三区| 精品视频一区二区三区免费| 91麻豆精品国产片在线观看| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 青青久久精品国产免费看| 天天色成人| 99热精品在线| 日本特黄特色aaa大片免费| 国产韩国精品一区二区三区| 成人免费福利片在线观看| 国产91视频网| 欧美一级视|