|
在Mono平臺(tái)開(kāi)發(fā)前應(yīng)該做的第一個(gè)事情就是,調(diào)整好心情,降低期望值:
對(duì)于Linux本地C程序員而言,由于習(xí)慣了瘋狂和有魔力的本地C程序員開(kāi)發(fā),因此對(duì)于Mono提供的諸多限制可能不太滿(mǎn)意。大體而言,Mono和.NET程序一樣,屬于框架開(kāi)發(fā)的范疇,對(duì)于框架開(kāi)發(fā),最好在框架規(guī)定的范圍內(nèi)工作,否則會(huì)陷入孤立無(wú)緣的境地。Mono沒(méi)有C開(kāi)發(fā)那些唾手可得的工具,也不能對(duì)系統(tǒng)進(jìn)行無(wú)限的挖掘,Mono關(guān)注的是應(yīng)用軟件開(kāi)發(fā),不是系統(tǒng)軟件(Mono 可以支持本地服務(wù)開(kāi)發(fā))。Mono支持兩重類(lèi)型軟件開(kāi)發(fā),以WEB為中心的軟件和以本地為中心的開(kāi)發(fā)。WEB包括常規(guī)以上的應(yīng)用型網(wǎng)站開(kāi)發(fā),也包括基于服務(wù)的模型開(kāi)發(fā)。由于服務(wù)現(xiàn)在成為軟件開(kāi)發(fā)的中心并且迅速進(jìn)化。作為.NET替代平臺(tái),Mono顯得很混亂,主要因?yàn)?NET以服務(wù)為中心的設(shè)計(jì)在Mono 上還無(wú)法完全施展,因?yàn)镸ono基礎(chǔ)平臺(tái)正處于2.x階段,等09年底應(yīng)該是一個(gè)新階段。對(duì)于本地程序開(kāi)發(fā),主要包括一GTK#和System.Windows為中心的圖形界面程序開(kāi)發(fā),還包括服務(wù)軟件的開(kāi)發(fā)(linux service機(jī)構(gòu)),也包括一Lucene.NET為基礎(chǔ)的搜索軟件的開(kāi)發(fā)。
對(duì)于Windows .NET 程序員而言,首先要極度降低期望值,Mono沒(méi)有絢麗的工具,缺乏足夠的第三方軟件,并且工具之間的集成也做得不太好,代碼編寫(xiě)可能不很流暢,MonoDevelop也可能讓你很失望,這些都是Windows上廉價(jià)的.NET開(kāi)發(fā)工具把我們慣壞了。Windows.NET程序員來(lái)到Mono的主要原因有很多,可能是因?yàn)楹闷妫Mw移自己的程序,想窺探一下Mono實(shí)現(xiàn)以確定和自己想的差距有多遠(yuǎn),更多的是要學(xué)習(xí)。就像把孩子放到艱苦的地方鍛煉一樣,來(lái)到Mono,你將會(huì)有同樣的感覺(jué),非常的貧瘠。Mono工具還比較原始,文檔也比較少,我覺(jué)得這反倒是學(xué)習(xí)的好地方,每一次當(dāng)我打開(kāi)MSDN,我都會(huì)望書(shū)驚嘆,多么希望積累足夠豐富的Windows知識(shí)呀,但是MSDN讓人感到很大很茫然,最后,還是購(gòu)買(mǎi)專(zhuān)著研究更合適,其他要用的,用的時(shí)候再查資料吧。在Mono平臺(tái)上資料非常少,這也是優(yōu)勢(shì),對(duì)于C#語(yǔ)言本身而言,那是學(xué)習(xí)的好地方,就像C++一樣,C#本身是一個(gè)迷人的語(yǔ)言值得研讀一下,但是C#上緊緊捆綁的應(yīng)用更適合生產(chǎn)而不是學(xué)習(xí),如果要學(xué)習(xí),需要找一個(gè)單調(diào)一點(diǎn)、產(chǎn)品單一的環(huán)境,當(dāng)然學(xué)好了趕緊回來(lái),趕緊擁抱Windows:)
了解平臺(tái)之間的差距:
關(guān)于文件系統(tǒng),Linux基于虛擬文件系統(tǒng),這是Linux最成功的設(shè)計(jì)之一,表面看起來(lái)就是,任何文件和資源都可以通過(guò)一"/"開(kāi)始的文件來(lái)訪問(wèn),文件之間的分割符是"/"。在Windows中,文件系統(tǒng)經(jīng)過(guò)多次抽象,看起來(lái)類(lèi)似與以“C:”、“D:”這樣的方式開(kāi)始,并且文件之間的分隔符使用"/",這是很多程序不可移植的重要原因,可以參考后來(lái)的文章,了解如何提高程序的可移植性。
第二個(gè)差距就是換行符的不同,在Windows平臺(tái),一個(gè)換行符意味著“/r/n",由于在字符終端時(shí)代,"/n"的任務(wù)是使光標(biāo)處于下一行的同等位置,而"/r"則是使光標(biāo)處于一行的開(kāi)頭,因此,去下一行開(kāi)始則意味著要配合使用兩個(gè)控制符;在Unix族平臺(tái),換行符則使用"/n"表示,這是歷史原因,我猜想是由于早期的時(shí)候終端程序的規(guī)定導(dǎo)致的。
關(guān)于Unicode,這現(xiàn)在應(yīng)該不成問(wèn)題了,現(xiàn)在Linux都在內(nèi)部使用了Unicode,以前Linux在內(nèi)部使用ASCII編碼及其擴(kuò)展。由于Windows在內(nèi)部使用Unicode已經(jīng)很長(zhǎng)時(shí)間了,.NET 的Unicode 支持非常好,Char字符本省就是Unicode的,并且System.Text也為文本處理提供了諸多支持。雖然Mono實(shí)現(xiàn)了.NET的功能,但是我發(fā)現(xiàn),系統(tǒng)對(duì)Unicode 的處理不夠細(xì)心,一個(gè)細(xì)心設(shè)計(jì)的類(lèi)庫(kù)和平臺(tái),應(yīng)該保證在大部分情況下系統(tǒng)的反應(yīng)能和程序員預(yù)期的一樣好,但是Mono沒(méi)有做到,那是以前的事情了,由于Mono RunTime在一直改進(jìn),現(xiàn)在應(yīng)該有大幅進(jìn)步吧。文本處理一直都是計(jì)算機(jī)科學(xué)的基本問(wèn)題之一,通常情況下,處理多國(guó)編碼的最簡(jiǎn)的辦法是使用UTF-8,由于歷史原因,許多接口并沒(méi)有使用UTF-8,而是使用蹩腳的轉(zhuǎn)換。在Windows下,在.NET出現(xiàn)之前,文本處理一直很讓人頭疼,贊揚(yáng).NET事常提的一個(gè)問(wèn)題就是:“難道你還想執(zhí)行字符串轉(zhuǎn)換工作?”,看看char *、wchar_t*、_bstr_t、CComBSTR、CString、basic_string 和System.String,往事不堪回首呀,如果不跨庫(kù),不夸方案,那么字符串處理還算輕松,一旦要跨庫(kù)跨平臺(tái)跨方案,那么,字符串處理就是程序員的噩夢(mèng)。
結(jié)構(gòu)差距,Microsoft.NET 是一個(gè)旨在建立巨大生態(tài)圈的大方案,希望面面俱到。因?yàn)镸icrosoft企業(yè)平臺(tái)架構(gòu),Microsoft.NET能夠更好的跟Windows的業(yè)務(wù)核心和系統(tǒng)核心無(wú)縫集成。在Microsoft.NET上,架構(gòu)師、設(shè)計(jì)師和程序員看到的不僅僅是.NET,還包括大量運(yùn)行的關(guān)系業(yè)務(wù)前途的企業(yè)服務(wù)和組建。在Mono上,由于需要依賴(lài)第三方實(shí)現(xiàn),依賴(lài)大量的綁定來(lái)使用系統(tǒng)或其他軟件的功能,有時(shí)侯透明度不夠。沒(méi)有MMC、域、MSMQ、WMI、事務(wù)支持、服務(wù)架構(gòu)、數(shù)據(jù)庫(kù)服務(wù)等重要基礎(chǔ)結(jié)構(gòu)的支持,這些在開(kāi)發(fā)早期就應(yīng)該確定的因素,請(qǐng)確定Mono能夠滿(mǎn)足你的要求。另一方面,這些在很多時(shí)候也是一個(gè)優(yōu)勢(shì),有大量的第三方組建在實(shí)現(xiàn)這些功能,包括Apache和Mozilla和Postgrsql。
NET技術(shù):在Mono平臺(tái)開(kāi)發(fā)前你應(yīng)該知道,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。