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