2009-03-02 53 views
7

他們矛盾嗎?解耦vs YAGNI

解耦是一件很棒的事,很難實現。然而,在大多數應用程序中,我們並不需要它,所以我可以設計高度耦合的應用程序,除了明顯的副作用,例如「你不能分離組件」之外,它幾乎不會改變任何東西,「單元測試在屁股「等。

你覺得呢?你總是試圖解耦和處理開銷?

回答

7

在我看來,解耦和YAGNI是非常相輔相成的美德。 (我只是注意到Rob的回答,似乎我們在這裏相同的頁面。)問題是你應該做多少解耦,而YAGNI是幫助確定答案的好原則。 (對於那些說單元測試的人 - 如果你需要解耦來做你的單元測試,那麼YAGNI顯然不適用。)

我真誠地懷疑那些說他們「總是」分離的人。也許他們每次想到它時都會這樣做。但是我從來沒有見過一個程序,在那裏不能添加額外的抽象層,我真誠地懷疑這樣的程序有一個不平凡的例子。每個人都在某處畫一條線。

根據我的經驗,我已經對代碼進行了解耦,然後從未利用額外的靈活性,因爲我經常保留代碼,然後不得不返回並稍後進行更改。我不確定這是否意味着我在兩個方向上都很平衡或者同樣破裂。

2

我(幾乎)總是解耦。每當我做到這一點時,我發現它很有用,並且(幾乎)每次我不需要以後再做。我還發現它是減少錯誤數量的好方法。

0

那麼,YAGNI只不過是一個虛假簡單的短語而已。然而,解耦是一個相當理解的概念。 YAGNI似乎暗示某人是某種心靈。這只是陳詞濫調,這從來不是一個好主意。說實話,有一個案例可以說YAGNI可能根本與解耦無關。耦合通常「更快」,「誰知道你是否需要解耦解決方案;反正你不會改變X組件!」

+0

YAGNI暗示一個人不是某種心靈 - 請參閱http://c2.com/cgi/wiki?YouArentGonnaNeedIt – 2009-03-02 09:42:11

+0

我確切知道它是什麼,但你只是在玩它。但是你要說明它爲什麼本質上是一個愚蠢的短語。如果你想辯論YAGNI是精神失常還是近視,我不會這樣做,因爲這是一個無聊,毫無結果的討論。 – BobbyShaftoe 2009-03-02 09:56:44

2

爲解耦而去耦可能很糟糕。 構建可測試組件是非常重要的。

故事的難點在於知道何時需要解耦以及需要解耦多少。

+0

爲什麼你說爲了解耦可能會不好? – tddmonkey 2009-03-02 10:01:10

+1

我的意思是解耦沒有真正的好處,但只是爲了做到這一點,即使需要更長的時間。 – cherouvim 2009-03-02 16:53:59

0

正如你的標籤所說,這是非常主觀的。它完全取決於你自己的工程智慧來決定你「不需要」的東西。在一種情況下你可能需要耦合,但你不會在另一種情況下。誰要告訴? 你當然是

對於一個如此主觀的決定,那麼就不可能有一個指導方針來規定。

2

我會說他們沒有。解耦是爲了減少代碼中不必要的依賴關係,並通過乾淨,定義明確的接口來加強訪問。 「你不會需要它」是一個有用的原則,通常建議不要過度擴展和在沒有明顯的當前用例的情況下過於廣泛的解決方案架構。

這些實際結果是,您有一個系統可以輕鬆重構和維護單個組件,而不會在整個應用程序中無意中造成連鎖反應,並且在設計中沒有不必要的複雜方面 - 就像只要滿足當前的要求即可。

0

YAGNI的混亂:) ......實際上,我們不需要讓所有的代碼混合起來「更快」。

單元測試真的有助於感覺什麼時候耦合(假設一個人很好地理解什麼是單元測試與其他類型的測試)。如果你改爲使用「你不能分開組件」的思想,你可以很容易地添加你不需要的東西:)

我會說YAGNI在你開始扭曲和改變邏輯時進來在當前實現要求的實際使用場景之外。比方說,你有一些代碼使用一對外部支付提供商,這兩個提供商都將重定向到外部網站。可以保留一切清潔的設計是可以的,但我認爲不要開始考慮提供商,我們不知道是否會支持有多種不同方式來處理集成和相關問題流程。

1

如果「單元測試是屁股疼痛」那麼我會說你需要它。大多數情況下,解耦可以通過幾乎零成本實現,那麼爲什麼你不想這樣做?

此外,在新的源代碼工作是有脫鉤的代碼之前,我可以開始編寫單元測試時引入一個接口的地方,或者使用依賴注入可以節省大量的時間,當我最大的熊地精的一個

4

YAGNI是一個經驗法則(不是宗教)。解耦或多或少是一種技術(也不是宗教)。所以他們沒有真正的關係,也沒有互相矛盾。

YAGNI是關於實用主義。假設你不需要什麼,直到你做。

通常假設YAGNI導致解耦。如果你根本不應用那把刀,那麼你最終會認爲在你證明這是真實的之前,你需要有能夠全面瞭解對方行爲的課程。

「解耦」(或「鬆散耦合」)是一個動詞,因此它需要工作。 YAGNI是一種推定,當你發現它不再是真實的時候,你會對它進行調整。