最近公司要開發(fā)Windows平臺上的產(chǎn)品(由于涉及到商業(yè)機密,所以目前無法對這個產(chǎn)品做詳細介紹),采用.Net技術(shù)進行開發(fā),我負責(zé)的是基于Visual Studio插件機制的行業(yè)開發(fā)工具的開發(fā)。從開始接觸.Net到現(xiàn)在已經(jīng)有近三個月了,而且也開發(fā)出了第一個版本,對.Net已經(jīng)有了一些認識,由于以前主要用Java、Python等語言進行開發(fā),因此有意無意的就對這些語言進行了比較。和Java比起來,.Net的優(yōu)勢還是很多的,比如快速開發(fā)能力、基于Windows特性進行開發(fā)的能力、內(nèi)置的豐富類庫、一些高級語法、組件的多版本管理等。優(yōu)點是不用過多夸耀的,缺點我則要好好的“批評”一番的,因為“謙虛使人進步,驕傲使人落后”嘛,呵呵。開發(fā)場景為:使用Visual Studio2005進行C#的開發(fā)、使用Eclipse進行Java開發(fā)。
1、HotSwap:在Java中HotSwap技術(shù)給程序的調(diào)試帶來非常大的方便,比如可以讓程序一邊調(diào)試一邊修改代碼,代碼修改以后在程序中立即就可以看到修改后的效果,不用每次修改以后都要重新啟動程序;在.Net中幾乎不允許這樣做,只有在非常苛刻的幾個情況下才可以實現(xiàn)在調(diào)試狀態(tài)下修改代碼,而且一旦代碼段被執(zhí)行過了就肯定不允許再修改了,這就導(dǎo)致每次修改代碼都要頻繁啟動程序,非常繁瑣。
2、基于.Net的東西和Windows結(jié)合過于緊密,而且和Windows平臺下一些舊有技術(shù)有太多千絲萬縷的聯(lián)系,導(dǎo)致用起來非常麻煩。比如每個對外部系統(tǒng)暴露的接口傳來傳去最后看到的類型是_ComObject,要想得知其真正的接口類型就必須通過COM技術(shù)來取得,非常麻煩;開發(fā)的很多組件都需要到注冊表中注冊,增加了部署的難度。
3、Visual Studio中代碼的即時查錯能力非常弱,很多的要到編譯時才能知道代碼是否有錯;而在Eclipse中在編寫代碼的時候?qū)τ谟绣e誤的代碼和有警告的代碼(比如一些Private成員沒有被引用)可以立即清晰的提示出來,開發(fā)人員可以立即修改有錯誤的代碼。
4、Java中默認的方法都是可以override的除非標注為final,而在C#中必須是明確聲明virtual的才可以override。在Delphi中也是類似的問題,這應(yīng)該是Delphi和C#共同的老爹Anders Hejlsberg對于OO的一種理念吧,也許人家大師的想法是正確的:一個方法是否是虛方法必須要明確指定。不過對于習(xí)慣了Java中這種實現(xiàn)方式的人來說,C#的這種實現(xiàn)方式還是讓人感覺一時難以適應(yīng)的。
5、Visual Studio的編譯速度太慢,點擊【調(diào)試】/【運行】按鈕以后要編譯好長一段時間才能啟動(不過和Visual Studio6比起來現(xiàn)在的Visual Studio編譯速度已經(jīng)快多了了,已經(jīng)接近于Delphi的編譯速度了);由于Eclipse使用的自己的高性能編譯器Eclipse Compiler,而且代碼的編譯是在編寫代碼的時候即時進行的,所以在Eclipse中根本感覺不到編譯的時間,點擊【調(diào)試】/【運行】按鈕以后程序就運行起來的。
6、.Net類庫中一些類設(shè)計的不靈活,比如TreeView的節(jié)點的顯示的值是通過Text屬性賦值上去的;而在Java中的Swing、SWT等圖形庫中,可以在一個樹節(jié)點中掛任何類型的值,然后通過為這個節(jié)點定義個性化的Render(渲染器)來決定這些樹節(jié)點顯示什么。
7、Visual Studio的插件體系過于死板,開發(fā)起來不像開發(fā)Eclipse插件那樣靈活簡便,這可能和Visual Studio插件體系的歷史淵源有關(guān)系。舉例如下:
(1)比如要在代碼編輯器上增加新特性,在Eclipse中可以通過代碼編輯器中提供的大量擴展點來實現(xiàn),而在Visual Studio中的代碼編輯器中則只提供了很可憐的幾個可擴展性。這一點是Visual Studio插件體系最大的硬傷,大大限制了基于Visual Stuio的插件的功能,相信隨著MS對Visual Studio插件體系的逐漸重視,這一點會慢慢跟上來的。
(2)Visual Studio的插件體系和.Net結(jié)合過于緊密,在Eclipse中可以為Python、Ruby、C#、C、ASM等很多語言開發(fā)IDE(提供代碼編輯、代碼輔助、調(diào)試、編譯等功能),這些語言不必與Java有任何關(guān)系,而在Visual Studio中雖然也可以為一種語言編寫IDE,比如IronPython、J#,但是這些語言是和.Net集合緊密的,比如要為這種語言提供調(diào)試功能,則必須將代碼編譯成MSIL代碼,這對于很多語言來講是不可能的;
(3)Eclipse中的插件只要在自己的plugin.xml文件中配置好就可以了,把那個插件的jar包放到Eclipse中就可以運行,而Visual Studio中的插件則必須首先注冊到注冊表,調(diào)試和部署起來非常麻煩;
(4)Eclipse運行時的配置是保存在Workspace中的.metedata目錄下的,因此在開發(fā)插件的時候會把插件的配置信息自動寫到Host起來的那個Eclipse的Workspace中,被調(diào)試模式啟動的Eclipse所做的一些修改不會影響主Eclipse,而在Visual Studio中雖然可以使用Experimental Hive方式進行插件開發(fā),但是由于這些配置是保存在注冊表中的,所以被Host啟動的Visual Studio實例會污染到主Visual Studio,每次重啟IDE都需要運行“Reset the Microsoft Visual Studio 2008 Experimental hive”來進行環(huán)境的重置,且重置耗時非常長,浪費了大量時間;
(5)VS2008中,如果插件中拋出異常,而又沒有捕獲的話,輕則VS2008會顯示一個錯誤消息框,重則VS2008會宕掉;而在Eclipse中會將插件中未捕獲異常顯示出來并且輸出到日志文件中,方便插件開發(fā)者排查插件的Bug。
(6)Eclipse中工程相關(guān)的特性是以Nature的方式提供的,一個Nature通常可以掛接到幾乎所有的工程類型中去,包括用戶自定義類型;而在Visual Studio中工程相關(guān)的特性則是以SubProject的形式提供的,往往只能掛到Visual Studio內(nèi)置的少數(shù)幾個工程類型中去(比如CSharpProject、VBProject),這樣可擴展性大大降低了。
(7)Eclipse中可以使用JET來開發(fā)非常復(fù)雜的代碼生成器,而Visual Studio中的代碼生成則只能用非常簡單的代碼模板機制,復(fù)雜的邏輯就必須通過字符串拼接來完成;
畢竟接觸.Net時間還是非常短,所以有的地方說的可能有錯誤,還請園子里的兄弟多指教。最后祝.Net和Java能在相互競爭中快速成長,從而讓我們開發(fā)人員能夠輕松、快樂、快速的開發(fā)出產(chǎn)品來,:)