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