惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
The GitHub Blog
The GitHub Blog
J
Java Code Geeks
Engineering at Meta
Engineering at Meta
N
Netflix TechBlog - Medium
A
About on SuperTechFans
博客园 - 三生石上(FineUI控件)
罗磊的独立博客
MongoDB | Blog
MongoDB | Blog
B
Blog RSS Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
有赞技术团队
有赞技术团队
T
Tailwind CSS Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Vercel News
Vercel News
腾讯CDC
博客园 - 聂微东
The Cloudflare Blog
F
Fortinet All Blogs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Visual Studio Blog
Last Week in AI
Last Week in AI
B
Blog

Nic Lin's Blog

謝明真 - 高效領導力的課後筆記 NFT 開發實戰!基礎智能合約入門 (3) NFT 開發實戰!基礎智能合約入門 (2) NFT 開發實戰!基礎智能合約入門 (1) 如何自我檢測 log4j CVE 漏洞 Rails 如何在資料寫入時記錄來源 IP 位置 如何經營工程師 Youtube 頻道 - Part 8 營收篇 如何經營工程師 Youtube 頻道 - Part 7 酸民文化篇 如何經營工程師 Youtube 頻道 - Part 5 設備器材篇 如何經營工程師 Youtube 頻道 - Part 4 後製剪輯篇 如何經營工程師 Youtube 頻道 - Part 3 文案企劃篇 如何經營工程師 Youtube 頻道 - Part 2 設備器材篇 如何經營工程師 Youtube 頻道 - Part 1 制訂頻道方向篇 如何經營工程師 Youtube 頻道 - Part 0 Rails 中避免 race condition 的最佳實踐(二) Rails 中避免 race condition 的最佳實踐(一) 10 分鐘整合 google sheet 做自動化開發功能週報 經營 Side Project 300 天所帶來的收穫及挑戰 我的 Youtube 影片製作流程 API 設計時必須注意的 HTTP header 底線問題 如何提升你的程式可讀性之實務技巧(三) 如何提升你的程式可讀性之實務技巧(二) 如何提升你的程式可讀性之實務技巧(一) Ruby 中使用 freeze 優化效能的時機 避免 React 中的 useEffect 無限 render 在 Rails 內輕量使用 Vue Component 的最佳實踐 如何在區域網路用 Docker 架設有 SSL 的 Gitlab 從被問到問人,那些我常問的面試問題 [Rails] 如何漂亮寫出可維護的 query (Maintainable Rails Query) 在已知長度情況下優化 slice 的性能
Meta programming 的雙面刃體悟
Nic Lin · 2017-02-18 · via Nic Lin's Blog

我們都知道,在編程寫代碼的時候,都會秉持一些 Best Practices,例如最常見的 DRY ,每一個開發者都希望自己的代碼能夠簡潔且易維護,這不外乎是一個成為更棒開發者的指標,我們在使用動態語言時,能夠輕易達到 Don’t repeat yourself 這個模式。

而 Meta programming ,能夠讓程式自己寫出動態的代碼,豈不是令人稱羨的實踐,但真的這麼好嗎?我們利用短短的一個定義只要五行的代碼,取代原先三個定義而十五行的代碼,看似讓日後的維護工作更容易。

但我卻遇過前輩曾經對我提出的一個問題,如果新人在開發 feature 的時候找不到這個 method 呼叫的源頭,他有可能會對整個專案做全域搜尋,但他可能沒想過這是由動態產生的程式碼,那個時候,他是不是有可能增加了尋找的困難?

起初我認為這是一個說詞而已,阻止使用 Meta programming 的可笑說詞,明明我可以辦到讓程式碼更簡潔, why can’t do it?

直到後來,我才逐漸明白,這樣的動態產生有時是一種雙面刃,他在某部分讓程式碼「看起來」更簡潔了,但可能對往後的每一次搜尋增加了十秒,程式碼永遠都是「讀」比「寫」還要多次,除非你能做到對一個團隊、或是一個專案,在動態產生已經是習慣的事情,例如 Ruby 世界裡最著名的 find_by , dynamic *_path URL path

莫過於更多的單元測試,最簡單的竟是 grep test,如果你不能夠對一個專案搜出其定義的呼叫函式、類別、模組、變數,那麼在重構這些程式碼的時候,會令你感到相當痛苦,這有可能是前人所實踐的 DRY ,但卻給後人留下更多的麻煩了。