GO語言面試系列:(七)如果你是一個(gè)Golang面試官地梨,你會(huì)問哪些問題?

這篇文章翻譯自一位外國友人的關(guān)于面試后端程序員的文章先誉,我比較喜愛這篇文章湿刽。一是因?yàn)樗鼧O大的拓寬了我的視角的烁,另一方面是其中的一些問題非常具有啟發(fā)性褐耳。不僅對(duì)于面試者,對(duì)于面試官來說也是個(gè)不錯(cuò)的參考渴庆。于是迫不及待的翻譯了一下铃芦,給各位看官做個(gè)參考雅镊。

原文參見 @arialdomartini的: Back-End Developer Interview Questions

以下是原文翻譯。

  1. 通用問題
  2. 開放式問題
  3. 設(shè)計(jì)模式相關(guān)問題
  4. 代碼設(shè)計(jì)相關(guān)問題
  5. 語言相關(guān)問題
  6. Web相關(guān)問題
  7. 數(shù)據(jù)庫相關(guān)問題
  8. 非關(guān)系型數(shù)據(jù)庫相關(guān)問題
  9. 代碼版本管理相關(guān)問題
  10. 并發(fā)問題
  11. 分布式系統(tǒng)相關(guān)問題
  12. 軟件生命周期和團(tuán)隊(duì)管理相關(guān)問題
  13. 邏輯和算法相關(guān)問題
  14. 軟件架構(gòu)相關(guān)問題
  15. 面向服務(wù)架構(gòu)(SOA)和微服務(wù)(Microservice)相關(guān)問題
  16. 安全相關(guān)問題
  17. 比爾蓋茨式問題
  18. 代碼示例問題

通用問題:

  • 語言設(shè)計(jì)中空引用(null reference)的存在有什么問題刃滓?假設(shè)你想要將空引用的概念從你的首選語言中移除仁烹,可能導(dǎo)致什么結(jié)果?
  • 為什么函數(shù)式編程重要咧虎?什么時(shí)候適用函數(shù)式語言卓缰?
  • 設(shè)計(jì)(design)、架構(gòu)(architecture)砰诵、功能(functionality)和美學(xué)(aesthetic)之間有什么區(qū)別征唬?討論一下。
  • 微軟茁彭、谷歌总寒、歐朋(opera)和火狐這類公司是如何從他們的瀏覽器中獲利的?
  • 為什么打開TCP套接字有很大的開銷理肺?
  • 封裝的重要性體現(xiàn)在哪兒摄闸?
  • 什么是實(shí)時(shí)系統(tǒng)?它與普通系統(tǒng)有什么區(qū)別妹萨?
  • 實(shí)時(shí)語言(real-time language)和堆內(nèi)存分配(heap memory allocation)之間的關(guān)系是什么年枕?
  • 不變性(Immutability)是指: (變量的)值只能在創(chuàng)建的時(shí)候被設(shè)置一次,之后就不能被改變眠副。為什么不變性對(duì)寫更加安全的代碼有幫助画切?
  • 可變值(mutable values)和不可變值(immutable values)有哪些優(yōu)缺點(diǎn)?
  • 什么是O/R阻抗失衡(Object-Relational impedence mismatch)囱怕?
  • 如果你需要使用緩存霍弹,你使用哪些原則來確定緩存的大小娃弓?
  • TCP和HTTP有什么區(qū)別典格?
  • 在客戶端渲染(client-side rendering)和服務(wù)端渲染(server-side rendering)之間,你是如何權(quán)衡的台丛?
  • 如何在一個(gè)不可靠的協(xié)議之上構(gòu)建一個(gè)可靠的通信協(xié)議耍缴?

開放式問題:

  • 為什么人們會(huì)抵制變化?
  • 如何向你的祖母解釋什么是線程挽霉?
  • 作為一個(gè)軟件工程師防嗡,你想要既要有創(chuàng)新力,又要產(chǎn)出具有可預(yù)測(cè)性侠坎。采用什么策略才能使這兩個(gè)目標(biāo)可以共存呢蚁趁?
  • 什么是好的代碼?
  • 解釋什么是流(Streaming)和如何實(shí)現(xiàn)一個(gè)流实胸?
  • 假設(shè)你的公司給你一周的時(shí)間他嫡,用來改善你和同事的生活: 你將如何使用這一周番官?
  • 本周你學(xué)了什么?
  • 所有的設(shè)計(jì)中都會(huì)有美學(xué)元素(aesthetic element)的存在钢属。問題是徘熔,你認(rèn)為美學(xué)元素是你的朋友還是敵人?
  • 列出最近你讀過的5本書淆党。
  • 假設(shè)目前有個(gè)大型公司(非常有錢)酷师,他們的開發(fā)流程是瀑布式流程(Waterfall),如果需要你在他們公司引入持續(xù)交付(Continue Devivery)染乌,你會(huì)怎么做窒升?
  • 我們來談?wù)劇?em>重復(fù)造輪子“,”非我發(fā)明癥“, “吃自己做出來的狗糧“的這些做法吧。

(注: 重復(fù)造輪子: Reinventing the wheel; 非我發(fā)明癥:Not Invented Here Syndrome; 吃自己做出來的狗糧: Eating Your Own Dog Food)

  • 在你當(dāng)前的工作流中慕匠,什么事情是你計(jì)劃下一步需要自動(dòng)化的饱须?
  • 為什么寫軟件是困難的?是什么使軟件的維護(hù)變得困難台谊?
  • 你更喜歡在全新項(xiàng)目(Green Field Project)上工作還是在已有項(xiàng)目(Brown Field Project)基礎(chǔ)上工作蓉媳?為什么?
  • 當(dāng)你在瀏覽器地址欄輸入google.com回車之后都發(fā)生了什么?
  • 當(dāng)操作系統(tǒng)CPU處于空閑的時(shí)候锅铅,它可能在處理哪些事情酪呻?
  • 如何向一個(gè)5歲的孩子解釋什么是Unicode/數(shù)據(jù)庫事務(wù)?
  • 如何維護(hù)單體架構(gòu)(monolithic architecture)盐须?
  • 一個(gè)”專業(yè)的開發(fā)者”意味著什么玩荠?
  • 軟件開發(fā)是藝術(shù)、是技藝還是工程贼邓?你的觀點(diǎn)是什么阶冈?
  • “喜歡這個(gè)的人也喜歡…”,如何在一個(gè)電子商務(wù)商店里實(shí)現(xiàn)這種功能塑径?
  • 為什么在創(chuàng)新上女坑,企業(yè)會(huì)比創(chuàng)業(yè)公司慢些?
  • 為什么說统舀,你不應(yīng)該嘗試應(yīng)用自己發(fā)明或者設(shè)計(jì)的密碼學(xué)匆骗?

設(shè)計(jì)模式相關(guān)問題:

  • 請(qǐng)用一個(gè)例子表明,全局對(duì)象是邪惡的存在誉简。
  • 假設(shè)你工作的系統(tǒng)不支持事務(wù)性碉就,你會(huì)如何從頭開始實(shí)現(xiàn)它?
  • 什么是好萊塢原則(Hollywood Principles)闷串?
  • 關(guān)于迪米特法則(最少知識(shí)原則): 寫一段代碼違反它, 然后修復(fù)它瓮钥。

(注: 迪米特法則:the Law of Demeter, 最少知識(shí)原則: the Principle of Least Knowledge)

  • Active-Record模式有什么限制和缺陷?
  • Data-Mapper模式和Active-Record模式有什么區(qū)別?
  • 空對(duì)象模式(Null Object Pattern)的目的是什么骏庸?
  • 為什么組合(Composition)比繼承(Inheritance)更好?
  • 什么是反腐敗層(Anti-corruption Layer)?
  • 你可以寫一個(gè)線程安全的單例(Singleton)類嗎年叮?
  • 數(shù)據(jù)抽象(Data Abstraction)能力是指能改變實(shí)現(xiàn)而不影響客戶端的這種能力具被。請(qǐng)構(gòu)造一個(gè)一個(gè)例子,違反這個(gè)特性只损,并且嘗試修復(fù)它一姿。
  • 你是如何處理依賴關(guān)系地獄(Dependency Hell)的?
  • 為什么說goto語句是惡魔般的存在跃惫?
  • 健壯性是進(jìn)行軟件設(shè)計(jì)時(shí)的一個(gè)通用原則叮叹,它建議 “發(fā)送時(shí)要保守,接收時(shí)要開放”爆存。這也經(jīng)常被寫成蛉顽,“做一個(gè)有耐心的讀者,做一個(gè)謹(jǐn)慎的作者”先较。你能解釋一些這背后的邏輯嗎携冤?

譯者注: “發(fā)送時(shí)要保守,接收時(shí)要開發(fā)”的原文是: “Be conservative in what you send, be liberal in what you accept”闲勺,有點(diǎn)類似于“嚴(yán)于律己曾棕,寬于待人”的意味。

代碼設(shè)計(jì)相關(guān)問題:

  • 你在進(jìn)行軟件設(shè)計(jì)時(shí)會(huì)考慮軟件測(cè)試嗎菜循?軟件測(cè)試是如何影響軟件設(shè)計(jì)的翘地?
  • 內(nèi)聚和耦合的區(qū)別是什么?
  • 重構(gòu)在哪些場(chǎng)景下有用癌幕?
  • 代碼中的注釋有用嗎衙耕?
  • 設(shè)計(jì)和架構(gòu)有什么區(qū)別?
  • 為什么在測(cè)試驅(qū)動(dòng)開發(fā)(TDD)中是先寫測(cè)試勺远,再寫代碼臭杰?
  • C++支持多繼承,Java允許類實(shí)現(xiàn)多個(gè)接口谚中。這些特性對(duì)正交性有什么影響渴杆?使用多繼承和使用多接口有區(qū)別嗎?[這個(gè)問題來自Andrew .Hunt 和 David Thomas寫的《程序員修煉之道》]
  • 在存儲(chǔ)過程(Stored Procedures)中寫業(yè)務(wù)邏輯有什么優(yōu)缺點(diǎn)宪塔?

語言相關(guān)問題:

  • 告訴我你的首選語言的三個(gè)最壞的缺陷磁奖。
  • 為什么現(xiàn)在函數(shù)式編程這么越來越受關(guān)注?
  • 閉包是什么某筐?它有什么用途比搭?閉包和類有什么共同點(diǎn)?
  • 泛型有什么用途南誊?
  • 什么是高階函數(shù)身诺?有什么用途蜜托?用你的首選語言寫個(gè)例子出來。
  • 討論一下霉赡,如何寫一個(gè)循環(huán)橄务,然后把它轉(zhuǎn)換成遞歸函數(shù),要避免易變性穴亏。
  • 有些語言將函數(shù)視為第一公民蜂挪,這是什么意思?
  • 用一個(gè)例子說明匿名函數(shù)是有用的嗓化。
  • 什么是動(dòng)態(tài)方法調(diào)度(Dynamic Method Dispatch)棠涮?
  • 名字空間(Namespace)有什么用?有什么可以替代它的嗎刺覆?
  • 談?wù)凧ava和C#之間的互操作性(Interoperability) (任選其他兩門語言都行)
  • 為什么很多軟件工程師不喜歡Java严肪?
  • 你認(rèn)為好的語言好在哪里?差的語言差在哪里谦屑?
  • 寫兩個(gè)函數(shù)诬垂,一個(gè)是”引用透明的(Referentially Transparent)”,另一個(gè)是”引用不透明的(Referentially Opaque)”伦仍。討論之结窘。
  • 什么是棧?什么是堆充蓝?
  • 為什么一個(gè)語言中隧枫,”函數(shù)是第一公民”是很重要的?
  • 模式匹配(Pattern Matching)和Switch語句(Switch clauses)的區(qū)別在哪兒谓苟?
  • 為什么有些語言設(shè)計(jì)上沒有異常機(jī)制官脓?這有什么優(yōu)缺點(diǎn)?
  • 如果Cat是一個(gè)Animal, 那么TaskCare<Cat>是一個(gè)TakeCare<Animal>嗎涝焙?

web相關(guān)問題:

  • 為什么”第一方cookie(first-party cookie)”和”第三方cookie(third-party cookie)”被如此不同的對(duì)待卑笨?

數(shù)據(jù)庫相關(guān)問題:

  • 如果要你將一個(gè)項(xiàng)目從MySQL遷移至PostgreSQL中,你會(huì)如何遷移仑撞?
  • 為什么SELECT * FROM table WHERE field = null不能匹配空的字段赤兴?
  • 什么是ACID(原子性,一致性隧哮,隔離性桶良,持久性)原則?
  • 你是如何進(jìn)行數(shù)據(jù)庫模式(Database schema)遷移的沮翔?
  • 延遲加載(lazy loading)是如何實(shí)現(xiàn)的陨帆?什么場(chǎng)景下有用?他有什么缺陷?
  • 什么是N+1問題疲牵?
  • 如何找出應(yīng)用中開銷最大的查詢承二?

非關(guān)系型數(shù)據(jù)庫相關(guān)問題:

  • 什么是最終一致性(Eventual Consistency)?
  • 關(guān)于CAP理論纲爸,舉一些CP亥鸠、AP、CA系統(tǒng)的例子缩焦。
  • NoSQL是如何解決可伸縮性的挑戰(zhàn)的?
  • 什么情況下你會(huì)使用類似于MongoDB的文檔數(shù)據(jù)庫而不是關(guān)系型數(shù)據(jù)庫(如Mysql或者PostgreSQL)责静?

代碼版本管理相關(guān)問題:

  • 為什么在Mercurial或者git中(管理)分支比SVN容易袁滥?
  • 分散式版本控制系統(tǒng)(比如git),相比集中式版本控制系統(tǒng)(如svn)有哪些優(yōu)勢(shì)和劣勢(shì)灾螃?

(注:集中式版本控制系統(tǒng): Centralized Version Control Systems题翻;分散式版本控制系統(tǒng): Distributed Version Control Systems)

  • 能描述一下什么是GitHubFlow和GitFlow工作流嗎?
  • 什么是rebase腰鬼?
  • 為什么合并操作(merge)在Mercurial和git中比在SVN和CVS中容易嵌赠?

并發(fā)問題:

  • 為什么我們需要并發(fā)呢?解釋一下熄赡。
  • 為什么測(cè)試多線程/并發(fā)代碼這么困難姜挺?
  • 什么是競(jìng)爭(zhēng)條件(Race Condition)?用任何一個(gè)語言寫一個(gè)例子彼硫。
  • 什么是死鎖炊豪?用代碼解釋一下。
  • 什么是餓死拧篮?
  • 什么是Wait-Free算法词渤?

分布式系統(tǒng)相關(guān)問題:

  • 怎么測(cè)試一個(gè)分布式系統(tǒng)?
  • 什么場(chǎng)景下你會(huì)在兩個(gè)系統(tǒng)中采用異步通信機(jī)制串绩?
  • 遠(yuǎn)程過程調(diào)用的通用缺點(diǎn)是什么缺虐?
  • 如果你為了可擴(kuò)展性和魯棒性而構(gòu)建一個(gè)分布式的系統(tǒng),分別在封閉安全的網(wǎng)絡(luò)環(huán)境情況下礁凡,和地理上的位置不同但是網(wǎng)絡(luò)環(huán)境不是封閉和安全的情況下高氮,你會(huì)考慮什么不同的事情?
  • 在Web應(yīng)用中如何管理容錯(cuò)性顷牌?在桌面端呢纫溃?
  • 在分布式系統(tǒng)中,如何處理故障韧掩?
  • 讓我們來談?wù)劸W(wǎng)絡(luò)分裂(network partitions)后有的幾種恢復(fù)的手段吧紊浩。
  • 你認(rèn)為分布式計(jì)算中有哪些謬論?
  • 你在什么時(shí)候會(huì)使用Request/Response模式,什么時(shí)候使用Publish/Subscribe模式坊谁?

軟件生命周期和團(tuán)隊(duì)管理相關(guān)問題:

  • 什么是敏捷(Agility)费彼?
  • 你是如何處理遺留代碼(Legacy Code)的?
  • 假設(shè)我是你們公司的CEO口芍,請(qǐng)向我解釋什么是看板箍铲,并且說服我在它上面投資。
  • 敏捷(Agility)和瀑布(Waterfall)之間的最大區(qū)別是什么鬓椭?
  • 作為團(tuán)隊(duì)管理者颠猴,你對(duì)會(huì)議太多這個(gè)問題是如何處理的?
  • 你會(huì)如何處理延期很長(zhǎng)時(shí)間了的項(xiàng)目小染?
  • 個(gè)體與交互重于過程和工具“和”客戶協(xié)作重于合同談判“占了敏捷宣言(Agile Manifesto)的一半翘瓮,談?wù)撘幌逻@兩個(gè)觀念。
  • 如果你是你們公司的CTO裤翩,你會(huì)采取什么樣的決策资盅?
  • 你覺得項(xiàng)目經(jīng)理有用嗎?
  • 如果要你組織一個(gè)彈性工作制的開發(fā)團(tuán)隊(duì)(即沒有強(qiáng)制工作時(shí)間的要求)踊赠,并且假期制度是”按需休假”呵扛,你會(huì)如何做?
  • 你會(huì)如何管理一個(gè)人員流動(dòng)非常高的團(tuán)隊(duì)筐带?如何在不加薪的條件下說服團(tuán)隊(duì)成員不要離開今穿?
  • 除了代碼之外,你最關(guān)注你的同事的哪3項(xiàng)素質(zhì)伦籍?
  • 關(guān)于代碼荣赶,你最希望非技術(shù)人員能知道的的三件事是什么?

邏輯和算法相關(guān)問題:

  • 只用LIFO棧如何構(gòu)造一個(gè)FIFO隊(duì)列鸽斟?只用FIFO隊(duì)列如何構(gòu)造一個(gè)LIFO棧拔创?
  • 寫一段有棧溢出的代碼。
  • 寫一個(gè)尾遞歸版本的階乘函數(shù)富蓄。
  • 使用任何一個(gè)語言剩燥,寫一個(gè)REPL,功能是echo你輸入的字符串立倍。然后將它演化成一個(gè)逆波蘭表達(dá)式的計(jì)算器灭红。
  • 如果需要你設(shè)計(jì)一個(gè)文件系統(tǒng)磁盤碎片整理程序,你會(huì)如何設(shè)計(jì)口注?
  • 寫一個(gè)生成隨機(jī)迷宮的程序变擒。
  • 寫一段有內(nèi)存泄漏的示例代碼。
  • 隨機(jī)生成一個(gè)的數(shù)字序列寝志,里面每個(gè)數(shù)字都不同娇斑。
  • 寫一個(gè)簡(jiǎn)單的垃圾回收系統(tǒng)策添。
  • 使用任何一門語言,寫一個(gè)基本的消息代理毫缆。
  • 寫一個(gè)基礎(chǔ)的web服務(wù)器唯竹,然后畫一張線路圖,展示你將來還想要實(shí)現(xiàn)的功能苦丁。
  • 如何對(duì)一個(gè)10GB的文件進(jìn)行排序浸颓?如果是10TB的數(shù)據(jù),你會(huì)采用什么方法旺拉?
  • 請(qǐng)實(shí)現(xiàn)rnd()函數(shù)

軟件架構(gòu)相關(guān)問題:

  • 什么情況下緩存是沒用的产上,甚至是危險(xiǎn)的?
  • 為什么事件驅(qū)動(dòng)的架構(gòu)能提高可擴(kuò)展性(scalability)蛾狗?
  • 什么樣的代碼是可讀性強(qiáng)的代碼晋涣?
  • 緊急設(shè)計(jì)(Emergent Design)和演化架構(gòu)(Evolutionary Architecture)之間的區(qū)別是什么?
  • 橫向擴(kuò)展(scale out) vs 縱向擴(kuò)展(scale up): 有什么區(qū)別淘太?分別在什么場(chǎng)景下使用姻僧?
  • 分布式系統(tǒng)中如何處理”故障切換(failover)”和”用戶會(huì)話(user session)”规丽?
  • 什么是CQRS(Command Query Responsibility Segregation)?他和最早的Command-Query Separation原則有什么區(qū)別蒲牧?
  • 什么是三層架構(gòu)?
  • 如何設(shè)計(jì)一個(gè)可擴(kuò)展性高的系統(tǒng)赌莺?
  • 處理C10k問題的策略有哪些冰抢?
  • 如果讓你來設(shè)計(jì)一個(gè)去中心化的P2P系統(tǒng),你會(huì)如何設(shè)計(jì)艘狭?
  • 為什么CGI的擴(kuò)展性不好挎扰?
  • 在設(shè)計(jì)系統(tǒng)時(shí),你如何防止供應(yīng)商依賴(Vendor Lock-in)巢音?
  • 在可擴(kuò)展性上遵倦,發(fā)布/訂閱(Publish-Subscribe)模式有什么缺點(diǎn)?
  • 80年代以后官撼,CPU有哪些變化梧躺?這些變化,對(duì)編程產(chǎn)生了什么影響傲绣?
  • 性能生命周期(performace lifecycle)中掠哥,你認(rèn)為哪個(gè)部分是需要考慮進(jìn)去的? 如何管理秃诵?
  • 除了惡意攻擊造成的拒絕服務(wù)現(xiàn)象以外续搀,哪些設(shè)計(jì)或者架構(gòu)上的問題會(huì)導(dǎo)致拒絕服務(wù)?
  • 性能和可擴(kuò)展性之間有什么關(guān)系菠净?
  • 什么時(shí)候緊耦合是OK的禁舷?
  • 一個(gè)系統(tǒng)要有什么特征才能適配云計(jì)算環(huán)境(Cloud Ready)彪杉?
  • Does unity of design imply an aristocracy of architects?

面向服務(wù)架構(gòu)(SOA)和微服務(wù)(Microservice)相關(guān)問題:

  • 在SOA中,為什么長(zhǎng)期存活的事務(wù)(Long-lived transation)不被看好榛了,而Saga卻被看好在讶?
  • SOA和MicroService之間有什么區(qū)別?
  • 我們來談?wù)刉eb服務(wù)的版本管理霜大、版本兼容性构哺、重大變更管理這些事情吧.
  • 在saga中事務(wù)和補(bǔ)償操作(compensation operation)之間的區(qū)別是什么?在SOA中呢战坤?
  • 微服務(wù)不能做得太”微”曙强,你認(rèn)為什么時(shí)候微服務(wù)太”微”了?
  • MicroService架構(gòu)的優(yōu)劣是什么途茫?

安全相關(guān)問題:

  • 什么是雙因素認(rèn)證(Two Factor Authentication)碟嘴?在一個(gè)已有的Web應(yīng)用中,你如何實(shí)現(xiàn)這種機(jī)制囊卜?

比爾蓋茨式問題:

  • 如果你把一面鏡子放在掃描儀上娜扇,會(huì)發(fā)生什么?
  • 假設(shè)有一個(gè)和你完全一樣的克隆人栅组,而他是你的上司雀瓢,你愿意和他工作嗎?
  • 現(xiàn)在請(qǐng)你面試一下我玉掸。
  • 為什么Quora上的回答會(huì)比Yahoo Answer上的回答好刃麸?
  • 對(duì)手是現(xiàn)代語言,你的任務(wù)是要為Cobol辯護(hù)司浪,你會(huì)如何進(jìn)行泊业?
  • 10年后的你是什么樣子?
  • 假設(shè)你是我老板啊易,我被解雇了吁伺。你會(huì)如何通知我?
  • 我想要重構(gòu)一個(gè)系統(tǒng)租谈,而你想要從頭重寫篮奄。我們來爭(zhēng)論一下該怎么弄吧。然后我們反轉(zhuǎn)角色垦垂,再爭(zhēng)論一下宦搬。
  • 老板要你對(duì)公司撒謊,你的反應(yīng)是什么劫拗?
  • 如果你可以穿越到以前间校,你會(huì)給年輕時(shí)候的你什么建議?

代碼示例問題:

  • 這段Javascript函數(shù)的輸出是什么页慷?
function hookupevents() {
  for (var i = 0; i < 3; i++) {
    document.getElementById("button" + i)
      .addEventListener("click", function() { 
        alert(i); 
      });
  }
}

  • 關(guān)于類型擦除(Type Erasure)憔足,這段Java代碼的輸出是什么胁附?為什么?
ArrayList<Integer> li = new ArrayList<Integer>();
ArrayList<Float> lf = new ArrayList<Float>();
if (li.getClass() == lf.getClass()) // evaluates to true
  System.out.println("Equal");

  • 你能指出哪兒有內(nèi)存泄漏嗎滓彰?
public class Stack {
    private Object[] elements;
    private int size = 0;
    private static final int DEFAULT_INITIAL_CAPACITY = 16;

    public Stack() {
        elements = new Object[DEFAULT_INITIAL_CAPACITY];
    }

    public void push(Object e) {
        ensureCapacity();
        elements[size++] = e;
    }

    public Object pop() {
        if (size == 0)
            throw new EmptyStackException();
        return elements[--size];
    }

    /**
     * Ensure space for at least one more element, roughly
     * doubling the capacity each time the array needs to grow.
     */
    private void ensureCapacity() {
        if (elements.length == size)
            elements = Arrays.copyOf(elements, 2 * size + 1);
    }
}

  • if語句控妻,或者更加通用點(diǎn),條件表達(dá)式通常是過程式編程/命令式編程的形式揭绑。你能去掉這段代碼中的switch語句弓候,用面向?qū)ο蟮姆绞絹硇薷倪@段代碼嗎?
public class Formatter {

    private Service service;

    public Formatter(Service service) {
        this.service = service;
    }

    public String doTheJob(String theInput) {
        String response = service.askForPermission();
        switch (response) {
        case "FAIL":
            return "error";
        case "OK":
            return String.format("%s%s", theInput, theInput);
        default:
            return null;
        }
    }
}

  • 你能去掉這里的if語句他匪,將它改成更加面向?qū)ο髥幔?/li>
public class TheService {
    private final FileHandler fileHandler;
    private final FooRepository fooRepository;

    public TheService(FileHandler fileHandler, FooRepository fooRepository) {
        this.fileHandler = fileHandler;
        this.fooRepository = fooRepository;
    }

    public String Execute(final String file) {

        final String rewrittenUrl = fileHandler.getXmlFileFromFileName(file);
        final String executionId = fileHandler.getExecutionIdFromFileName(file);

        if ((executionId == "") || (rewrittenUrl == "")) {
            return "";
        }

        Foo knownFoo = fooRepository.getFooByXmlFileName(rewrittenUrl);

        if (knownFoo == null) {
            return "";
        }

        return knownFoo.DoThat(file);
    }
}

  • 如何重構(gòu)這段代碼菇存?
function()
{
    HRESULT error = S_OK;

    if(SUCCEEDED(Operation1()))
    {
        if(SUCCEEDED(Operation2()))
        {
            if(SUCCEEDED(Operation3()))
            {
                if(SUCCEEDED(Operation4()))
                {
                }
                else
                {
                    error = OPERATION4FAILED;
                }
            }
            else
            {
                error = OPERATION3FAILED;
            }
        }
        else
        {
            error = OPERATION2FAILED;
        }
    }
    else
    {
        error = OPERATION1FAILED;
    }

    return error;
}

作者:王爵nice
鏈接:https://www.zhihu.com/question/67846139/answer/257359743
來源:知乎
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)邦蜜,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處依鸥。

添加小編微信:grey0805,加入知識(shí)分享小分隊(duì)悼沈,別掉隊(duì)哦贱迟!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市絮供,隨后出現(xiàn)的幾起案子衣吠,更是在濱河造成了極大的恐慌,老刑警劉巖杯缺,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蒸播,死亡現(xiàn)場(chǎng)離奇詭異睡榆,居然都是意外死亡萍肆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門胀屿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來塘揣,“玉大人,你說我怎么就攤上這事宿崭∏渍。” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵葡兑,是天一觀的道長(zhǎng)奖蔓。 經(jīng)常有香客問我,道長(zhǎng)讹堤,這世上最難降的妖魔是什么吆鹤? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮洲守,結(jié)果婚禮上疑务,老公的妹妹穿的比我還像新娘沾凄。我一直安慰自己,他們只是感情好知允,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布撒蟀。 她就那樣靜靜地躺著,像睡著了一般温鸽。 火紅的嫁衣襯著肌膚如雪保屯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天涤垫,我揣著相機(jī)與錄音配椭,去河邊找鬼。 笑死雹姊,一個(gè)胖子當(dāng)著我的面吹牛股缸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吱雏,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼敦姻,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了歧杏?” 一聲冷哼從身側(cè)響起镰惦,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎犬绒,沒想到半個(gè)月后旺入,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凯力,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年茵瘾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咐鹤。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拗秘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出祈惶,到底是詐尸還是另有隱情雕旨,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布捧请,位于F島的核電站凡涩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏疹蛉。R本人自食惡果不足惜活箕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氧吐。 院中可真熱鬧讹蘑,春花似錦末盔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至版仔,卻和暖如春游盲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蛮粮。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國打工益缎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人然想。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓莺奔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親变泄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子令哟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,286評(píng)論 25 707
  • 用兩張圖告訴你,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料妨蛹? 從這篇文章中你...
    hw1212閱讀 12,744評(píng)論 2 59
  • 10--羅曉佳 這是一張大學(xué)一年級(jí)( 2002年)拍攝的照片屏富。 他們是我的同學(xué)兼室友,至今仍然記得我們一起的快樂時(shí)...
    天上云111閱讀 258評(píng)論 4 2
  • 平衡情緒是一種能力蛙卤,你必須以不壓抑的當(dāng)時(shí)辯識(shí)狠半、認(rèn)知、接納并協(xié)調(diào)你的情緒颤难。情緒可以指點(diǎn)我們正確的方向神年,幫助我們做出更...
    劉鼻涕26閱讀 241評(píng)論 0 0
  • 書不在于讀多,只在于讀好乐严。有時(shí)反復(fù)嚼的東西反而更香瘤袖,久了總會(huì)化為生活的瑣碎衣摩,來給你交代昂验。 記得有個(gè)朋友曾跟我說,讀...
    言色閱讀 246評(píng)論 0 0