不做翻譯需求的程序員 + 贈書

最近在做大量的代碼 Review 的工作,嘗試整理出一些大家在寫代碼時要避免的一些問題,同時也在讀《代碼整潔之道》和《代碼裏的世界觀》。也在知識星球(同公衆號名:Python程序員雜談)中發了一些關於代碼設計的內容。

1. 不做需求翻譯器

絕大部分程序員在入門編程時學習的第一門課程/書籍差不多都會是《 XXX 程序設計》,但是很多人在實際寫代碼時卻完全不做任何設計的工作,只是單純的把產品的需求翻譯爲可執行的代碼。對於軟件開發來說,這是入門階段,畢竟程序員的第一要務還是要把產品的需求轉變爲可運行的系統/軟件。 這種做法就像我們剛開始學習寫作文時那種流水賬式的寫法,能表達信息(實現功能),但是內容冗餘,不易維護。

所以我們在接需求時,需要做的是充分理解產品需求,什麼叫充分理解產品需求呢?實際工作中很簡單,你能給其他人講明白要做的產品需求是啥即可。之後需要做的是根據產品需求思考應該怎麼實現,對其中的邏輯做一些抽象。

單純講可能不太容易理解,舉個例子,有這麼一個需求,寫一個函數判斷用戶上傳圖片文件的是否合法。需求描述是,如果後綴是.txt則返回不合法,如果後綴是.gif返回不合法,如果後綴是.mp4返回不合法。(等一系列不合法的後綴)。

那麼怎麼實現呢,如果不加思索的寫代碼就會出現這麼個狀況:

def is_valid_filetype(suffix):
    if suffix == 'txt':
        return False
    if suffix == 'gif':
        return False
    if suffix == 'mp4':
        return False
    return True

這樣寫代碼的問題是什麼?暫且不說需求問題。代碼的問題在於,如果我需要新增一個不支持的類型,那就要新增一個if判斷。顯然更好的做法是:

invalid_suffix_set = {'txt', 'gif', 'mp4'}


def is_valid_filetype(suffix):
    return not suffix in invalid_suffix_set

這麼一改看起來簡單多了,消除了if分支語句(這個是代碼設計中很重要的部分),並且改成了基於配置的方式,新增不合法後綴只需要去修改配置invalid_suffix_set即可,不涉及代碼邏輯改動。

但是我們再回過頭來看下需求,是不是有什麼不妥。寫一個函數判斷用戶上傳圖片文件的是否合法。相信讀者已經看出來了,這個需求其實有問題:需要枚舉出所有不合法的後綴,鬼知道有多少中文件後綴。雖然我們做了不合法後綴的配置,但是還需要經常去做修改來支持新發現的文件後綴。

所以應該去反問下產品,哪些文件是合法的?顯然這是一個可以有限枚舉的內容。最終可能得到的代碼是這樣:

valide_suffix_set = {'png', 'webp', 'jpg', 'jpeg'}


def is_valid_filetype(suffix):
    reutrn suffix in valide_suffix_set

2. S.O.L.I.D 原則

SOLID 這個詞很多人可能沒有聽說過,這是程序設計時經常用到的一些原則,如果你看過設計模式,應該知道,所有的設計模式都會基於這些原則。SOLID 什麼意思呢?爲了避免不了解的讀者此時關閉文章去搜索(笑),我列到這裏:

在程序設計領域, SOLID(單一功能、開閉原則、里氏替換、接口隔離以及依賴反轉)是由羅伯特·C·馬丁在21世紀早期[1] 引入的記憶術首字母縮略字[2][3],指代了面向對象編程和麪向對象設計的五個基本原則。

- S 單一功能原則  認爲對象應該僅具有一種單一功能的概念。
- O 開閉原則    認爲“軟件體應該是對於擴展開放的,但是對於修改封閉的”的概念。
- L 里氏替換原則  認爲“程序中的對象應該是可以在不改變程序正確性的前提下被它的子類所替換的”的概念。
- I 接口隔離原則  認爲“多個特定客戶端接口要好於一個寬泛用途的接口”[5] 的概念。
- D 依賴反轉原則  認爲一個方法應該遵從“依賴於抽象而不是一個實例”[5] 的概念。 依賴注入是該原則的一種實現方式。

摘自:https://zh.wikipedia.org/wiki/SOLID_(%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E8%AE%BE%E8%AE%A1)

看到這些描述後,想必很多讀者會嘆一口氣 —— 原來說的是這個。

我在 Review 代碼時突然想到,如果每個程序員在設計程序,編寫代碼時,先念一串這樣的「咒語」—— 「用 SOLID ,寫好代碼」,會不會能寫出更好維護的代碼。有些戲謔的成分,但是在寫代碼、做設計時需要一些原則來支撐。

關於這些原則,這裏不做詳細解讀,對於知道的人可以經常拿出來 Review 下你寫的代碼,對於不知道的,需要去找幾個例子,指導你寫出更好的代碼。

3. 最後

本次要贈的書就是《代碼裏的世界觀》,看書名以爲是偏軟技能類的,但從內容上來說,軟件設計的內容佔大頭。這本書可能理解爲一個架構師的思考,因爲各章節篇幅比較短,讀起來相對容易。

感謝圖靈出版社,本次贈書:5 本。

參與方式:老規矩——留言說下「你寫代碼、設計程序時的一些原則是什麼」?

抽獎方式(去公衆號留言):

  1. 點贊排行前兩名
  2. 前兩名之外的留言中隨機抽出兩名
  3. 沒中獎的留言中抽出關注最早的一名

開獎時間:下週二(05.21 晚上 10:30),可以關注公衆號: Python 程序員雜談 的文章


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章