我是一名杯具的.NET程序員。學(xué)校里學(xué)的稍微過(guò)得去的只有c語(yǔ)言。畢業(yè)的時(shí)候總算有家公司收留做嵌入式開發(fā),工作3個(gè)月嵌入式部門轉(zhuǎn)移到外地,我一直堅(jiān)定的留下來(lái),去了公司.NET部門學(xué)習(xí).NET.
衡量一個(gè)程序員的水平不是看他懂多少東西,會(huì)不會(huì)OO或者別的,而是要看他的代碼是否易懂,是否高效,是否能靈活擴(kuò)展.能做到這些管他什么OO,AOP,SOA,MVC,N層架構(gòu)之類的.記住,能夠以更好的方法解決切實(shí)的問(wèn)題才是王道.
這是一個(gè)神奇的部門,他們中大部門有很多年的java開發(fā)經(jīng)驗(yàn),現(xiàn)在他們都在.NET門下,他們一邊對(duì)java語(yǔ)言這么多年發(fā)展緩慢發(fā)出恨鐵不成鋼的感嘆,同時(shí)又對(duì)在C#相對(duì)強(qiáng)大的功能的支持下.NET居然沒多大建樹而倍感奇怪,他們總是用java的思想來(lái)架構(gòu).NET的程序, 跟著他們倆年我倒是沒覺得有什么奇怪,因?yàn)槲抑爸粫?huì)c語(yǔ)言。
后來(lái),我辭職去了其他公司,碰到不少.NET程序員,就有點(diǎn)明白他們的感嘆了,也是郁悶與糾結(jié)之開始。
很多.NET程序員OO思想很薄弱,以B/S模式來(lái)說(shuō),他們的三層架構(gòu)是這樣的,他們的項(xiàng)目中會(huì)有三個(gè)類庫(kù)工程,而且名字都取的差不多,一個(gè)Xxx.Model, 一個(gè)Xxx.DAL, 一個(gè)Xxx.BAL. Model層就是數(shù)據(jù)庫(kù)表的映射,字段與屬性一一對(duì)應(yīng)。 DAL層就是大段大段的拼接sql字串的邏輯,因?yàn)槭瞧唇舆壿嫶a中都是用string=’ ’,而不是string.empty, 到處都是str= str1 + str1,很少用StringBuilder。BLL層就是大段大段根據(jù)業(yè)務(wù)生成字串提供給DAL層拼接成sql,不好拼接的就用視圖,復(fù)雜一點(diǎn)用存儲(chǔ)過(guò)程,在復(fù)雜一點(diǎn),視圖加數(shù)據(jù)庫(kù)自定義函數(shù)之糾結(jié),再再?gòu)?fù)雜,視圖,存儲(chǔ)過(guò)程,自定義函數(shù)與DAL層sql之糾結(jié)至死。
最后,結(jié)果就是所有的類都只有方法,沒有屬性,很多方法都是向下層委,很多方法都可以是static的,甚至可以全是static的,正是因?yàn)闆]有屬性,他們的類可以輕松的用move method進(jìn)行重構(gòu)(^_^ ,汗,調(diào)侃),因?yàn)槿魏畏椒ǚ旁谌魏晤惱锊粫?huì)出錯(cuò)
你要是和他說(shuō)你的代碼不OO,就有兩種典型的情況,第一種:我的代碼怎么不OO了,你看這么多類,你看這么多層,我怎么不OO了,我用的純OO的C#哦,怎么不OO. 第二種:OO也不能解決所有問(wèn)題,這三層架構(gòu)是經(jīng)典架構(gòu)啊,是OO的改進(jìn),微軟推薦的做法。對(duì)于第一種,我基本保持距離,那是OO門外漢,搞不好還是編程門外漢。對(duì)于第二種,用C#這種純OO語(yǔ)言,基于.net framework這樣純OO架構(gòu)的框架做開發(fā),不用面向?qū)ο蟮乃枷雭?lái)設(shè)計(jì)程序架構(gòu)你打算什么時(shí)候用?用C++的人不利用面向?qū)ο蟮乃枷雭?lái)設(shè)計(jì)他的代碼,還用C++干什么,用C多直接。究其原因是.NET程序員不知道三層架構(gòu)某種程度上和OO是有沖突地,屬性和操作分離違背了類的基本定義。雖然三層架構(gòu)對(duì)java來(lái)說(shuō)也是一樣有矛盾的,但人java至少還知道這個(gè)問(wèn)題啊,所以有貧血模型,充血模型,領(lǐng)域模型,ORM之類的試圖解決這樣的沖突。還有中觀點(diǎn)更少數(shù)更讓人糾結(jié),說(shuō)程序員只要是利用OO研究的成果,按這樣的意思,用純對(duì)象語(yǔ)言編寫過(guò)程式的程序,利用面向?qū)ο蟮?net framework也行?這不有病嗎?
.NET程序員大部門不知道依賴注入,不知道面向方面(切面)編程,所以給他們介紹Spring.net, ObjectBuilder,他們就難以接受,拒絕的理由就讓我郁悶,有用框架啊,有多寫好多類,這么多配置啊,對(duì)性能有影響吧。所以他們的代碼中,”函數(shù)三段論”在每個(gè)函數(shù)都有,這三段就是:執(zhí)行邏輯,寫日志, 處理異常,重復(fù)的三段論看著很糾結(jié)。 最后,就算是微軟企業(yè)庫(kù)中的DataAccess Block他們也很難接受,因?yàn)樗麄冪姁鄣氖荢QLHelper。
每次有項(xiàng)目來(lái),在我還在規(guī)劃有什么類,有什么屬性和操作的時(shí)候,很多.NET程序員數(shù)據(jù)庫(kù)中表都已經(jīng)建好了。我并不反對(duì)先建數(shù)據(jù)庫(kù),不過(guò)數(shù)據(jù)庫(kù)與對(duì)象如何銜接就得要先考慮了。但是他們并不了解關(guān)系模型與對(duì)象模型之間的區(qū)別。所以再建好了數(shù)據(jù)庫(kù)之后,就
開始建個(gè)模型。建完了總得要操作數(shù)據(jù)庫(kù)吧,所以再建個(gè)DAL,但是現(xiàn)在什么業(yè)務(wù)邏輯都沒有,所以DAL層就開始組合下sql語(yǔ)句的拼接邏輯,然后上層就可以提供字串給DAL拼湊了,上層是什么,BLL啊,最終,把整個(gè)程序掃一遍你就發(fā)現(xiàn),編程就是sql字串到處流動(dòng)并在流動(dòng)中由短變長(zhǎng),由簡(jiǎn)單變復(fù)雜。要不就是sql寫在存儲(chǔ)過(guò)程中,程序是存儲(chǔ)過(guò)程執(zhí)行的條件到處流動(dòng)。如此郁悶之糾結(jié),你一眼看上去還以為是個(gè)字串或者文本處理程序。
總結(jié),都已經(jīng)到了后OO時(shí)代了,.很多net程序員依然還以青銅時(shí)代的觀念和方式使用熱兵器