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