国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

代碼編寫中的心理學(xué)與美學(xué)

2019-11-17 04:47:18
字體:
供稿:網(wǎng)友

  本文是Charles Petzold于2005年10月20日在NYC.NET開發(fā)者小組中的演講稿節(jié)選。Visual Studio或許是程序員最好的伴侶之一,但這些年來,它變得日益冒進(jìn)、專制,控件問題也變得越來越混亂。難道我們應(yīng)該投降,讓Visual Studio替我們來編寫代碼嗎?還是它正在侵蝕我們的編程聰明而不是使我們增長聰明?這篇演講剖析了Visual Studio生成的代碼,分析了它為我們造就的令人震動的編程習(xí)慣;狂熱地表達(dá)了獨(dú)立編程過程中的喜悅、挫折和滿足感。

  技術(shù)成癮,信息盡在指尖的麻煩   

  在使用計(jì)算機(jī)時,鍵盤和鼠標(biāo)或許會使我們患上重復(fù)性神經(jīng)壓迫障礙癥(repetitive stress disorder),.. 但軟件對思想的影響要遠(yuǎn)遠(yuǎn)大于身體,即便如此,這種影響也是不易察覺的。

  有些觀察家在觀察我們的數(shù)字化生存方式后,注重到某些應(yīng)用程序使用戶以一種非常嚴(yán)格的預(yù)先設(shè)計(jì)好的方式進(jìn)行思考,而且我們總是這樣談?wù)撘环N消費(fèi)技術(shù):“在擁有它之前,我們根本不知道有多么需要它。”而大多數(shù)此類技術(shù)似乎都不是為了滿足某種特定的需求,只是使我們沉迷于原本從未需要過的其他東西;不是為了使我們生活得更好,只是引誘我們服下設(shè)計(jì)師提供的又一劑迷藥。一旦我們嘗到甜頭,就被引誘了。

  20 世紀(jì)90年代初,Microsoft公司提出了一個口號“信息盡在您指尖。”理論上來講,這聽起來相當(dāng)不錯,而今天,有了Google、Wikipedia、Internet MovieDatabase和其他有用的網(wǎng)站,這個夢想基本上已經(jīng)實(shí)現(xiàn)。

  沒有Visual Studio(以下簡稱為VS),世界將會怎樣?它使我們按照各種預(yù)先設(shè)計(jì)好的方式進(jìn)行工作,舉例來說,假如VS實(shí)現(xiàn)的功能比現(xiàn)在少,那么人們是否會更興奮?VS的某些特性大大提高生產(chǎn)力,但就我個人而言,它們看上去貶低了VS,也減少了我的編程經(jīng)驗(yàn)。

  自從20年前的1985年11月,Windows 1.0初次登場,記錄的函數(shù)調(diào)用約有400種。10年以后,Windows 95中的函數(shù)調(diào)用超過了1000種。今天我們已經(jīng)作好了迎接.NETFramework 2.0正式版的預(yù)備。僅僅統(tǒng)計(jì)MSCORLIB.DLL和那些以System開頭的程序集,就有超過5000種公共類,包含超過45000 種公共方法和15000種公共屬性,這還沒有計(jì)算那些派生而來以及未重寫的方法和屬性。有這樣一位能把握60000種方法和屬性的程序員嗎?我認(rèn)為沒有。解決方案之一當(dāng)然就是專門化。

  IntelliSense

  VS試圖通過IntelliSense這種特性降低類、方法和屬性的大規(guī)模擴(kuò)展給人們帶來的問題。在防止用戶出格方面,假如您將“指尖”理解為對屏幕上插入鍵所在位置的比喻,那么IntelliSense實(shí)際上就實(shí)現(xiàn)了“信息盡在指尖”這一目標(biāo)。它與.NET配合得天衣無縫,這是因?yàn)閂S可以使用映射從您指定為引用的實(shí)際DLL中獲取所需的全部信息。

  為使IntelliSense正常運(yùn)作,自下而上的編程是最佳選擇。IntelliSense要求每一個類、每一個方法、每一個屬性等等都必須得到正確的定義,然后才能引用。假如您沒有這樣做,IntelliSense將使用已定義的相應(yīng)內(nèi)容嘗試糾正您鍵入的代碼,這可能會導(dǎo)致出錯。

  但這里的結(jié)論令人驚愕。要想使IntelliSense正常運(yùn)作,不僅要求使用自下而上的結(jié)構(gòu)編程,在每一個方法或?qū)傩灾校€必須要從開始到結(jié)束呈線性地編寫代碼——這簡直就像使用古老的DOS行編輯器EDLIN。您必須首先定義所有的變量,然后才能使用它們。根本不能在代碼中越行編寫。

  我不需要再記住任何東西。IntelliSense會幫我記住。我的編程過程成了一場與IntelliSense的持久對話。因此我不認(rèn)為IntelliSense能幫助我們成為更出色的程序員。它實(shí)際的目標(biāo)是使我們成為效率更高的程序員,這也就意味著使我們的勞動更為廉價(jià)。

  IntelliSense是一種不可避免要出現(xiàn)的技術(shù)。即便Microsoft公司沒有開發(fā)出它,其他人也會將它帶給我們。人類從不因?yàn)榭赡艹霈F(xiàn)不幸的結(jié)果而盡量避免追捧某些技術(shù)。

  生成的代碼

  VS不僅僅試圖完成我們正在鍵入的代碼,多年以來,它一直想要為我們生成代碼。例如,假如選擇Windowsapplication作為新項(xiàng)目類型,給它命名并指定本機(jī)驅(qū)動器上的存儲位置后,VS就會生成足夠的代碼,以使這一項(xiàng)目立即可編譯、可運(yùn)行。

  出于某種原因,我們都已經(jīng)相信了這是編程的合理方式。我更喜歡自己鍵入預(yù)備代碼,然后自己輸入main函數(shù)或Main方法。我真正需要幫助的時機(jī)絕對不是開始編程時,而是在我試圖結(jié)束編程時。那個時候VS又在干什么?

  VS會將我們編寫的程序與一組它認(rèn)為我們需要的動態(tài)鏈接庫掛鉤,而不管您的程序是否真的需要這些DLL。這些額外的引用不會造成任何實(shí)際的損害,但假如其他人查看程序,會造成一些混亂。

  在其他文件中,VS會創(chuàng)建一個名為Form1.cs的文件,這是源代碼文件,事件處理程序?qū)⑵鋺?yīng)用于主窗體中的控件。您會在代碼頂端看到一組命令,包含了程序需要的命名空間。除了WindowsForm程序標(biāo)準(zhǔn)命名空間外VS還包含了很多自創(chuàng)的東西,其中某些的確非常有用,但假如程序并未實(shí)際使用這些命名空間中的任何類,那它們就只不過是令人分心的噪聲。

  VS還在一個以項(xiàng)目名稱命名的命名空間內(nèi)封裝了其生成的所有代碼。當(dāng)然,我完全理解給DLL一個命名空間的價(jià)值,但是為什么要給應(yīng)用程序一個命名空間呢?我就這個問題考慮了很久,但沒有得到答案。

  VS還會創(chuàng)建一個名為Form1.Designer.cs的文件,在VS 2005的某些測試版中,這個文件甚至不會默認(rèn)地顯示在項(xiàng)目文件中。這是VS在您設(shè)計(jì)窗體時插入生成代碼的文件。VS顯然不希望您搞亂這個文件,出于某些很好的理由,VS希望這些生成的代碼采用一種特定的格式,假如您把它搞亂了,那么VS就無法在您再次打開項(xiàng)目時讀回這些代碼。
更多的請看:http://www.QQread.com/windows/2003/index.Html交互式設(shè)計(jì)

  絕大多數(shù)革命性的交互式設(shè)計(jì)素材都是在Visual Basic基于Windows的版本中寫下第一個表達(dá)式的,也正是從這里開始,我陷入了對Windows編程發(fā)展方向的深深憂慮。您不僅可以將按鈕移動到窗體中、以交互式方式將其位置和大小調(diào)整為所需結(jié)果,而且假如您單擊按鈕,Visual Basic還會生成一個事件處理程序并答應(yīng)您在其中鍵入代碼。

  Visual Basic不是將程序作為一個完整連貫的文檔來處理,而是作為附屬于可視化對象的代碼段來處理的,這是我困擾的原因所在。這 不是程序應(yīng)該有的樣子。這不是編譯器看到的東西。之后人們要怎樣才能獲得一種對完整程序的感覺呢?這令我感到非常困惑。

  交互式設(shè)計(jì)素材最終在C++開發(fā)和Microsoft Foundation Class中找到了自己的位置,代碼生成的背后實(shí)際隱藏的東西根本沒人愿意探討,那就是多到令人毛骨悚然的MFC支持,我對此深信不疑。我不斷地推出《Windows程序設(shè)計(jì)》的修訂版,我認(rèn)為其讀者群是像我一樣喜歡從頭開始編寫自己的代碼的程序員。

  再見!資源腳本

  我非常喜歡.NET 1.0測試版及Windows Form,其面向?qū)ο蟮某潭蕊@然要比MFC高得多,同時也非常好奇資源腳本就這樣徹底消失了。用戶在代碼的對話框中——現(xiàn)在包容于一個更為通用的術(shù)語“窗體”中——創(chuàng)建并組合控件。當(dāng)然,即便是在Windows 1.0中,您也可以通過代碼創(chuàng)建控件,但那種體驗(yàn)不是非常令人愉快,因?yàn)閯?chuàng)建每個控件時都要調(diào)用帶有11個參數(shù)的CreateWindow函數(shù)。在Windows Form中通過編寫代碼創(chuàng)建控件是非常方便的。

  例如VS并不希望您使用數(shù)組或循環(huán)來創(chuàng)建并定位一組按鈕,它希望您使用設(shè)計(jì)器,它希望為您生成代碼,并將這些代碼藏在您看不見的地方。

  在第一個對話框編輯器面世約20年以后的今天,VS又犯下了生成不美觀的代碼還警告您不要搞亂它的錯誤。當(dāng)然,我們知道VS這樣做的原因。理論上來講,您可以為VS的工具箱增加另外一個名為Button的空間——從另一個命名空間的另一個DLL,所以必須有區(qū)分它們的方法。

  VS是根據(jù)您所選擇的控件生成代碼的,它為控件賦予標(biāo)準(zhǔn)名稱并答應(yīng)您更改變量名稱,只要更改控件的屬性即可,那么不僅按鈕對象的屬性會改變,按鈕變量名也會隨之更改。VS所做的一切都只是為了使您更快地寫出代碼。

  程序員真的會以這樣的方式設(shè)計(jì)代碼嗎?我可以確定地說,確實(shí)有一些這樣的人,但同樣可以確定大部分程序員都不會這樣做。

  在探討關(guān)于變量名的話題時,我應(yīng)該說一些VS的優(yōu)點(diǎn)。VS 2005有一種極為出色的變量重命名工具。大家都知道,有時真的需要重新命名一個變量,但還要依次更改其在程序中實(shí)際使用的地方,而查找并替換顯然有帶來負(fù)面效應(yīng)的可能,您碰到這種情況有幾次?現(xiàn)在,這一全新的變量重命名工具使您避免了所有的麻煩,而且,假如您將其命名為與現(xiàn)有名稱重復(fù),這一工具還會給您以提示。我希望人們能充分利用這一工具來重命名他們的控件,不要保留VS的默認(rèn)設(shè)置。

  過度使用的字段

  VS自動生成代碼帶來的另外一個問題就是每個控件都是創(chuàng)建該控件的類中的一個字段。這是一種可怕的編程經(jīng)歷,程序員也許會通過觀察VS生成的代碼來學(xué)習(xí)正確的編程技術(shù),但他們所看到的就是這個。

  面向?qū)ο缶幊碳夹g(shù)出現(xiàn)后,全局變量在其中起的作用已經(jīng)微乎其微,只有那些字段現(xiàn)成為的全局變量,且其濫用情況非常嚴(yán)重。

  理論上來說,做為窗體一部分創(chuàng)建的任何子控件都不需要作為字段存儲,因?yàn)槠涓浮ǔ榇绑w,您可以使用為屬性索引的整型值或在創(chuàng)建控件時為屬性指派的文本引用各控件。此時假如您的控件有著有意義的名稱,而不是button1和button2,那么您會再次發(fā)現(xiàn)其優(yōu)勢。

  作為程序員,我們應(yīng)該就每一個特定對象進(jìn)行謹(jǐn)慎的思考,它是定義為字段還是局部變量。假如一個標(biāo)簽在整個窗體存在期間都有著同樣的文本,那么可以很輕易地判定出,它應(yīng)該定義為局部變量。而假如一個標(biāo)簽的文本是通過事件處理程序或其他某些控件設(shè)置的,則或許將其存儲為字段是最方便的。

  事情就是這么簡單,但VS不希望您這么想。VS希望將所有東西都存儲為字段。

  揭開VS的神秘面紗

  即使VS可生成完美的代碼,依然有一個問題。由于VS可生成代碼,它在代碼和程序員之間聳立起一道無形的墻壁。VS向我們暗示這是編寫現(xiàn)代Windows或Web程序的惟一途徑,因?yàn)楝F(xiàn)代程序設(shè)計(jì)的某些方面只有VS知道其來龍去脈。VS還提供了樣板代碼,其中包含一些從未在Microsoft公司提供的文檔或指南中充分論述過的材料,這進(jìn)一步增加了VS的權(quán)威感。

  這給我?guī)砹艘环N被強(qiáng)制的感覺,作為一名Windows Form編程和Avalon編程教師,我故意與其背道而馳。我覺得我需要揭開VS的神秘面紗,讓人們看看它到底在做什么,并且示范如何自行編寫代碼開發(fā)這些應(yīng)用程序,假如您愿意,我們甚至可以離開VS,在命令行中編譯這些代碼。

  純粹的編寫代碼帶來的純粹快樂

  幾個月之前,或許是為了反抗所有這些高傲的Windows Form和Avalon編程技術(shù),我開始重新使用C語言編寫程序。編寫的代碼并不多。

  通過一些實(shí)際的項(xiàng)目,我發(fā)現(xiàn)我不必查找任何資料,我用C語言編程的經(jīng)驗(yàn)有20年。在C#出現(xiàn)之前,這是我最喜愛的語言。這項(xiàng)任務(wù)是純粹地編寫算法,然后輸出簡單的結(jié)果。這就是全部內(nèi)容。

  我還發(fā)現(xiàn)在編寫代碼之前,確實(shí)需要好好動動腦筋。采用全部可能的組合總是不答應(yīng)的。您需要削減一部分。經(jīng)過這樣的初步處理后,還有實(shí)際的代碼要去編寫,但這里沒有API、沒有類、沒有屬性、沒有窗體、沒有控件、沒有事件處理程序,當(dāng)然也根本沒有VS。


  此時,有的只是代碼和我本身,有那么一瞬間,我重新找到了一名真正的程序員的感覺。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 手机| 天台县| 彭州市| 寿宁县| 西昌市| 无锡市| 陵川县| 临朐县| 宁陕县| 宣化县| 浦东新区| 阜宁县| 松原市| 柳河县| 繁昌县| 通州市| 高邮市| 平武县| 长垣县| 怀柔区| 惠东县| 松原市| 阳朔县| 磴口县| 南华县| 浦城县| 南昌县| 古蔺县| 平昌县| 古田县| 襄樊市| 宾阳县| 仙居县| 榆社县| 新疆| 江华| 裕民县| 龙井市| 榆中县| 九龙城区| 泉州市|