推 ntpuisbest: 推喔我會舉那個例子是因為蠻多部落格或是stackoverflo 04/15 10:36
→ ntpuisbest: w都是說di 04/15 10:36
→ ntpuisbest: 分成三種注入,field setter還有constructer 04/15 10:36
→ ntpuisbest: s-dependency-injection-and-inversion-of-control-in 04/15 10:38
→ ntpuisbest: -spring-framework 04/15 10:38
→ ntpuisbest: 看起來外國人說的好像也不見得對 04/15 10:39
Blog文章舉例舉不好,但他們有很多的篇幅去講他們真正想講的東西
你去面試,面試官是聽你說而不是看你寫的文章,他沒有辦法來回重複聽你講的東西
所以用對例子在你的情境就比寫文章的重要性要大得太多了
推 vi000246: 釣出大神 04/15 11:15
推 CRPKT: 可以從各模組內含的知識與責任來看這件事 04/15 11:36
→ CRPKT: 即使只有一個實作,interface 抽象化在知識面上還是有用 04/15 11:36
→ CRPKT: DI 主要價值在於 dependency 下游不用認識上游實作 04/15 11:37
→ CRPKT: 所以認真講有幫到解耦也不能說它錯,只是不用太糾結這點 XD 04/15 11:40
推 acgotaku: DI核心還是在於不用顧慮class內的其他實例只需專注介面 04/15 12:25
你說的沒有錯,問題在於如果跟不懂的人用這個說法,他也還是不會懂
所以我才花了大篇幅用他的Dao 去說明他的service 哪邊已經透過Spring 獲得好處了
推 wulouise: 通常只有一個業務實作的情況,另一個實作是MOCK 04/15 12:38
推 srwhite: 推這篇感覺比較有打到我的點 04/15 19:57
推 baobomb: 非常同意第二段 太多工程師一天到晚要抽象 要interface 04/15 21:35
→ baobomb: 但根本不知道介面的真正用途為何 有時候看到一個module 04/15 21:35
→ baobomb: 裡 明明很多元件都沒有expose給其他module使用 也被inter 04/15 21:35
→ baobomb: face的到處都是 然後問那些工程師為什麼這邊要介面 每個 04/15 21:36
→ baobomb: 都說clean code 但問他到底哪裡clean了 就支支吾吾了... 04/15 21:36
→ moom50302: 同意樓上,一個介面一個實體這種設計到底有什麼必要… 04/15 21:43
推 wulouise: 等等...你們的franework mock都不用interface? 04/15 23:11
推 baobomb: 如果用interface的目的是單純為了mock... 這我不太認同 04/15 23:30
→ baobomb: 啦.. 如果composition做得好 DI graph漂亮 你不需要inter 04/15 23:30
→ baobomb: face也能測試 我以前也有一樣的想法 有interface mock起 04/15 23:30
→ baobomb: 來很爽 後來還因為這原因跟另一位資深的同事爭執了一陣子 04/15 23:30
→ baobomb: 後來才發現我是錯的.. 04/15 23:30
推 bronx0807: 不用interface就用cglib動態代理生成mock物件 04/15 23:32
推 baobomb: 如果讓程式去迎合測試 本身很容易進入誤區 而是應該思考 04/15 23:33
→ baobomb: 怎麼在省去所有不必要的介面以及抽象化時 還能完整的測 04/15 23:33
→ baobomb: 試 04/15 23:33
我自己做開發的原則:邊界存在所以介面才存在,觀察不到邊界就不該亂創介面
而邊界存在是因為有兩個不同的域(抱歉我找不到合適的詞彙)需要互動,而必須訂出雙方
都能同意去使用的一套語言,也就是一系列行為與資料的組合
為了測試去開新的interface 也不是不行,但通常會發生在系統對外的交界處,比如說
對DB、對Downstream service 的呼叫的那些client or repository
推 lovdkkkk: 我覺得介面主要的用處不在於有幾個實作, 即使 0 個都行 04/15 23:41
→ lovdkkkk: 主要看兩點, 一是有沒有提供對某部份系統恰當的定義, 二 04/15 23:42
→ lovdkkkk: 是所定義的範圍是不是在恰當的邊界 04/15 23:43
→ lovdkkkk: 以 JPA 為例, 就是提供了 APP 及資料庫間的定義 04/15 23:44
同意你的定義,但不太可能零個實作,如果是SPI的情況,那還是預期有實作可以介入的
如果是透過annotation 或Naming convention 搞meta programming,後面都還是有
code generator在生成行為的,所以有實作,只是不是programmer 自己寫而已
推 baobomb: 樓上正解 如果有跨模組間的使用需求 介面的使用是必要的 04/16 00:01
→ baobomb: 同時也能縮短dependence間的critical path 然而很常看 04/16 00:01
→ baobomb: 到一個類別只有一個實作 也沒有跨模組間的使用 還偏偏要 04/16 00:01
→ baobomb: 介面化... 就讓人很無語 04/16 00:01
我工作的地方有些team 的工作習慣是開interface 就得加個I當開頭
所以我code review 的時候就常常碎碎唸:
你們這個開一個class 就要I一下到底是什麼病?
※ 編輯: zanyking (67.188.38.188 美國), 04/16/2022 06:00:21
→ foreverk: HttpClient的例子好貼切,不過寫不夠多或是沒有遇到情 04/16 07:34
→ foreverk: 境,光看書或解釋,真的不太能體會,所以我也很常用moc 04/16 07:34
→ foreverk: k當說法 04/16 07:34
推 jen1121: 每個class都要I個大概也是職業病了,cglib 動態代理幫你I 04/16 08:14
→ jen1121: 好I滿,但也得看框架運用場合適用 04/16 08:14
→ c74319: 一個interface只有一個implement 不是為了讓interface 可 04/16 12:50
→ c74319: 以作為參數被傳遞嗎?好像叫做behaviour parameterizatio 04/16 12:50
→ c74319: ns ,重點在於能夠reused same method and give it diffe 04/16 12:50
→ c74319: rent behaviors. 04/16 12:50
→ c74319: 主要是回覆發文者說「一個interface 只有一個實作沒用」 04/16 12:57
→ c74319: 的這句話,因為之前有看過書(java in action)有強調這個 04/16 12:57
→ c74319: 用法。 04/16 12:57
推 baobomb: reuse same method and give it diff behavior. 就表示這 04/16 14:20
→ baobomb: 個介面 在不同的情況下 會有不同的行為 但如果確定只有一 04/16 14:20
→ baobomb: 個實作 就表示這個介面永遠只會有一個行為 那介面的意義 04/16 14:20
→ baobomb: 不大 除非是這個介面會被其他跨模組的功能所使用 那介面 04/16 14:20
→ baobomb: 的確需要 當然也有的人會習慣都預先做好介面化 以便將來s 04/16 14:20
→ baobomb: cale的時候不需要再花時間 這也是可理解的 最怕的是有一 04/16 14:20
→ baobomb: 些很愛什麼都要interface, abstract 類繼承的depth超深 04/16 14:20
→ baobomb: 但最後都只有一個實作... 然後也沒有模組化因為什麼東 04/16 14:20
→ baobomb: 西都塞在一個module裡 這種的看了頭真的很痛... 04/16 14:20
推 netburst: 推樓上 04/16 14:33
→ netburst: 但很多大廠的SDK也是都這樣就是了 04/16 14:33
→ netburst: 包含古哥~~~~ 04/16 14:34
推 jason82714: 推baobomb大的說法,其實我也曾寫文章聊這件事情 04/16 16:09
推 moom50302: 介面一定要I開頭這點真的是…Cleancode第一章命名就直 04/16 19:41
→ moom50302: 接強調不要這樣了XD 但是舊程式碼很常見 04/16 19:41
→ moom50302: 另外推樓上大大說的,這也是舊程式碼常見的一個介面一 04/16 19:43
→ moom50302: 個實作的狀況… 04/16 19:43
推 devilkool: 哇....現在才知道只有一個實作的介面是錯的 04/17 02:05
推 baobomb: 嚴格來說應該是像樓主所說 介面的必要性在於恰當的邊界 04/17 09:35
→ baobomb: 如果合理 那只有一個實作也是合理的 但不要為了介面而 04/17 09:35
→ baobomb: 介面 04/17 09:35
→ superpandal: 其實就是對耦合這個字有誤解 但是表達應該是維護的方 04/18 02:36
→ superpandal: 便 spring做了不代表是絕對的最佳範例 根據需要更改 04/18 02:39
→ superpandal: 沒錯 但有些人會認爲這樣一勞永逸 個人不理解 因爲擴 04/18 02:44
→ superpandal: 充性有很多方法 04/18 02:44