團隊規定要開始禁用 ORM

shishao發表於2022-02-15

公司的多位上司定了下面一條開發規範軍則,小弟資質不深,只是看不太懂給的理由,還請大佬們評論一番,給些指導。

禁止使用 ORM 自動生成的 SQL 語句,請將 SQL 直接寫在程式碼裡。引數可以使用繫結引數的 API 。比如 ActiveRecord 提供的 update()/insert() 方法,均不可使用。每一個資料庫操作應有顯式的 SQL 宣告。

理由:

維護佔生命週期的90% 。

在整個開發和維護過程中,我們一直在幹這幾件事:
檢索:找到它。
追溯:它從哪裡來。
跟蹤:它到哪裡去。

於是:

  1. 物件必須能夠被定位。越精確(比如消除重複項)越好、越容易被記憶越好。
  2. 強線索。比如顯式宣告的欄位 obj.MyField ,透過 IDE 可以看到它的定義(含註釋)、它被多少地方使用到、可以自動重構重新命名;而 obj[“MyField”] 只能字串全文檢索了。如果有多個不同地方都叫 MyField ,還得消除歧義(第一點)。
  3. 原生態。資訊傳遞過程中儘量不發生改變,越靜態和固定越容易被跟蹤。反之,如果一開始叫 A,傳遞到第二處叫 B,第三處叫 C ,整個線索可能就亂了。
    …(還有好多)

目前 PHP 上的 ORM 如 ActiveRecord 基於約定的表名、動態生成的 SQL 不能滿足上述要求。
使用動態生成的SQL,省下來的是第一次開發的時間。在後續的維護過程中則製造負效益。

然後:

  1. SQL 複製下來就可以貼到資料庫工具裡跑了,除錯、調優都需要。動態生成的,拿到原始語句很困難。
  2. 動態的語句不是最優的。隱藏了細節,最終效能調優上可能會產生問題。

另外說明下,寫下這個理由的 leader 原先主要做的是 .net 開發。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章