日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

什么是简单

發(fā)布時間:2023/12/20 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 什么是简单 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

什么是簡單


一、什么是簡單

蘋果的風靡引爆了世界,改變了人們的生活。其最吸引人的一點,就是簡單。喬布斯說:“簡單之所以比復雜更難,是因為你必須努力清空你的大腦,讓它變得簡單。”平時,也經(jīng)常聽到同事們在說,要把系統(tǒng)做簡單一點,好用一點。

那么究竟什么是簡單呢?

百事不知問問百度百科:

詞語:簡單

  反義詞:復雜 困難

近義詞:容易

釋義:

①結構單純;頭緒少;與復雜相對;容易理解、使用或處理:情節(jié)~ㄧ~扼要ㄧ這種機器比較~ㄧ他簡簡單單說了幾句話。

②(經(jīng)歷、能力等)平凡(多用于否定式):李隊長主意多,有魄力,可真不~。

③草率;不細致:~從事。

④對自然規(guī)律的一種理解和追求。如自然定律的簡單性。W.海森伯說:今天,我們甚至可以以更極端的形式說,“靜止”一詞是由地球靜止著這個陳述來定義的,并且我們把相對于地球是不動的每一物體描述為靜止的。如果對“靜止”一詞作如此理解——而這是普遍接受的意義——那么,托勒密是對的,哥白尼卻錯了。只有當我們沉思了“運動”和“靜止”的概念,并把運動理解為至少是關于兩個物體的關系的陳述,我們才能夠把關系倒轉過來,使太陽成為行星系的不動的中心并獲得一個簡單得多、也更統(tǒng)一的關于行星系的觀點,后來牛頓充分評價了這種觀點的闡明的力量。因此,哥白尼把一個全新的要素加到直接經(jīng)驗之上,我稱這個要素為“自然定律的簡單性”,而它與直接經(jīng)驗毫無關系。

中國古代哲人對世界的一種理解。聶文濤說:《系辭上》認為乾卦通過變化來顯示智慧,坤卦通過簡單來顯示能力。把握變化和簡單,就把握了天地萬物之道。所以“乾以易知,坤以簡能。”“易簡,而天下之理得矣。”古人以此研究天地、萬物、社會、生命和健康。辨證的世界讓我們對每件事的拿捏都要恰到好處,簡單有時就是容易,簡單有時卻恰恰是不容易。

⑥一種現(xiàn)代審美。如~人生、~法則。

⑦基本的,不能縮小或減少的。如~再生產(chǎn)、~分嗎組、~物質等。

動詞。有簡化的意思。如,把問題~一點。

?

看看釋義⑤,“簡單有時就是容易,簡單有時卻恰恰是不容易。”換句話說:簡單的事物難以構造,但易于理解;復雜的事物易于構造,但難于理解。

因此,簡單和容易,是完全兩個概念。簡單是一個客觀的描述,即它能否反映事物本質的東西,就像上面所說的“自然定律的簡單性”。而容易,則更加主觀,它表明了事物能否在我的能力范圍之內(nèi)去解決它。如果我們只做容易的事情,會容易地導致復雜度的快速膨脹,最終導致失控。

事實上,我們目前就是在容易的寫程序。

二、軟件領域中的簡單

好吧,回到我們要討論的軟件領域。

我們不妨先看看《代碼大全》怎么說的:

“設計的首要目標就是要讓復雜度最小。要避免做出“聰明的”設計,因為“聰明的”設計常常是難于理解的。應該做出簡單且易于理解的設計。如果你的程序設計方案不能讓你在專注于程序的一部分時安心的忽視其他部分的話,這一設計就沒有什么作用了。”【注:第五章軟件構建中的設計,P80】

我們再看看簡單設計的最初提出者Kent Beck怎么說的。他在《實現(xiàn)模式》一書中,充分強調(diào)了簡單:

“在各個設計層次上都應當要求簡單。對代碼進行調(diào)整,刪除所有不提供信息的代碼。設計中不出現(xiàn)無關的元素。對需求提出質疑,找出最本質的概念。去掉多余的復雜性后,就好像有一束光照亮了余下的代碼,你就有機會用全新的視角來處理它們。”【注:第三章一種編程理論 P14】

用Kent Beck再體現(xiàn)的一個隱喻來說,就是“把麥子和糠分開,是編程中不可或缺的一部分。”【注:第三章 一種編程理論 P14】

因此,請不要再隨意的使用“簡單”這個詞,除非你理解了它。

那么如果在軟件領域中,非要再給簡單下個定義,我認為下面這個定義是比較精確的:

簡單就是:

1) 清晰的抽象:聚焦領域,形成抽象層并隱藏細節(jié)

2) 清楚的表達:對概念進行有意義的,簡潔而不晦澀的展現(xiàn)與溝通

三、如何理解簡單

對于第一點,我們也許認為已經(jīng)有所掌握,比如會說我會寫類來表達對象以及隱藏細節(jié),會用繼承、多態(tài)來表達對象關系。但這里強調(diào)的是,要把焦點放在問題定義上。就像多根細細的棉線,如何在大風中保持每根互不纏繞?就像周立波的頭勢,每時每刻每根頭發(fā)都保持清爽?清晰的抽象表達了本質的概念以及概念之間的關系,這才是不變的東西。它和程序沒有關系,和C++、C、Java也沒有關系。

我們拿最簡單的例子來說,我們說值。值是什么?本質上就是一個數(shù)字,1,2,3。值本身不會變。1能變成2嗎?不能。但這個概念,映射到實現(xiàn)層面,就變成了C++里面的常量,變量。最近流行的趨勢是,不要用變量,要盡量用常量const。這就是業(yè)界在朝值的本質概念進化的過程。那么變量是什么?I = 1;經(jīng)過一個運算,I=2了。這就違背了數(shù)學意義上值的本質,使得程序不再是確定性的,從來帶來了復雜度。我們沒覺得它有問題,那只是說,這種復雜度在你的控制之下。如果我們換種寫法呢?I=1;I = I+1。I最后是2。那么這種問題就會更大。為什么呢?如果你在多線程環(huán)境下,訪問和修改I,這就要處理它的并發(fā)保護,這就是把I的值的變化和時間進行耦合的結果,它的復雜度又增加了。在某些語言中,I=1后,I的值就不再變化,始終是1,比如Erlang。

1> X=1.

1

2> X=2.

** exception error: no match of right hand side value 2

這樣,語言特性就保證了對概念的精確表達。這就是第二個問題:清楚的表達。

清楚的表達是實現(xiàn)層面的問題。要特別注意的是,它應該建立在清晰抽象的基礎上。那么這個時候就涉及到面向對象、分層、編程語言等等各種實現(xiàn)層面的表達力問題。但值得我們擔憂的是,清楚的表達在很大程度上被我們忽略了。比如我們看一個例子:按鈕。我們說,按鈕是個概念。那么這個概念如何表達呢?是不是這樣?

Button ?text=“Apply”;color= Green;command=accumulate

好,那問題來了,我們?nèi)绾斡肅++實現(xiàn)這個表達?代碼會是什么樣子?比如是不是這樣:

Button button(“Apply”, Green,accumulate)

還是這樣:

Button button(“text=\“Apply\”;color=Green;command=accumulate”)

我們再想想,在各種語言里面,它是怎樣的?有沒有這種表達力?

那么如何實現(xiàn)表達力呢?出于對表達力的深刻認識,我們開始使用DSL(Domain Specification Language)、使用原語、使用XML。

但問題是,我們現(xiàn)在確實充分使用了這些工具,但卻對第一點(清晰的抽象)沒有分析透徹,結果導致了難以使用的API。

所以說,簡單的事物難以構造,但一旦真正能夠構造成功,它確實很容易使用和擴展。

我們再看一個Python的例子,它來源于ZTE CCCG(Clean Code Coach Group)核心教練團隊為代碼大全培訓提高班提供的LayerOutDSL實戰(zhàn)例題。這個題目設計的初衷就是實現(xiàn)控件的布局,起因是因為Python提供的布局管理器Sizer太難用。

首先我們看問題定義部分。

我們知道,控件的布局,其實就是相對的位置。比如Button1在Button2的左邊,Edit1在TreeView1的上邊。這種相對位置就是布局核心的概念。那么我們的控件是什么?就是一個待顯示的元素:Element,Element需要知道它在哪里顯示,它的父控件是誰。

我們先看一個用上述模型構建出來的計算器模型(純粹的界面,無事件響應):

?

然后我們再看如何清晰表達。

代碼摘選:

calcblk = block_with_margin([

???????????????? btn('7'),btn('8'), btn('9'), btn('/'), btn('Mod'), btn('And'),

???????????????? btn('4'),btn('5'), btn('6'), btn('*'), btn('Or'), btn('Xor'),

???????????????? btn('1'),btn('2'), btn('3'), btn('-'), btn('Lsh'), btn('Not'),

???????????????? btn('0'),btn('+/-'), btn('.'), btn('+'), btn('='), btn('Int'),

???????????????? btn('A'),btn('B'), btn('C'), btn('D'), btn('E'), btn('F')], 5 ,6, 0.05)

這是輸入數(shù)字盤的代碼。它表明了這是一組button的block,而且?guī)в辛舭椎摹btn…]是button列表,5為行數(shù),6為列數(shù),0.05表明留白占據(jù)整個區(qū)域的比例(四周均勻留白)。

block_with_margin返回的是什么呢?是和Element一樣的閉包。

def block_with_margin(eles, r, c, ratio):

??? cc = lambda x: center(x,ratio, ratio)

??? return block([cc(ele)for ele in eles], r, c)

為什么要這樣設計?

因為從概念上講,block_with_margin之后,應該還可以和其他的Element閉包一起再組合。這就給程序代碼帶來了極大的靈活性。它本質上反映的是一種世界觀,即:

1) 定義多種原子,其具有統(tǒng)一原型,可以認為就是“值”

2) 定義多種原子操作,其為“值”的處理,返回的還是原子,可以認為是“函數(shù)”

3) 定義原子之間的控制,可以認為是“過程”。過程是對外有實體意義的東東。

其實,這就是函數(shù)式編程的主要內(nèi)容。

這種表達我們認為是清楚的,因為我們很容易看懂(這里需要特別注明,所謂容易看懂,不是指你第一眼就能理解它,而是一旦你理解了它,你就能徹底掌握它。它區(qū)別與你貌似懂了,但以后再遇到,你還是需要重新理解),而且很容易擴展。

四、工具集

在清晰的抽象和清楚的表達的表達之間,還有一個轉換過程,我們稱之為工具集。

工具集是指像面向對象、分層、語言、重構、TDD等各種使能手段。就是說,如果你知道了問題定義,也知道怎么去表達,你總歸要實現(xiàn)這種表達,工具集就是提供你實現(xiàn)的手段。你要知道各種工具是解決什么問題的,讓讓你的工具和你的問題進行良好的匹配。比如說你實現(xiàn)并發(fā),那么用線程就不一定是一個好的選擇,因為線程是一個重量型的工具,你要處理同步、維護狀態(tài)變化,這往往使得線程難以控制。這時你可以考慮進程,甚至你可以學習Erlang來解決它。如果你實在不想學,那么你就必須要把線程內(nèi)的狀態(tài)和時序變化,變成確定性的行為,隔離開線程間的交換和變化,使得線程在你的控制之下,而不是依靠debug去尋找莫名其妙的故障。要知道,debug的本質含義,是你理解問題,并可以在腦子里把代碼流程順一遍,而不是說你用IDE去幫助你理解問題。IDE不可能幫助你理解問題,除非你真的理解了問題。

從前面分析,我們知道簡單是很難的。所以,你要始終關注簡單性,這貫穿于整個代碼周期。要對簡單理解到位,并始終堅持,就是你要做的。至于如何能夠做到簡單,如何保持簡單,這是另外的話題。

五、總結

我們總結一下前面說的內(nèi)容。在這里,我直接引用了常高偉的blog《什么是簡單的設計》【注:www.cnblogs.com/chgaowei/archive/2011/07/16/2108321.html】的文章:

1)首先要能夠解決實際問題的;

這是所有設計要達到的首要目標,雖然實現(xiàn)的手段和方法,效果不同。簡單的設計也必須達到這個目標。

2)易于理解的;易于實現(xiàn)的;易于維護的;

我認為這是簡單的設計最吸引人的地方,也是它最有價值的地方。

3)把握問題的本質的設計;

物體運動的表現(xiàn)形式很復雜,但是它的本質:牛頓定理卻簡單。所以,我認為事物的本質是簡單的,之所以復雜,可能是因為我們還沒有把握事物的本質。

4)避免了過度設計;

過度設計是追求簡單設計的一個非常大的障礙。多未必好,過猶不及。

5)往往是對復雜設計的再加工,經(jīng)歷了簡單——復雜——簡單——復雜——簡單的循環(huán)的過程。

追求簡單設計的過程是一個逐漸深入的過程,最終會深入到問題的本質。

6)往往比復雜的設計更加需要思考的投入;

編程是一項很復雜的工作,是一個很有挑戰(zhàn)性的智力活動,程序員完全不是IT民工,也不是軟件藍領。如果你真的是想把公司做大做強,那就雇傭最好的程序員,讓他們把事情做簡單。

?

聲明:

文中引用了ZTE資深架構師鄧輝的一些觀點和代碼示例,僅供學習使用。

總結

以上是生活随笔為你收集整理的什么是简单的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。