摘要: “你體會(huì)的挺深刻的啊,”老C點(diǎn)點(diǎn)頭,“你說的沒有錯(cuò),如果照這種方式寫代碼的確有些繁雜,因?yàn)檫@個(gè)工作不應(yīng)當(dāng)直接在編碼過程中進(jìn)行,而應(yīng)當(dāng)在設(shè)計(jì)過程中進(jìn)行。要解決這個(gè)問題,需要引入新的工具——UML……等會(huì)再給你解釋什么是UML……”制止住小P的發(fā)問,老C接著說,“確實(shí),將 index放在list內(nèi)部會(huì)造成種種不便,但是也有解決之道,比較經(jīng)典的做法是將index從list中拿出來單獨(dú)成為一個(gè)模塊或class,這就是 iterator設(shè)計(jì)模式,我們以后再慢慢說……”他停頓了一下,“至于怎么良好的設(shè)計(jì)list,也有一些經(jīng)驗(yàn)可以總結(jié),同時(shí)也有一些業(yè)內(nèi)的慣用法,這個(gè)我們接下來會(huì)更早討論這個(gè)問題。”
“噢?那么我應(yīng)當(dāng)先學(xué)習(xí)什么呢?”小P問。
“嗯,先接觸一下UML,”老C想想說道,“然后我給你講講一些關(guān)于線性表的慣用法或者習(xí)語。最后我們?cè)賮碛懻撊绾螌ndex與它的操作從list中拿出來。”
閱讀全文
摘要: “哦?這樣有什么好處呢?”小P問道。
“最大的好處是在語言層面對(duì)基于對(duì)象的編程方法給予了更多的支持,這樣在開發(fā)的時(shí)候開發(fā)人員的智力負(fù)擔(dān)會(huì)小很多……”老C停了一下,加重了語氣,“我們做事情的目的是簡化問題,任何新工具和新方法被發(fā)明的目的都是為了使問題看起來更簡單一些,而不是使問題看起來更復(fù)雜。”老C想了想,“如果你了解了某種語言特性所針對(duì)的需求,你就可以更準(zhǔn)確的使用這種語言特性而不會(huì)出現(xiàn)誤解,同時(shí)也會(huì)說,啊,這樣多好,不得不如此。”
閱讀全文
摘要: 老 C接過彩筆,在白板中間從上到下畫了一道線,左邊寫上思想,右邊寫上方法。“你先寫寫思想上的東西吧,”他喝了一口水,“思想是最重要的,我們需要通過學(xué)習(xí)語言來學(xué)習(xí)思想——只要學(xué)會(huì)了編程的思想,那么你再學(xué)習(xí)其他任何語言都會(huì)很快——要深入語言去學(xué)習(xí),而不是只是使用語言。首先我們的第一個(gè)經(jīng)驗(yàn)是,以數(shù)據(jù)為中心思考問題,而不是以活動(dòng)為中心思考問題。”
“嗯,好像沒有什么問題,如果我們以數(shù)據(jù)為中心思考問題,那么總會(huì)抽象出一些變化較少的,相對(duì)穩(wěn)定的數(shù)據(jù),將對(duì)數(shù)據(jù)的操作與數(shù)據(jù)捆綁到一個(gè)代碼單元中,這樣就可以有限度的復(fù)用已經(jīng)開發(fā)的代碼……”小P若有所思。
“呵呵,這只是一個(gè)好處,還有一些其他的好處,需要你在以后的編程中體會(huì)。”老C笑笑。這樣白板的左邊出現(xiàn)了第一個(gè)和第二個(gè)經(jīng)驗(yàn)的總結(jié)。
閱讀全文
摘要: “編譯……運(yùn)行……ok,我們的V1.01版本也好了。”老C又將所有文件拷貝到AppleGame_V1.01目錄下。
“等等,”小P問道,“我看不出有什么實(shí)質(zhì)性的變化啊,無非就是用一些static函數(shù)替換了原來的內(nèi)容,換湯不換藥啊。”
“呵呵,你看不出區(qū)別是因?yàn)槟闶煜ぃ绻愕谝淮慰创a,你會(huì)覺得是在代碼中看到QueMoveToNextChild(&(game->childrenQueue_))感覺好些,還是看到一堆鬼畫符似的結(jié)構(gòu)體點(diǎn)點(diǎn)點(diǎn)的感覺好?”老C解釋道,“意圖,這里強(qiáng)調(diào)意圖,因?yàn)槭褂昧撕瘮?shù)你一眼就可以看出程序執(zhí)行的意圖,而如果是一堆代碼的話,你還要反應(yīng)半天;如果明白了意圖,再去看代碼,感覺會(huì)好很多——而且你可以根據(jù)代碼意圖提出更好的實(shí)現(xiàn)方法;同時(shí)這樣也減少了代碼中注釋的工作量——一般在維護(hù)代碼的時(shí)候人們很少去修改注釋的;最后,如果你的具體實(shí)現(xiàn)需要被維護(hù),這樣也給維護(hù)代碼的人提供了線索,無需他在源代碼程序中找來找去……如果不小心還有可能將你的代碼進(jìn)行錯(cuò)誤的修改……”他找到水杯,喝了一大口,“總之不要害怕小而短的函數(shù),有時(shí)它們對(duì)閱讀代碼的人來說是很
閱讀全文
摘要: “很遺憾,一般概念都伴隨一些晦澀的術(shù)語,而一般人則視術(shù)語如猛虎,認(rèn)為術(shù)語只屬于學(xué)術(shù),在一般的實(shí)際開發(fā)中沒有什么用處——然而我們組織邏輯的最基本單位就是詞匯,如果我們?cè)谒伎肌⒔涣鞯臅r(shí)候連基本的詞匯也無法理解,那么就根本談不上什么思考和交流了——畢竟大多數(shù)人類還是靠語言進(jìn)行思考的,除了少數(shù)天才使用圖形和符號(hào)進(jìn)行思考;同時(shí)術(shù)語也簡化了我們交流的復(fù)雜度,比如我說PID,只要你理解了什么是PID這個(gè)概念,那么我就不用畫出框圖并解釋這個(gè)帶有比例、積分和微分環(huán)節(jié)的反饋系統(tǒng),這樣在行業(yè)內(nèi)工作的人們可以方便的使用術(shù)語進(jìn)行交流……羅嗦了這么多,只是希望你不要對(duì)這些晦澀的術(shù)語帶有排斥的心理,而是要慢慢習(xí)慣它們,接受它們……雖然有些術(shù)語名字起得的確有些腦殘……”老C喋喋不休的說道。
閱讀全文
摘要: “叫我看看……”小P開始比較代碼,“哦,在這個(gè)版本你用 game 代替了 queue,用 child 代替了 one, 但是有什么實(shí)質(zhì)區(qū)別?”小P有些不解。
“嗯,這個(gè)是一個(gè)用問題域詞匯編程而不是解決域詞匯編程的例子,最大的優(yōu)點(diǎn)是意圖明確,容易理解,代碼可讀性強(qiáng);另外一個(gè)好處是相對(duì)穩(wěn)定——比如用 game 代替 queue——其一,評(píng)審代碼的人可能會(huì)不明白這個(gè)queue是做什么的,為什么和下面的初始化函數(shù)格格不入,從而造成你頻繁的回答大量的溝通性的問題,這將大大影響你生活的穩(wěn)定性和質(zhì)量;其二,如果我們將來——我是說如果——使用list數(shù)據(jù)結(jié)構(gòu)來替換queue,避免了還要更改注釋的風(fēng)險(xiǎn)——代碼更新而注釋陳舊,正是我們?cè)谶M(jìn)行項(xiàng)目開發(fā)時(shí)一個(gè)特別特別特別的n次冪嚴(yán)重的問題……而使用問題域的詞匯,只要需求不發(fā)生變更,則我們就不需要修改什么而導(dǎo)致一些……代碼人格上的分裂……”
閱讀全文
摘要: “嗯,雖然理論上說只要保證你的代碼縮進(jìn)風(fēng)格前后統(tǒng)一就可以了,但是在現(xiàn)實(shí)生活中我們不會(huì)也不允許千人千面,因?yàn)榇蠹疫€是要互相交流的,讓任何人去適應(yīng)別人的縮進(jìn)風(fēng)格都是低效率和不公平的,因此形成了很多約定俗成的東西,哪怕它們不合理,但是它們的確形成了,而且你最好也遵守這樣的規(guī)矩,如果你違背了這些東西,只能說明要么你是搗亂,要么你是絕對(duì)的新手。”
“哦?”
“這些有點(diǎn)像江湖黑話,如果你不是混江湖的,在打切口的時(shí)候鬧了笑話,道上的兄弟一定會(huì)笑話你,新警察吧……”
“哈哈哈哈……”
“就我所知,目前江湖上有幾種常用的黑話格式,K&R,BSD和GNU等,無論你采用哪一種,別人看了就知道你是道上混的,而且知道了你的山頭,也就會(huì)高看你一眼……”
閱讀全文
摘要: “我看不懂……”老P才看了30秒就決定放棄了。
“不會(huì)吧,我覺得我寫得邏輯性還挺清楚的啊。”小P有些得意老C看不懂他寫的代碼,覺得可能自己寫的邏輯過于高深了。
“……”老C沉默了半分鐘,“這個(gè)不是C代碼!”他肯定的說道,“所以我看不懂,也不想看懂。”
“?”小P有些奇怪,“這明明就是C語言寫的代碼啊,你看,我來給你解釋解釋……”
“哦,算了,這些根本不是C代碼,我沒有必要看懂。”
“那你說這些是什么?”小P有些不高興了。
“這些是……”老C找著合適的形容詞匯,“這些是貓爬過屏幕的腳印,我沒有必要看懂腳印所代表的含義……”看到小P有些驚愕,然后開始有些生氣,逐漸開始惱羞成怒了,老C趕快對(duì)他說:“呵呵,別生氣了,我開玩笑的,不過,”老C的語氣嚴(yán)肅起來,“這些的確是很糟糕的代碼,哪怕它的算法多么高效,執(zhí)行效率多么高,它都是糟糕的代碼!”
閱讀全文
摘要: “呵呵,”老C停止了和小P的說笑,覺得下午的疲倦一掃而空,“對(duì)了,剛才你在忙什么呢?”
“喔,我在做C++的練習(xí)題目。”
“是么?這么刻苦,厲害。什么題目?”
“呵呵,還挺有趣的,說是用C++的格式輸出cout在屏幕上輸出各種對(duì)齊的數(shù)據(jù),用*號(hào)組成一個(gè)五角星,還有……”
“天,功不是這樣用的,習(xí)不是這樣學(xué)的……”老C有些囧,“扔掉那本爛書吧,沒有這樣學(xué)習(xí)C++的。”
閱讀全文
摘要: “好像一段代碼對(duì)其具體實(shí)現(xiàn)了解的越少,它的維護(hù)性就會(huì)越好?”小P有些猜測(cè)。
“呵呵,的確,那么我們通過各種不同的方法達(dá)到了什么樣的看似相同的目的?”老C開始掉小P的胃口。
“信息隱藏?”小P不太確定。
“信息隱藏是手段,但不是目的。”老C很確定的否決掉小P,“我們達(dá)到的目的是控制問題的規(guī)模!”
老C覺得有必要給小P講講哲學(xué):“我們寫軟件的目的是為了解決現(xiàn)實(shí)生活中的具體問題,沒錯(cuò)吧?”
“沒錯(cuò),的確是這樣,可是這個(gè)和C++有什么關(guān)系的?”小P覺得有些莫名其妙。
“那么你覺得使用高級(jí)的語言、先進(jìn)的設(shè)計(jì)和合理的開發(fā)流程,問題的復(fù)雜度會(huì)降低嗎?”
“那是啊,問題的復(fù)雜度當(dāng)然會(huì)降低啊。”
“唉,錯(cuò)了,問題的復(fù)雜度不會(huì)降低的,因?yàn)閱栴}的復(fù)雜度是客觀存在,不會(huì)因?yàn)槿酥饔^的原因而改變!”
閱讀全文