Re: [討論] Clean Code vs Efficiency
其實這要看你的抽象化程度
一般在閱讀程式的時候除非有必要,否則都不會追究到程式架構的最底端
我們都會在抽象化程度偏高的地方瀏覽,真的有需要才會再往下一層去檢視實作
如果你的程式會讓閱讀者想要看裡面的實作通常代表
1. 你的設計沒辦法交代清楚它到底確切在做什麼?需要什麼?使用時機?使用限制?…
…
一些慣例(命名慣例,design patterns…)可以讓閱讀者一眼就取得這些隱含的資訊
2. 這個東西的功能太神奇了(程式行為超出預期),超出一般人的預期
像是 qt 的 signal slot 機制就會讓第一次接觸的人摸不著頭腦
因為它用名稱來配對 signal slot 的做法不是標準的 c++ 語言可以做到的
3. 底層程式有蟲,要抓蟲啦
4. 你的 code 很漂亮,很能夠引人入勝,讓人家很想一直繼續往下看 XD
所以說,要是有一個好的設計
那麼閱讀者根本就不需要去看那些效率取向的,最佳化過後的難懂的實作
因為你的設計就已經提供給閱讀者他想要的所有資訊
根本不需要自己去閱讀實作慢慢推敲啊
以上是對於提升整個系統整體的可讀性,如果是要考慮實作本身的可讀性的話
那麼重點就會放在職責的切割和分配
最快最有效率的檢查方式就是看在同一個 block 內的 code 的抽象化程度是否差不多
要是上一行是系統頂層的操作,下一行又是底層的東西,看起來一定很痛苦吧
而且這樣把兩個不同階層的東西綁在一起就是在製造多餘的相依性
回到原 po 演算法取捨的問題,我會推 policy based design
它不但保留了程式的擴充性,又不損失效能,超美的 XD
※ 引述《gitignore (git)》之銘言:
: 最近上班在思考這問題
: 假如今天有個 O(log n) 的方法可以寫出一個東西
: 但是程式碼無法簡化 以後維護的人應該也會很痛苦
: 因為不直觀
: 另一個就是程式碼非常簡潔 但就一定是O(n) 甚至 O(n^2)
: 不知道大家會傾向於哪種?
: 我個人是比較喜歡clean code 因為過一陣字自己回來維護也比較快上手
: 但是感覺在學校學這麼多 就是要能寫出效率較好的程式碼
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 49.217.64.252
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1464373625.A.CE0.html
※ 編輯: CoNsTaR (49.217.64.252), 05/28/2016 02:29:15
推
05/28 08:07, , 1F
05/28 08:07, 1F
→
05/28 08:09, , 2F
05/28 08:09, 2F
→
05/28 08:09, , 3F
05/28 08:09, 3F
→
05/28 08:11, , 4F
05/28 08:11, 4F
→
05/28 08:12, , 5F
05/28 08:12, 5F
→
05/28 08:13, , 6F
05/28 08:13, 6F
推
05/28 10:48, , 7F
05/28 10:48, 7F
推
05/28 10:57, , 8F
05/28 10:57, 8F
→
05/28 11:29, , 9F
05/28 11:29, 9F
推
05/28 13:25, , 10F
05/28 13:25, 10F
推
05/28 20:44, , 11F
05/28 20:44, 11F
→
05/28 20:44, , 12F
05/28 20:44, 12F
→
05/28 20:45, , 13F
05/28 20:45, 13F
要是每種 policy 的組合都有可能在執行時期用到的話
就會像你說的 要選擇用哪個特化版勢必要一堆 if else switch
不過要是你能夠忍受整個程式除了 main 以外所有函數都是 function template 的話
把目前的組合當作 template parameter 就不必一直重複判斷 整個程式可以只出現一次
switch XD
不過這種需要"組合搭配"的 本來就不會選擇用 policy based
這種情況下多型會適合很多
推
05/28 21:41, , 14F
05/28 21:41, 14F
→
05/28 21:41, , 15F
05/28 21:41, 15F
→
05/28 21:41, , 16F
05/28 21:41, 16F
其實我覺得會需要"改程式"(而非只改功能) 就是有太多不該有的相依性
也就是職責的切割和分配一定出了問題
例如用你想要 增加/刪除/替換 某功能當例子好了
1. 假設你想增加某功能 會發現找不到一個適合的坑把新功能加進去
因為另一個佔著同一個坑的程式片段還負責了其他事情
所以如果你也想佔這個坑 勢必得一併把這些"其他事情"也寫進你的東西裡 否則塞不進這
個坑
2. 假設你想移掉一個功能 結果你發現你需要往下一層看實作
那通常代表你想移掉的功能可能又順便做了一點點其他事情
(它可能負責提供介面也負責做事,這聽起來沒什麼大問題,但是如果你把它直接刪掉,
那少了這個介面,上下就兜不起來了,如果一開始就把介面分開寫,你就可以直接刪掉原
本的功能,然後提供一個什麼都不做的版本銜接介面,介面再銜接上下)
或者是它本來就光明正大的被包含在一個負責不只一件事情的東西裡
所以你沒辦法直接移除它 不是要去修改實作就是要自己再寫另一份取代原本的
3. 替換同刪掉
不過這都只是我自己的想法 因為我根本還沒有工作過 唯一的合作夥伴就是自己
所以也不知道外面業界到底生態如何(我還只有大一)所以這些還是看看就好 XDD
※ 編輯: CoNsTaR (163.18.32.152), 05/29/2016 08:14:01
推
05/29 09:04, , 17F
05/29 09:04, 17F
→
05/29 09:04, , 18F
05/29 09:04, 18F
→
05/29 09:04, , 19F
05/29 09:04, 19F
→
05/29 09:04, , 20F
05/29 09:04, 20F
→
05/29 09:04, , 21F
05/29 09:04, 21F
推
05/29 10:29, , 22F
05/29 10:29, 22F
推
05/29 10:32, , 23F
05/29 10:32, 23F
→
05/29 10:32, , 24F
05/29 10:32, 24F
推
05/29 10:39, , 25F
05/29 10:39, 25F
→
05/29 10:39, , 26F
05/29 10:39, 26F
推
05/29 10:50, , 27F
05/29 10:50, 27F
推
05/29 10:57, , 28F
05/29 10:57, 28F
→
05/29 10:57, , 29F
05/29 10:57, 29F
推
05/29 11:02, , 30F
05/29 11:02, 30F
→
05/29 11:02, , 31F
05/29 11:02, 31F
→
05/29 11:02, , 32F
05/29 11:02, 32F
推
05/29 11:04, , 33F
05/29 11:04, 33F
推
05/29 11:10, , 34F
05/29 11:10, 34F
→
05/29 11:10, , 35F
05/29 11:10, 35F
→
05/29 11:10, , 36F
05/29 11:10, 36F
→
05/29 11:10, , 37F
05/29 11:10, 37F
還有 159 則推文
還有 25 段內文
→
06/01 12:47, , 197F
06/01 12:47, 197F
※ 編輯: CoNsTaR (163.18.32.152), 06/01/2016 15:44:49
※ 編輯: CoNsTaR (163.18.32.152), 06/01/2016 17:14:41
※ 編輯: CoNsTaR (163.18.32.152), 06/01/2016 18:09:51
推
06/02 09:34, , 198F
06/02 09:34, 198F
→
06/02 09:34, , 199F
06/02 09:34, 199F
→
06/02 09:34, , 200F
06/02 09:34, 200F
→
06/02 09:35, , 201F
06/02 09:35, 201F
→
06/02 09:35, , 202F
06/02 09:35, 202F
→
06/02 09:35, , 203F
06/02 09:35, 203F
→
06/02 09:35, , 204F
06/02 09:35, 204F
→
06/02 09:35, , 205F
06/02 09:35, 205F
→
06/02 09:35, , 206F
06/02 09:35, 206F
→
06/02 09:35, , 207F
06/02 09:35, 207F
→
06/02 09:35, , 208F
06/02 09:35, 208F
→
06/02 09:35, , 209F
06/02 09:35, 209F
→
06/02 09:35, , 210F
06/02 09:35, 210F
→
06/02 09:35, , 211F
06/02 09:35, 211F
→
06/02 09:35, , 212F
06/02 09:35, 212F
→
06/02 09:35, , 213F
06/02 09:35, 213F
→
06/02 09:35, , 214F
06/02 09:35, 214F
→
06/02 09:35, , 215F
06/02 09:35, 215F
→
06/02 09:35, , 216F
06/02 09:35, 216F
→
06/02 09:35, , 217F
06/02 09:35, 217F
→
06/02 09:35, , 218F
06/02 09:35, 218F
→
06/02 09:35, , 219F
06/02 09:35, 219F
→
06/02 09:35, , 220F
06/02 09:35, 220F
→
06/02 09:35, , 221F
06/02 09:35, 221F
→
06/02 09:35, , 222F
06/02 09:35, 222F
→
06/02 09:35, , 223F
06/02 09:35, 223F
→
06/02 09:35, , 224F
06/02 09:35, 224F
→
06/02 09:35, , 225F
06/02 09:35, 225F
→
06/02 09:35, , 226F
06/02 09:35, 226F
→
06/02 09:35, , 227F
06/02 09:35, 227F
→
06/02 09:35, , 228F
06/02 09:35, 228F
→
06/02 09:35, , 229F
06/02 09:35, 229F
→
06/02 09:35, , 230F
06/02 09:35, 230F
→
06/02 09:35, , 231F
06/02 09:35, 231F
→
06/02 09:35, , 232F
06/02 09:35, 232F
→
06/02 09:35, , 233F
06/02 09:35, 233F
→
06/02 09:35, , 234F
06/02 09:35, 234F
→
06/02 22:12, , 235F
06/02 22:12, 235F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):