精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

不要以 DRY 之名,發明低代碼 DSL 去殘害你的同事

開發 前端
DRY 是說 Dont' Repeat Yourself,就是看見重復代碼就要消除重復。比如說我們發現增刪改查這四個操作彼此之間是有共同參數的。

 [[387959]]

名詞解釋一下,標題是什么意思。

DRY 是說 Dont' Repeat Yourself,就是看見重復代碼就要消除重復。比如說我們發現增刪改查這四個操作彼此之間是有共同參數的。我們只需要定義一次就可以獲得四個界面以及完整的前后端行為

  1. from django.db import models 
  2.  
  3. class Author(models.Model): 
  4.     name = models.CharField(max_length=100
  5.     title = models.CharField(max_length=3
  6.     birth_date = models.DateField(blank=True, null=True) 
  7.  
  8. from django.contrib import admin 
  9.  
  10. class AuthorAdmin(admin.ModelAdmin): 
  11.     exclude = ('birth_date',) 

這樣的東西,有的時候被稱作低代碼,有的時候被稱作 DSL。用過 django 的同學都知道上面的代碼就是Django Admin。這些工具的特點就是可以用 1% 的時間完成 80% 的功能,剛開始用的時候都直呼這就是未來。然而 Neal Ford 發現了“#last10%rule",就是最后的 10% 會付出非常大的代價,而用戶總是需要 100% 的功能。

這是為什么?難道無腦復制粘貼代碼,一個文件寫1000行才是優秀程序員的特質嗎?我們有理想有追求,難道是錯嗎?

理想沒有錯, 方式方法 錯了。

不要誤會我,我不是站在你們的對立面。本人絕對是鐵桿的語法糖制匠。只是有的時候,人們需要跳出原有的思維習慣,才能意識到認知的盲點。

誤區一:一廂情愿的抽象

在 《代碼寫得不好,不要總覺得是自己抽象得不好》 中我已經說過了。業務邏輯,界面長相,絕大多數時候都是產品經理說了算。不恰當的說,你們程序員不過是產品經理手里的筆。這雖然讓人難以接受,但的確是大部分人的真實日常。

當我們看到兩個地方差不多的時候。不要一廂情愿的抽取公共代碼,消除重復。首先要和產品經理達成一致,這個在業務上就應該是保持一致的。當一個產品有一群產品經理的時候,他們或者她們經常因為彼此不拉齊想法,同樣的列表篩選功能可能會搞出五花八門的做法來。這個時候就需要用 UI 設計師等角色去橫向拉齊。

總之先要把需求的源頭給按住了。而不是在需求的下游,用可復用抽象代碼來兜底。這也是《領域驅動開發》要求客戶,產品經理,程序員能夠更多的交流,更多的形成共識的原因。

誤區二:在調用棧上找不到自己的代碼

很多人會把 Django Admin 這樣的 CRUD 代碼生成,歸咎為代碼是生成的。但其實問題并不是出在代碼是生成的,問題出現在“調用棧上找不到自己的代碼”:當我們看到拋出一個異常,然后在 stack trace 里一行行找,找不到自己寫的代碼。為什么會出現這樣的現象?

假設起初我們寫了三個方法

  1. import { f1_impl, f2_impl, f3_impl } from 'some-lib'
  2. function f1() { 
  3.   f1_impl(arg1, arg2); 
  4. function f2() { 
  5.   f2_impl(arg1, arg3); 
  6. function f3() { 
  7.   f3_impl(arg1, arg4); 

我們可以看到需要用戶寫三個方法,f1/f2/f3 這就是代碼量。而且每個地方都要重復傳 arg1 這個參數。那么我們應該用 DRY 的名義,把代碼簡化為

  1. import { f1_impl, f2_impl, f3_impl } from 'some-lib'
  2. const theModel = { arg1, arg2, arg3, arg4 } 
  3. function f1() { 
  4.   f1_impl(theModel.arg1, theModel.arg2); 
  5. function f2() { 
  6.   f2_impl(theModel.arg1, theModel.arg3); 
  7. function f3() { 
  8.   f3_impl(theModel.arg1, theModel.arg4); 

這里我們抽取了一個公共的全局的 theModel 來定義所有的參數。然后 f1, f2, f3 的行為都是模型驅動的。那么似乎,用戶也不需要寫什么 f1/f2/f3,他們寫這個就好了:

  1. export const theModel = { arg1, arg2, arg3, arg4 } 

這樣不但代碼量很小,而且和具體的實現還“解耦”了。將來技術要升級了,也只需要升級框架就好了,業務邏輯是不需要動的。這種“讓用戶在調用棧上找不到自己的代碼”,弊端在哪里?

很容易找不到一個配置項,一個參數,產生影響的位置。可能是在框架代碼的任何地方。寫代碼的地方,和實際產生行為的地方,之間沒有編譯期可以跟蹤的符號依賴關系了。當然這是所有 mutable data 的問題,所有寫入的地方,都不知道會在哪里讀取,會對讀取的地方產生什么影響。程序員的日常就是搞這些幺蛾子的,當然處理這樣的問題是駕輕就熟。但并不意味著是沒有成本的。這樣的間接性越多,代碼就越難以閱讀。

這里還有第二個問題就是 theModel 包含了 f1, f2, f3 的參數的集合。當把所有參數都打平了混一起之后,雖然可以使得 arg1 這樣的重復參數被消除,但也使得哪個參數是給誰用的更模糊了。比如

  1. class ArticleAdmin(admin.ModelAdmin): 
  2.     prepopulated_fields = {"slug": ("title",)} 

當我們讀到了上面的定義的時候,prepopulated_fields 影響了增刪改查的哪個界面上的哪幾個字段,是如何影響的?

有的同學可能會說 Antd 的組件參數也有幾十個那。但是當我們看到這樣的 React 組件的調用代碼的時候

  1. return <EditorForm prepopulatedFields={{"slug":["title"]}}/> 

我們是可以點進 EditorForm 的代碼里去看 EditorForm 的實現的。可以找哪里用了 prepopulatedFields 這個傳入的參數了。但是把代碼寫成 Django Admin 這樣的聲明式的時候,你是無法輕易找到哪里讀了 prepopulated_fields 的。最大的可能是開始做全局文本搜索框架的代碼。

DSL 作者們是不認為這是一個問題的。每個參數都是他們親手添加的,在 DSL 被發明后的三個月之內,他們是不需要去查文檔的(如果有文檔的話)。但是他們的同事就沒這么幸運了。

誤區三:在意想不到的地方修改語言的默認行為

特別是賦值和取值這兩個操作。例如下面這樣的代碼

  1. function doSomething(a) { 
  2.   a.b = 'hello'
  3.   console.log(a.b); 

請問 console 上輸出的是什么?應該是 hello 對不對?

那么,如果傳入的 a 是這樣的呢?

  1. function doSomething(a) { 
  2.   a.b = 'hello'
  3.   console.log(a.b); 
  4.  
  5. const a = {}; 
  6. Object.defineProperty(a, 'b', { value: 'world' }); 
  7. doSomething(a); 

這個時候 console 上輸出的是 world 而不是 hello。

C++的拷貝構造函數,隱式轉換構造函數。也是類似的問題。在賦值的語法里偷偷塞了行為進去。

也就是框架代碼,DSL的實現,他們是可以通過魔法來修改賦值操作和取值操作的。大部分程序員都很難意識到,一行平凡的代碼,可以發生很不平凡的事情。這就會導致出問題的時候,真正產生問題的地方被略過,因為那個地方可能不過就是一行取值操作,或者一行賦值操作。

好好寫代碼,而不是玩弄技巧

要復用之前,先和產品經理或者客戶達成共識。

別想著省那么多的代碼。該有一個界面的時候,就要定義一個界面。該有一個后端 API 的時候,就要定義一個 API。哪怕只有一行代碼呢。讓用戶去 call library,而不是定義個 framework,要求用戶給一堆 config。

不要修改賦值和取值的行為,不要制造驚喜。

不要以 DRY 之名做任何事情。可能從其他動機,造成的結果是要 DRY。但不要以 DRY 為出發點做任何事情。

謹以此文批判自己過去犯的一些錯誤,引以為戒。

責任編輯:張燕妮 來源: 陶文
相關推薦

2020-02-20 10:45:57

代碼JS開發

2019-02-12 15:00:32

Javascript命令式編程前端

2015-01-20 11:30:48

完美代碼代碼

2022-07-10 20:51:25

IT數字化K8S

2015-09-01 10:29:44

數據安全

2018-11-19 09:02:53

垃圾代碼辭職入職

2020-09-03 10:06:53

低代碼平臺編碼低代碼

2011-05-06 09:25:56

海量代碼

2022-03-23 08:01:04

Python語言代碼

2021-01-29 09:01:25

低代碼軟件低代碼工具

2021-05-13 07:32:17

培訓代碼同事

2020-05-15 09:30:12

代碼函數語言

2025-08-13 08:20:00

代碼Python開發

2022-05-09 14:33:20

代碼設計設計模式

2011-05-12 11:01:26

HTML

2016-12-19 15:21:42

戴爾西雅圖

2013-11-25 09:22:07

2023-04-28 08:06:04

低代碼AI智能

2022-02-21 08:55:35

JavaClass文件代碼

2021-12-03 11:57:27

代碼##語言
點贊
收藏

51CTO技術棧公眾號

久久免费大视频| 丁香花在线影院| 久久深夜福利| 色系列之999| 久久久久久综合网| 久草视频免费在线| 日韩深夜影院| 欧美一区在线视频| 久久久999免费视频| 高清福利在线观看| 国产69精品一区二区亚洲孕妇| 91国内揄拍国内精品对白| 国产毛片欧美毛片久久久| 蜜桃精品一区二区三区| 精品久久中文字幕久久av| 亚洲不卡1区| 亚洲精品一区二区三区区别| 久久国产99| 美女福利精品视频| 精品人妻一区二区三区蜜桃视频| 亚洲青青久久| 91成人看片片| 国产二区视频在线| 免费看a在线观看| 91免费在线视频观看| 亚洲在线免费看| 免费一级suv好看的国产网站| 日本免费一区二区三区视频| 在线观看国产一区二区| 成年人网站国产| 欧美猛烈性xbxbxbxb| 久久精品一区二区三区av| 国产激情美女久久久久久吹潮| 中文字幕理论片| 亚洲麻豆视频| 欧美精品电影免费在线观看| 成人免费精品动漫网站| 欧美午夜精彩| 一本色道久久综合亚洲精品小说 | 永久久久久久久| 国产精品一国产精品| 亚洲福利视频在线| 91 视频免费观看| 国产成人a视频高清在线观看| 欧美日韩一区二区免费视频| 97视频在线免费| 四虎亚洲精品| 亚洲婷婷综合久久一本伊一区| 日韩少妇中文字幕| 福利视频在线导航| 中国色在线观看另类| 欧美日韩亚洲在线| 天天操天天操天天干| 国产91精品久久久久久久网曝门 | 风间由美性色一区二区三区四区| 欧美老女人在线| 三级a在线观看| 另类中文字幕国产精品| 色噜噜狠狠成人中文综合| 国产主播在线看| xxxxxx欧美| 色中色一区二区| 狠狠操精品视频| 日韩av超清在线观看| 色婷婷久久久综合中文字幕| 国产一级不卡毛片| 福利一区视频| 欧美精品乱人伦久久久久久| 免费在线观看污网站| 深夜福利亚洲| 日韩欧美三级在线| 国产xxxxxxxxx| 亚洲免费毛片| 中文字幕日韩专区| 尤物在线免费视频| 欧美久久久久| 欧美亚洲国产日本| 免费又黄又爽又猛大片午夜| 麻豆成人免费电影| 99国产超薄肉色丝袜交足的后果| 亚洲精品18在线观看| 99精品黄色片免费大全| 日韩经典在线视频| 麻豆传媒免费在线观看| 亚洲一区av在线| 国产中文字幕视频在线观看| se69色成人网wwwsex| 欧美一区二视频| 一边摸一边做爽的视频17国产| 日日狠狠久久偷偷综合色| 这里只有视频精品| 精品人妻在线播放| 天堂va蜜桃一区二区三区| 国产免费观看久久黄| 亚洲不卡免费视频| 国产亚洲女人久久久久毛片| 亚洲黄色网址在线观看| 国产精品论坛| 欧美老人xxxx18| 好吊一区二区三区视频| 欧美r级电影| 91地址最新发布| 91精品国自产| av不卡免费在线观看| 亚洲资源视频| 超碰成人av| 欧美高清一级片在线| 国产 中文 字幕 日韩 在线| 视频在线不卡免费观看| 国内精品久久久久久中文字幕| 中文字幕一区二区三区四区免费看| 国产河南妇女毛片精品久久久| 欧美在线播放一区| 黑人极品ⅴideos精品欧美棵| 欧美性猛交xxxx久久久| 日韩久久久久久久久久久| 国产在视频线精品视频www666| 欧美激情喷水视频| 亚洲无码精品在线观看| 久久综合视频网| 午夜啪啪免费视频| 成人久久网站| 亚洲人成电影网| 天堂资源在线播放| 国产一区二区三区免费看| 欧美日韩精品免费观看| 极品视频在线| 精品处破学生在线二十三| 99精品中文字幕| 日韩国产一区二| 欧美日韩一区二区三| 国产在线美女| 亚洲大胆美女视频| 欧美日韩免费一区二区| 国内成人精品2018免费看| 日韩一区二区三区高清| 亚洲第一二三四区| 国产偷亚洲偷欧美偷精品| 久久久久久久伊人| 成人亚洲一区二区一| www国产无套内射com| 成人在线日韩| 久久精品国产电影| 亚洲一区二区视频在线播放| 中文字幕乱码一区二区免费| 欧美自拍小视频| 成人在线免费视频观看| 国产精品av免费在线观看| 国产在线91| 在线观看日韩高清av| 伊人网在线视频观看| 日韩中文字幕不卡| 色噜噜狠狠色综合网| 88xx成人网| 久久色精品视频| 国产日韩欧美一区二区东京热| 国产精品国产自产拍在线| av污在线观看| 91久久国产| 亚洲在线www| 2020国产在线| 亚洲美女激情视频| 国产乡下妇女三片| 国产精品福利电影一区二区三区四区 | 成人自拍性视频| 中文字幕有码在线观看| 欧美不卡一区二区三区四区| 日产精品久久久久| 久久女同互慰一区二区三区| 狠狠热免费视频| 亚洲国产精品91| 国产精品高清一区二区三区| 日本在线影院| 日韩中文有码在线视频| 国内老熟妇对白hdxxxx| 婷婷一区二区三区| 精品无码人妻一区二区免费蜜桃 | 国产精品福利网站| 欧美极品视频| 亚洲福利在线播放| www.五月婷婷.com| 亚洲精品国产成人久久av盗摄| 免费不卡的av| 日韩成人精品在线| mm131午夜| 亚洲8888| 成人有码在线播放| 日本三级一区| 超碰精品一区二区三区乱码| 四虎影视精品成人| 欧美酷刑日本凌虐凌虐| 永久免费看片在线播放| 国产精品麻豆一区二区| 欧美日韩人妻精品一区在线| 日本va欧美va精品发布| av动漫在线播放| 红桃成人av在线播放| 亚洲xxx视频| 天天综合网站| 欧美激情二区三区| 午夜视频在线| 日韩精品亚洲视频| 国产后入清纯学生妹| 日韩欧美在线视频观看| 亚洲国产成人精品综合99| 久久午夜电影网| 三级网站免费看| 日本视频中文字幕一区二区三区| 人人妻人人澡人人爽欧美一区双| 欧美手机在线| 精品日本一区二区| 精品国产亚洲一区二区三区大结局 | 亚洲高清久久网| 91精品视频免费在线观看| 性感美女极品91精品| 高清av免费看| 亚洲国产专区| 国风产精品一区二区| 日产精品一区二区| 免费一区二区三区| 福利电影一区| av资源站久久亚洲| 在线观看欧美| 国产精品久久久久久久一区探花 | 色乱码一区二区三区88| 豆国产97在线 | 亚洲| 综合婷婷亚洲小说| 久久精品三级视频| 久久久天堂av| 艳妇乳肉亭妇荡乳av| 国产999精品久久久久久绿帽| 伊人色在线视频| 美女视频一区二区| 久久久精品三级| 石原莉奈在线亚洲二区| 国产在线青青草| 99亚洲一区二区| 日韩av在线播放不卡| 亚洲小说区图片区| 日韩欧美猛交xxxxx无码| 一本一道久久a久久精品蜜桃 | 欧美无乱码久久久免费午夜一区 | 久久深夜福利| 少妇高清精品毛片在线视频| 亚洲欧美卡通另类91av| 成人免费在线小视频| 国产婷婷精品| 无码人妻丰满熟妇区96| 亚洲一区激情| 91精品91久久久中77777老牛| 一二三区精品| 欧美成人精品欧美一级乱| 视频一区二区欧美| 无需播放器的av| 精品影视av免费| a级大片免费看| 高清免费成人av| 久久久高清视频| 99国产精品一区| 午夜理伦三级做爰电影| 欧美国产乱子伦| 大地资源高清在线视频观看| 亚洲视频免费在线观看| 欧美精品一区二区蜜桃| 精品久久久久久久久久久久久| 中文字幕第四页| 欧美影片第一页| 国产精品人人妻人人爽| 欧美成人一区二区| 亚洲色图欧美视频| 亚洲欧洲日产国产网站| 1024国产在线| 久久久久久久成人| 美女一区网站| 91精品视频网站| 国产成人aa在线观看网站站| 久久这里精品国产99丫e6| 蜜桃国内精品久久久久软件9| 亚洲精品国产系列| 欧美日韩国产高清| 免费在线观看毛片网站| 精品一区二区三区日韩| jjzz黄色片| 国产无人区一区二区三区| 在线观看黄网址| 午夜影院在线观看欧美| 波多野结衣黄色| 精品免费国产一区二区三区四区| 蜜桃成人在线视频| 欧美不卡视频一区发布| 原纱央莉成人av片| 91沈先生作品| 亚洲系列另类av| 亚洲五码在线观看视频| 久久国产精品亚洲77777| 午夜天堂在线视频| 久久先锋影音av| 久久久久亚洲av无码专区体验| 日韩欧美一区二区在线| 99re只有精品| 亚洲视频视频在线| 波多野结衣中文在线| 国产精品视频男人的天堂| 动漫3d精品一区二区三区乱码| 三区精品视频| 99av国产精品欲麻豆| 亚洲激情在线看| 久久久影院官网| 久久免费精彩视频| 欧美日韩你懂得| 免费资源在线观看| 久久久欧美一区二区| 成人污版视频| 午夜精品一区二区三区四区| 亚洲麻豆av| 最新日本中文字幕| 成人欧美一区二区三区在线播放| 久久久成人免费视频| 精品久久99ma| 成人在线app| 国产精品激情av电影在线观看| 红杏一区二区三区| 成人高清dvd| 美洲天堂一区二卡三卡四卡视频| 黄色正能量网站| 亚洲图片欧美视频| www夜片内射视频日韩精品成人| 最近2019年日本中文免费字幕| 中文在线免费二区三区| 国产区二精品视| 一区三区视频| www.四虎精品| 亚洲一区二区不卡免费| 亚洲第一视频在线播放| 久久国产精品免费视频| 成人在线精品| 国产91av视频在线观看| 久久国产精品露脸对白| 国产又粗又猛又爽又黄的视频小说| 一本到高清视频免费精品| 青梅竹马是消防员在线| 日本精品一区二区三区在线播放视频| 欧美午夜寂寞| 欧美黄色免费影院| 91麻豆视频网站| 久草手机在线视频| 日韩精品视频在线播放| 性欧美18~19sex高清播放| 久久久精彩视频| 国产精品久久久免费| 男女黄床上色视频| 色综合天天综合网国产成人综合天 | 精东粉嫩av免费一区二区三区| 国产美女网站视频| 欧美欧美欧美欧美| h片在线免费| 成人欧美一区二区三区黑人免费| 亚洲天堂黄色| 鲁大师私人影院在线观看| 欧美日韩中文字幕综合视频| 亚洲欧美自偷自拍| 国产成人一区二区三区小说| 欧美日韩伦理| 午夜一级免费视频| 一区二区在线免费| 神马久久久久久久久久| 97av在线播放| 不卡在线一区二区| 日本一二三四区视频| 一区二区理论电影在线观看| 色噜噜在线播放| 国产精品xxxxx| 国产精品久久久久无码av| 日本中文字幕有码| 欧美日韩国产专区| 天堂аⅴ在线地址8| 51国偷自产一区二区三区| 国产精品久久久久久久免费软件| 中文字字幕码一二三区| 欧美日韩免费在线视频| 国产精品蜜臀| 欧美一区二区高清在线观看| 久草中文综合在线| 日韩 欧美 精品| 伊人青青综合网站| 9l亚洲国产成人精品一区二三| 成人久久久久久久久| **欧美大码日韩| 亚洲日本香蕉视频| 亚洲一区二区久久久久久| 国产日韩免费| 欧美成人777| 亚洲欧美日韩天堂一区二区| 国产一区二区三区亚洲综合| 奇米精品一区二区三区| 国产精品久久影院| 免费观看国产精品| 国产精品爽爽爽| 一本久久综合| 丁香花五月激情|