副作用是程式設計頭號敵人!如何剝離它?- spin
隨著時間的推移,我注意到一種設計啟發式方法,它極大地幫助了我完成無數專案。
這種啟發式的地方在於它在概念上易於理解和應用,但它自然會引導您更接近函數語言程式設計。
事實上,這與 Haskell 處理 IO 的方式非常相似。它也是 React 等現代 Web/UI 框架的核心理念。
為了說明這一點,讓我們看一個例子:
你正在處理一個涉及安排未來使用者通知的事情:有一些輸入需要考慮,比如使用者喜歡的時間和時間的推移;你已經決定提前一週安排它們;你需要定期安排新的通知,但你也可能需要刪除或重新安排現有的通知。
對於未來一週的每一天foreach 是否沒有安排通知?if 現在就生成並安排(副作用!)。 否則,應該重新安排嗎?else 刪除現有的通知(副作用!)。 生成並安排新的通知(副作用!)。 |
在這個ifelse例子中,我們在進行處理的同時也在修改世界。
副作用本質上並不壞:事實上,它們是編寫軟體的全部意義所在。如果你的程式碼沒有效果,就不會有人使用它。
不過,還是要問問自己,你怎麼能把這些副作用儲存到最後?
歸根結底,辦法就是建立一些資料,描述需要採取的任何行動。
對於未來一週的每一天foreach 是否沒有安排通知?if 在輸出中新增一些資料,描述一個新的通知 否則,是否應該重新安排?else 在輸出中新增一些資料描述如何刪除該通知 並新增更多關於如何安排其替換的資料 |
這段虛擬碼輸出:
[{action: "remove", notificationId: 4}, {action: "create", time: "some ISO8601 time"}] |
然後你會把這些資料交給另一個更簡單的函式,由這個更簡單的函式來執行這些副作用。
誠然,這種啟發式方法將導致你做一些額外的工作,但也有很多好處。其中。
首先,它創造了一個自然邊界,對測試非常有用。上面的虛擬碼中的邏輯(如 "否則,是否應該重新安排?")實際上可能相當複雜。
在系統中,決定實施什麼變化的邏輯往往比實施上述變化的邏輯要複雜得多。透過劃定這個邊界,你可以獲得編寫更少的艱鉅的測試的好處。要模擬的東西更少,而且很容易為資料寫斷言。
第二,除錯變得更加容易。能夠問一個系統要做什麼,並在它開始執行之前收到其計劃的完整快照,這真的很神奇。這對於更復雜的功能來說尤其如此,例如與外部系統的同步。
最後,這種方法使你能夠輕鬆地進行分層轉換。使用上面的例子,假設你的通知排程器應該避免某些假期。你可以寫一個簡單的函式,接收一個排程行為的列表,並過濾掉任何發生在特定日期的行為。
相關文章
- 育碧是如何做AI的? 《全境封鎖》敵人AI設計思路分析AI
- 你是如何離程式設計越來越遠的?程式設計
- Tumblr掃黃正式開始!AI鑑黃也許是老司機們的頭號敵人AI
- JavaScript函數語言程式設計之副作用JavaScript函數程式設計
- 敵人——建立敵人Rioter
- Pygame - Python 遊戲程式設計入門 class3-創造出敵人GAMPython遊戲程式設計S3
- Python函數語言程式設計系列001:無副作用Python函數程式設計
- 程式設計師,職場上請遠離這種人!程式設計師
- Steam,你的敵人是亞馬遜亞馬遜
- 抽絲剝繭——代理設計模式設計模式
- 為什麼要成為「無敵」程式設計師?程式設計師
- 如何將 css 從 Application bundle 資源中剝離出來CSSAPP
- GitHub 熱點速覽 Vol.25:距離優雅程式設計你差個它Github程式設計
- 《對馬島之魂》的敵人,其實是韓國人?
- 菜雞程式設計師是如何寫程式碼的?程式設計師
- 程式設計師你是如何降低NPE的?程式設計師
- 那些程式設計高手是如何練成的?程式設計
- 你是如何看待男程式設計師的?程式設計師
- 程式設計是更像數學還是人類語言?- MIT News程式設計MIT
- 抽絲剝繭——備忘錄設計模式設計模式
- 程式設計題:尋找木頭程式設計
- 基於web/h5應用的外掛/擴充套件/業務剝離方案設計WebH5套件
- 我是如何提高自己的「程式設計能力」的?程式設計
- Promise是如何實現非同步程式設計的?Promise非同步程式設計
- 豐田的“人機分離”是如何實現的?
- 程式設計師自我【營銷】,如何打造個人【品牌】程式設計師
- 如何學習shell程式設計?Linux運維學習shell程式設計是什麼程式設計Linux運維
- Kafka 優秀的架構設計!它的高效能是如何保證的?Kafka架構
- 程式設計師街頭生存手冊程式設計師
- 敵人是我未來的盟友:《Apex英雄》的萬聖節“暗影降臨”的非對稱對抗設計
- 如何在程式設計師這條路上一去不回頭程式設計師
- 敏捷與 DevOps:是敵是友?敏捷dev
- 敏捷和DevOps:是敵是友?敏捷dev
- 好程式設計師前端分享什麼是Deno,它與Node.js的區別程式設計師前端Node.js
- 程式設計師找工作黑名單:除了 996.ICU,程式設計師還將如何自救?| 技術頭條程式設計師996
- 完了!Windows弱爆了!它才是程式設計師的首選!程式設計師:真的好用!Windows程式設計師
- Java實驗六: Java流式程式設計與網路程式設計(頭歌)Java程式設計
- SpringMVC是如何逐步簡化Servlet的程式設計的SpringMVCServlet程式設計