我曾經(jīng)得到的一個(gè)最好的編程建議
多年以前(早在1992年),我加入了這個(gè)瘋狂的skunkworks項(xiàng)目,這個(gè)項(xiàng)目使用的是他們叫做Smalltalk的另類程序語言。“面向?qū)ο?rdquo;作為一個(gè)“熱門”項(xiàng)目才剛剛起步。作為“面向?qū)ο?rdquo;的顧問,報(bào)酬非常可觀。很多人自以為這就是新的對(duì)象派別的全部內(nèi)容。直到5年前,Alan Kay發(fā)表了“我發(fā)明了‘面向?qū)ο缶幊?rsquo;這個(gè)術(shù)語,但{Java和C++}跟我所知道的有所不同”的言論。(”I invented the term ‘Object Oriented Programming’ and this {Java and C++} is not what I had in mind.”)
在加入這個(gè)奇特的小組,使用這種奇怪的編程語言不久之后,我依然對(duì)實(shí)例變量、類變量、類實(shí)例變量之間的差別感到困惑。我參加了來自ParcPlace的Russ Pencin的培訓(xùn)課程。他說了一些當(dāng)時(shí)我很不喜歡的東西。盡管不明白金玉良言當(dāng)中的要點(diǎn),但我還是努力跟上進(jìn)度。這需要多年的經(jīng)驗(yàn)才能漸漸體會(huì)其中的價(jià)值。建議的內(nèi)容是?
不要使用‘er’結(jié)尾的對(duì)象(Don’t make objects that end with ‘er’.)
沒錯(cuò)。面向?qū)ο缶幊蹋∣OP)的模式在我們稱之為“程序化編程”的文化當(dāng)中活力十足?,F(xiàn)在我們沒有過多地談?wù)撨@兩種模式之間的對(duì)比。也許一部分是因?yàn)槊嫦驅(qū)ο笳Z言現(xiàn)在俯拾即是。面向?qū)ο缶幊塘髋?,在眾多派別中脫穎而出??上У氖?,我經(jīng)?;叵肫鹞以?000年左右聽過 Adele Goldberg的演講:“現(xiàn)在我們有很多面向?qū)ο缶幊碳夹g(shù),但就沒有那么多面向?qū)ο缶幊痰某绦騿T”。假如我有一個(gè)建議想轉(zhuǎn)告給一群有志成為面向?qū)ο蟪绦騿T的人,那應(yīng)該是Russ提供的一句金玉良言:“不要使用‘er’結(jié)尾的對(duì)象。”
這名字到底意味著什么呢?為什么值得人們對(duì)它如此興奮?多年以后我發(fā)現(xiàn),面向?qū)ο缶幊痰木柙谟趯⑿袨榻壎ㄔ跀?shù)據(jù)上。在你還沒成為他們無歸屬組織的重要一員時(shí),程序就還是由行為和數(shù)據(jù)構(gòu)成。在典型的結(jié)構(gòu)化程序設(shè)計(jì)之中,我們將精力集中在行為(動(dòng)詞)上,然后弄清楚我們需要哪些數(shù)據(jù)(名詞)才能執(zhí)行。總而言之,我們將數(shù)據(jù)綁定在行為上。但在面向?qū)ο蟪绦蛟O(shè)計(jì)之中,我們將程序的中心用名詞和數(shù)據(jù)表示,然后弄清楚我們要將哪些行為綁定在他們之上,希望這些我們想要解決的問題能夠在突發(fā)的行為中得到答案。
最近我覺得有一個(gè)更好的名字來形容一位同事差不多都插手過的每一個(gè)“er”對(duì)象例子。
給例子起一個(gè)更好的名字會(huì)讓設(shè)計(jì)更加具有獨(dú)立性,代碼的關(guān)聯(lián)性更少,總之,更加面向?qū)ο蟆_@不是硬性規(guī)定,不過這會(huì)讓很多例子得到改善。
就拿某種“裝載程序模塊”來說吧,重點(diǎn)在于它的工作單元。模塊有許多實(shí)例變量,參數(shù),也許還有很多到處傳輸?shù)臄?shù)據(jù)。如今,取而代之的是LoadRecord和LoadStream。我有理由相信,你們最終使用的工具,更類似于面向?qū)ο缶幊虅?chuàng)始人心中設(shè)想的模樣。我們想要?jiǎng)?chuàng)造可以描述的對(duì)象,然后將某些行為綁定在它上面,而不是將焦點(diǎn)集中在它的行為上,然后弄清楚他們的行為需要哪些數(shù)據(jù)。
某些以前學(xué)過的用er結(jié)尾的對(duì)象已經(jīng)絕跡多年
管理者(Manager)——每當(dāng)我遇到一位管理者時(shí),我就會(huì)感到擔(dān)憂。大家沒有跟我說它的含義,卻早早地告訴我它的職能。它是注冊(cè)表嗎?那就叫它注冊(cè)表吧。是歷史記錄還是日志?就那樣稱呼吧。是工廠嗎?就那樣稱呼吧。
控制器(Controller)——我在過去20年內(nèi)只做過一個(gè)上等的控制器對(duì)象,它是一個(gè)象征著現(xiàn)實(shí)世界對(duì)象的BallastVoltageController接口。事實(shí)上,世界上每一個(gè)簡單MVC的執(zhí)行與控制器的不同作用本應(yīng)告訴我們這個(gè)構(gòu)想相當(dāng)協(xié)調(diào)的事情。
組織者(Organizer 以及許多類似的團(tuán)體)——焦點(diǎn)在于他們的職能。這是一個(gè)用來說明讓眾多這種‘ers’對(duì)象轉(zhuǎn)化為組織極其簡單的不錯(cuò)例子。就把它們稱為組織吧?,F(xiàn)在我們來關(guān)注它們的內(nèi)容。
分析器/渲染器/(Analyzer/Renderer)/等等——“勞動(dòng)者”對(duì)象中定義清晰的例子。假設(shè)它們是用來分析/渲染/等等。
生成器/加載器/閱讀器/編寫器/(Builder/Loader/Reader/Writer/)等等——把焦點(diǎn)從被操控的對(duì)象身上挪開,它們自身往往承擔(dān)著重大的責(zé)任。
這樣一條路線規(guī)則也會(huì)有很多例外
有許多以‘er’結(jié)尾的名詞。注冊(cè)表、邊框、字母、數(shù)字。如果真的是一個(gè)名詞的話,那就好了。
有很多‘er’結(jié)尾的單詞,盡管重點(diǎn)在于它們的行為上,也變得很常見了,所以我們***至少在一定程度上維持這種情況。分部程序,編譯器,瀏覽器。
當(dāng)你試圖建立一個(gè)以‘er’結(jié)尾的域?qū)ο竽P蜁r(shí),我可以拿比較熟悉的人員管理域作例子,它可以提升個(gè)人素質(zhì),使人具有管理行為。
你的經(jīng)歷可能會(huì)有所不同,我相信有很多人持反對(duì)意見。直到你適應(yīng)了這種心態(tài)一段時(shí)間之后,你才能真正體會(huì)到。為你的項(xiàng)目/設(shè)計(jì)提供一個(gè)回旋的余地,看看會(huì)發(fā)生什么。
英文原文:One of the Best Bits of Programming Advice I ever Got
原文鏈接:http://blog.jobbole.com/7658/
【編輯推薦】





















