PHP面向?qū)ο笾乙?/h3>
|
![]() |
admin
![]() 2012年4月18日 22:11 本文熱度 3188 |
PHP由Sapi、Main、Zend和Ext組成,PHP應(yīng)用由哪些組成?地基+上層建筑。所謂地基就是各個(gè)應(yīng)用間共有的那些部分,像現(xiàn)在流行的很多PHP框架就是試圖給你打個(gè)地基。我不大喜歡別人給我打地基,所以平時(shí)都是自己打地基,自己打的地基牢與不牢自己最清楚。我爸是個(gè)建筑家,他建房子的能力在我們小鎮(zhèn)也是赫赫有名了,從小耳濡目染,導(dǎo)致我也對打地基搞建筑很感興趣,現(xiàn)在把這股勁弄到打軟件地基上來,看能打出個(gè)啥地基出來,嘿嘿。
本文摘自《草根》雜志第三期 -- http://www.lampbrother.net/grassroots/
這個(gè)地基應(yīng)該怎么打?說實(shí)話這非常依賴經(jīng)驗(yàn)。純理論派的家伙,別看他口若懸河講起理論來滔滔不絕,你一讓他給你寫一個(gè)出來看看,他立馬消失;純實(shí)戰(zhàn)派的家伙怎么樣,對比想象一下便知,在此不在廢話。我不喜歡蠻干,所以我推崇的是中庸之道:理論與實(shí)踐相結(jié)合。
看過一堆框架后相信很多人多少都對什么控制器、視圖、模型之類的東西有點(diǎn)熟悉了,在此也不多說。我想說的是,把眼光放遠(yuǎn)一點(diǎn),放靈活一點(diǎn),放實(shí)際一點(diǎn)。又遠(yuǎn)又實(shí)際?這不是矛盾么?那可未必。面向?qū)ο笫遣皇禽^新的開發(fā)方式?看著那么多粉絲前撲后繼“奔向”軟件開發(fā)的“真理”,我倒開始打退堂鼓。當(dāng)然,你可以認(rèn)為我面向?qū)ο竽芰Σ贿^關(guān):)然而翻開《人月神話》,感受一下真正的大師對面向?qū)ο箝_發(fā)方式的淡然的態(tài)度,我忽然覺得以前對面向?qū)ο箝_發(fā)的狂熱是多么幼稚……
實(shí)際上我想說的是,面向?qū)ο蟛贿^是一種普通的軟件開發(fā)方式,而且它的名字取得很莫名其妙,什么是“面向”對象?為什么是“面向”而不是“背向”?這很滑稽,所以我寧愿稱之為“對象化”編程,以跟“結(jié)構(gòu)化”編程相對應(yīng)。對象又多少種呢?在PHP里,基礎(chǔ)設(shè)施大部分是地基對象。注意,我說的是“對象”,而不是“類”。我很反感討論對象時(shí)把類扯進(jìn)來。PHP程序的一次運(yùn)行就像一個(gè)士兵到一個(gè)城堡內(nèi)送一封信,得到城主的處理后把結(jié)果送回,從進(jìn)城門到出城門這一過程就是PHP腳本的執(zhí)行過程。它的本質(zhì)就是“過程”,不認(rèn)識這個(gè)本質(zhì)的設(shè)計(jì)注定是失敗的。這個(gè)過程你會怎么設(shè)計(jì)?這就跟打基礎(chǔ)一樣啦。你會想,可能會有兩個(gè)士兵守城門,進(jìn)了城門后有向?qū)?,向?qū)柲阌惺裁词?,然后告訴你怎么走,走到目的地后又有士兵攔住你要證明,通過證明后才讓你進(jìn)入辦事處,然后才是實(shí)際的事務(wù),完成事務(wù)后一路返回,向各個(gè)守衛(wèi)告別,最后離開城門:整個(gè)過程就是PHP腳本的執(zhí)行過程。
發(fā)覺我經(jīng)常走題萬里,看,什么是靈活一點(diǎn)什么是實(shí)際一點(diǎn),怎么打地基,都跑九霄云外去了,抱歉抱歉。實(shí)際上靈活、實(shí)際等概念跟其它眾多優(yōu)秀設(shè)計(jì)理念完全是融合在一起的,不好單獨(dú)抽出來說明而不涉及其它概念,但基于這些互相融合的概念,設(shè)計(jì)出來的系統(tǒng)卻是非常靈活的系統(tǒng),具有非常低的互相糾纏關(guān)系,用術(shù)語說,是“耦合”關(guān)系。“零件”是極富表現(xiàn)力的隱喻,一個(gè)系統(tǒng)的動作都是由零件組織起來的。OK,回到城堡的例子,前面說的守衛(wèi)啊,向?qū)О【褪歉鞣N各樣的零件。零件需要“類”嗎?直接來看,不需要,它們各成自的職責(zé),管它什么類不類。當(dāng)你真正需要具有相 同職責(zé)的多個(gè)零件時(shí),你才真正需要類。我認(rèn)為就php的執(zhí)行模式來看,它應(yīng)該添加一個(gè)編程元素:對象,然后賦給它各種修飾,如抽象對象 啦,抽象接口啦,等等。偏偏PHP那班開發(fā)人員死腦筋,一味只知道照搬其它語言的概念,對“建設(shè)有PHP特色的編程模式”沒有沖勁。
好了,不再瞎扯了:)回到城堡上來。剛進(jìn)門需要一個(gè)人接待你,不管你要什么,你總是要進(jìn)門的嘛,所以初始檢查就是這個(gè)守衛(wèi)的責(zé)任了,放在PHP里,就是所謂的index.php,所有的請求統(tǒng)一由它來接收。這個(gè)守衛(wèi)要做些什么,有哪些職責(zé),都需要你這個(gè)設(shè)計(jì)師來設(shè)計(jì)。如果這個(gè)人不符合進(jìn)門標(biāo)準(zhǔn),那么不好意思,只能請你回去了,呵呵。如果通過了檢查,守衛(wèi)可能要根據(jù)你的要求來選擇為你服務(wù)的后續(xù)人員,比如你只認(rèn)識英文,那我當(dāng)然要給你布置英文環(huán)境了,呵呵。向?qū)в肿鍪裁茨?,它要根?jù)你想去的目的地為你指路,所以它需要知道你的目的地,和一張城堡地圖。如果在城堡地圖里找不到你要去的地方,那么sorry,您來錯(cuò)地方了,地圖是一件公有物品,因?yàn)槿绻姓l要告訴這個(gè)衛(wèi)兵另一個(gè)目的地的話,它都必須是在地圖里明確標(biāo)明的一個(gè)地方。對比到PHP里,你很容易就能知道這是一個(gè)dispatch+route的過程,呵呵。所以開發(fā)這些名詞的那些家伙也只是借了些隱喻而已,沒什么大不了的,只要你想象力豐富,你完全可以顛倒這個(gè)一般的城堡規(guī)則,按你的意思來構(gòu)建屬于你的城堡規(guī)則。
指令操作數(shù)據(jù)這種方式,跟數(shù)據(jù)本身具有綁定的指令這種方式,有什么本質(zhì)的區(qū)別?沒有質(zhì)的區(qū)別。你可能會跟我說在認(rèn)知上有區(qū)別,對,但這種區(qū)別我認(rèn)為并沒有想象中的那么大,只是把主動權(quán)倒了一下而已,并沒有多少神奇的能力和效果。面向?qū)ο缶幊虒?shí)在是被吹得太過了。
不覺得?再看看《領(lǐng)域驅(qū)動設(shè)計(jì)》里的服務(wù)。你覺得服務(wù)操作實(shí)體是不是跟指令操作數(shù)據(jù)非常相像?這是一個(gè)非常大的諷刺,面向?qū)ο蟮慕K點(diǎn),卻是它們所不屑的“指令操作數(shù)據(jù)”的編程方式!嗚呼,“面向?qū)ο蠹夹g(shù)并沒有給我們帶來‘神奇的效應(yīng)’,不管開發(fā)商如何吹噓面向?qū)ο?SPAN>OO(Object-Oriented)工具是多么萬能,也不管那些OO狂熱者是多么毅然地前赴后繼,這方面的數(shù)據(jù)從20世紀(jì)80年代以來并沒有發(fā)生大的改觀”。
反觀目前的PHP框架,有多少是遵循了軟件設(shè)計(jì)和對象式編程的精髓呢?很遺憾,沒有。Zend Framework?不客氣地說,它連幼兒都算不上,還只是個(gè)嬰兒,而且是個(gè)委員會產(chǎn)品,跟軟件藝術(shù)相差幾萬光年。
我不喜歡在領(lǐng)域?qū)觼y搞對象,這樣你只會給自己帶來麻煩,你很難靈活地把它們保存到數(shù)據(jù)庫中。雖然我不喜歡過早優(yōu)化,但即便是不優(yōu)化,對象映射到關(guān)系也是件很麻煩的事情,如果再需要為了性能進(jìn)行數(shù)據(jù)庫重構(gòu),引入各種不合關(guān)系數(shù)據(jù)原則的修改,則情況會更糟。軟件開發(fā)的首要使命就是降低復(fù)雜度,對象關(guān)系映射卻成功地把復(fù)雜度提高到了一個(gè)新的高度。當(dāng)然你熟悉了ORM,小系統(tǒng)開發(fā)起來非???,但不要把這套經(jīng)驗(yàn)照搬到大負(fù)載系統(tǒng)里來,這樣你會死得很慘。
再看看ROR,它現(xiàn)在已經(jīng)為了迎合所謂的“企業(yè)級應(yīng)用”而“成功地”變得越來越復(fù)雜,等著看它被徹底拋棄吧。