資料介紹
過(guò)度封裝是程序員最容易犯的錯(cuò), 因?yàn)槭欠襁^(guò)度并沒(méi)有固定的數(shù)值標(biāo)準(zhǔn), 只能是有經(jīng)驗(yàn)的程序員基于科學(xué)的判斷。過(guò)度封裝的危害十分嚴(yán)重, 所以必須重視, 并且極力避免。
首先, 什么是“過(guò)度封裝”? 我們知道, 計(jì)算機(jī)科學(xué)領(lǐng)域最稱(chēng)為經(jīng)典也是最強(qiáng)大的思想便是遞歸, 分而治之。但是, 遞歸本身最重要的因素是: 結(jié)束條件。 一生二, 二生三, 三生萬(wàn)物, 總要有終止的條件吧? 不然一輛車(chē)不停地急馳, 你怎樣上車(chē)?
新手程序員, 特別是非科班出身的文科程序員, 最容易犯了過(guò)度封裝的錯(cuò)誤的原因就是不知道何時(shí)適可而止, 腦筋往往不斷地分解分解再分解問(wèn)題, 最后, 你看到的就是這個(gè)調(diào)用那個(gè), 那個(gè)引用這個(gè), 亂七八糟毫無(wú)頭緒, 三兩行代碼的函數(shù)比比皆是, 自以為封裝抽象, 其實(shí)是拿捏不好這個(gè)度。
一旦過(guò)度封裝, 直接的危害往往是寫(xiě)了無(wú)數(shù)行代碼, 封裝了N多個(gè)類(lèi), 就是看不出一個(gè)完整的功能, 因?yàn)榉至哑饋?lái)收不住。即使最終把功能實(shí)現(xiàn)了, 代碼維護(hù)性也讓人不忍直視。
如何判斷是否過(guò)度封裝? 如何避免過(guò)度封裝? 我認(rèn)為, 只要掌握了一個(gè)原則, 時(shí)刻以這個(gè)原則為準(zhǔn)繩, 那便幾乎不會(huì)犯過(guò)度封裝的錯(cuò)誤。
這個(gè)原則便是“直觀優(yōu)先”原則, 代碼邏輯以直觀為最優(yōu)先的原則, 其它的原則均低于此原則, 即使有一百個(gè)考慮, 如果違反了直觀原則, 都必須放棄掉而優(yōu)先保證直觀原則。
舉一個(gè)例子:
function closeDialog() { login.close(); message.close(); 。。.close(); } var action = { close: function () { closeDialog(); }, backout: function () { if (BACKOUT_ID) { 。。. } } }; $(document).on(’click‘, function (e){ var $that = $(e.target); for ( var k in action) { if ( $that.hasClass(’action-‘+k) ) { action[k].call(e.target); } } });
這樣的代碼就是過(guò)度封裝的經(jīng)典體現(xiàn)!
首先, closeDialog() 這個(gè)函數(shù)不應(yīng)該存在, 而應(yīng)該被展開(kāi), 因?yàn)楹瘮?shù)只被調(diào)用一次, 而且沒(méi)有邏輯上的獨(dú)立性的必要。
其次, 上面的函數(shù)通過(guò)跳轉(zhuǎn)表的方式來(lái)逃避直接的函數(shù)調(diào)用, 這是對(duì)跳轉(zhuǎn)表技術(shù)的極大濫用! if-else 加函數(shù)調(diào)用是最直觀的分支跳轉(zhuǎn)方式, 完全沒(méi)有必要在這個(gè)例子里使用跳轉(zhuǎn)表技術(shù)。
先解釋一下什么是跳轉(zhuǎn)表技術(shù), 這是一個(gè)非常古老而基礎(chǔ)的計(jì)算機(jī)編程領(lǐng)域的技術(shù)。跳轉(zhuǎn)表包含很多層含義, 簡(jiǎn)單的說(shuō), 就是將邏輯代碼塊放到一個(gè)索引表中, 代碼編寫(xiě)過(guò)程通過(guò)傳遞索引項(xiàng)來(lái)最終調(diào)用相應(yīng)的邏輯代碼塊(因?yàn)槎嗵幰茫?/p>
第一次聽(tīng)到或者見(jiàn)到跳轉(zhuǎn)表技術(shù)的程序員的心情, 如果你想體驗(yàn)的話, 你想想當(dāng)你寫(xiě)了無(wú)數(shù)的 if-else 之后, 你發(fā)現(xiàn)了 switch-case 時(shí)的心情, 或者是你第一次聽(tīng)到函數(shù)指針這個(gè)事物時(shí)的心情。
但是, 像 js 之類(lèi)高級(jí)語(yǔ)言, 已經(jīng)把跳轉(zhuǎn)表技術(shù), 直接融合到了語(yǔ)言的語(yǔ)法本身, 如類(lèi)(class)。 你不需要實(shí)現(xiàn)自己的跳轉(zhuǎn)表技術(shù), 你只需要用好語(yǔ)言本身的特性即可。
所以, 上面的代碼應(yīng)該改成:
$(document).on(’click‘, function (e){ var $that = $(e.target); if ( $that.hasClass(’action-close‘) ) { login.close(); message.close(); 。。.close(); } if ( $that.hasClass(’action-backout‘) ) { if (BACKOUT_ID) { 。。. } } });
這是最直觀, 最正常, 人人都應(yīng)該寫(xiě)成這樣的代碼。如果你還想顯式地使用查找表技術(shù)以體現(xiàn)自己牛逼, 我是說(shuō), 如果你真想裝逼的話, 你可以這樣寫(xiě):
var action = { close: function () { login.close(); message.close(); 。。.close(); }, backout: function () { if (BACKOUT_ID) { 。。. } } }; $(document).on(’click‘, function (e){ var $that = $(e.target); var func_name = $(that).attr(’action‘); if(func_name && action[func_name]){ action[func_name](); } });
如果都這樣寫(xiě)了, 那和直接在 html 標(biāo)簽里寫(xiě) onclick 屬性有什么區(qū)別? 難道通過(guò) class 綁定事件就高級(jí), 寫(xiě) onclick 指明回調(diào)函數(shù)的名字就不高級(jí)了?
所以我勸你最好不要裝逼也別裝傻, 乖乖地有理有據(jù)有邏輯地寫(xiě)代碼, 讓代碼的邏輯直觀起來(lái), 不要過(guò)度封裝。如果你內(nèi)心封裝的欲望太強(qiáng)的話, 那我勸你學(xué)學(xué) Go 語(yǔ)言, 把自己的思想強(qiáng)加到一種自己新發(fā)明的語(yǔ)言上來(lái)(我估計(jì)你沒(méi)那種本事)。不然, 直觀優(yōu)先, 不要過(guò)度封裝。
- 程序員表白程序
- ISI 程序員指南
- 打開(kāi) LNS 程序員參考
- LNS 程序員指南
- ISI 程序員指南
- LNS 程序員指南
- 程序員的浪漫《Rice DIY設(shè)計(jì)》
- 程序員如何規(guī)劃自己的成長(zhǎng)之路
- 程序員必備專(zhuān)用單詞快來(lái)學(xué)習(xí)吧! 22次下載
- 程序員需要學(xué)什么,微軟資深程序員學(xué)習(xí)手冊(cè)面試寶典資料 30次下載
- 程序員羊皮卷下載版(程序員必備) 0次下載
- 程序員2011第5期 0次下載
- 程序員2011第9期 0次下載
- 程序員2011第11期 0次下載
- ADO程序員指南
- 5款程序員最佳的代碼比較工具 5331次閱讀
- 六款程序員必看的前端在線開(kāi)發(fā)工具 2689次閱讀
- 怎樣提升程序員的硬核實(shí)力?關(guān)于程序員的未來(lái)發(fā)展 1877次閱讀
- 盤(pán)點(diǎn)Java程序員不能錯(cuò)過(guò)的7個(gè)基本框架,完美構(gòu)建復(fù)雜應(yīng)用 2979次閱讀
- 程序員為什么記不住所有的代碼如何解決這個(gè)問(wèn)題 7100次閱讀
- 程序員需要知道的那些定理和法則 3020次閱讀
- 程序員值得一看的9本學(xué)習(xí)算法經(jīng)典書(shū)籍 4w次閱讀
- 華為資深工程師:程序員與碼農(nóng)的差異在哪? 3620次閱讀
- 一個(gè)電子發(fā)燒友的程序員成長(zhǎng)之路 6751次閱讀
- 對(duì)技術(shù)的執(zhí)著和美的追求變成了程序員的“詩(shī)和遠(yuǎn)方” 1962次閱讀
- 數(shù)據(jù)顯示:中國(guó)程序員是世界上最牛的程序員 606次閱讀
- 碼農(nóng)和程序員之間就在這5個(gè)關(guān)鍵點(diǎn)! 596次閱讀
- 我們對(duì)技術(shù)的依賴(lài)有多強(qiáng)?程序員為何關(guān)注它? 983次閱讀
- 程序員真正的價(jià)值是什么? 1609次閱讀
- 嵌入式程序員需要了解的幾個(gè)問(wèn)題 1248次閱讀
下載排行
本周
- 1電子電路原理第七版PDF電子教材免費(fèi)下載
- 0.00 MB | 1490次下載 | 免費(fèi)
- 2單片機(jī)典型實(shí)例介紹
- 18.19 MB | 92次下載 | 1 積分
- 3S7-200PLC編程實(shí)例詳細(xì)資料
- 1.17 MB | 27次下載 | 1 積分
- 4筆記本電腦主板的元件識(shí)別和講解說(shuō)明
- 4.28 MB | 18次下載 | 4 積分
- 5開(kāi)關(guān)電源原理及各功能電路詳解
- 0.38 MB | 10次下載 | 免費(fèi)
- 6基于AT89C2051/4051單片機(jī)編程器的實(shí)驗(yàn)
- 0.11 MB | 4次下載 | 免費(fèi)
- 7藍(lán)牙設(shè)備在嵌入式領(lǐng)域的廣泛應(yīng)用
- 0.63 MB | 3次下載 | 免費(fèi)
- 89天練會(huì)電子電路識(shí)圖
- 5.91 MB | 3次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234313次下載 | 免費(fèi)
- 2PADS 9.0 2009最新版 -下載
- 0.00 MB | 66304次下載 | 免費(fèi)
- 3protel99下載protel99軟件下載(中文版)
- 0.00 MB | 51209次下載 | 免費(fèi)
- 4LabView 8.0 專(zhuān)業(yè)版下載 (3CD完整版)
- 0.00 MB | 51043次下載 | 免費(fèi)
- 5555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33562次下載 | 免費(fèi)
- 6接口電路圖大全
- 未知 | 30320次下載 | 免費(fèi)
- 7Multisim 10下載Multisim 10 中文版
- 0.00 MB | 28588次下載 | 免費(fèi)
- 8開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21539次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935053次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537791次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234313次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233045次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191183次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183277次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138039次下載 | 免費(fèi)
評(píng)論
查看更多