2010-01-26 56 views
21

我最近看到一些C#代碼中的接口聲明和實現,其中在同一文件中,這樣C#接口和實現在同一個文件 - 好主意?

namespace MyNameSpace.Foo 
{ 
    public interface IFoo{ 
     void DoThis(); 
    } 
    public class Foo : IFoo { 
     public void DoThis(); 
    } 
} 

在乍看之下,似乎都錯了有聲明和實現在同一文件中,但也有實用好處。例如在Visual Studio中定義時,界面和實現在同一個文件中。這種方法並不禁止您使用其他接口實現,例如單元測試可能需要的接口。對於只有一個實現的接口,我認爲這可能是一個實用的方法。

好主意嗎?

擴展問題:
人使用Visual Studio導航到一個實現,當你有一個接口引用IFoo myFoo = FooFactory.getFoo(MY_FOO);如果我上的IFoo右鍵單擊並選擇轉到定義,我可以得到接口聲明怎麼辦。有沒有辦法讓我獲得IFoo的實現列表,因爲這正是我真正想要的。

+1

目前爲止非常棒的評論。我認爲我的問題應該擴展到詢問人們如何使用Visual Studio導航到具有接口引用的實現: IFoo myFoo = FooFactory.getFoo(MY_FOO); 如果我上的IFoo右鍵單擊並選擇轉到定義,我可以得到接口聲明 有我得到的IFoo的實現的列表,這就是我在讓真正有興趣的一種方式。 – Paul 2010-01-26 09:37:38

回答

33

我的建議是始終遵循每個.cs文件一個項目的規則,無論是枚舉聲明,接口還是類。 .cs文件的名稱應該與其包含的內容相匹配。

簡單的規則,易於遵循。我們在內部使用StyleCop來警示這一點。

如果將此方法與命名空間的合理使用相結合,那麼它應該表示您在Visual Studio中的解決方案資源管理器視圖可以輕鬆導航項目中的組件。請注意,此導航爲ReSharper gives an alternative approach,但使用這不符合每個人的口味(並不是每個人都可能有諸如ReSharper之類的插件)。

Travis G詢問了更多細節,如委託和自定義EventArgs聲明。由於自定義EventArgs是類,我會將它們放在它們自己的文件中(同樣,保持規則簡單)。我將向使用它們的類聲明代表。如果我發現我在很多地方使用了很多代表,我可能會考慮將它們全部放在Delegates.cs文件中(我有時會在Consts.cs文件中使用常量執行此操作)。

但是,其中一些肯定是主觀的,並進入軟件religious wars的領域。

+1

我支持這個。它簡化了代碼瀏覽以及搜索特定的類或接口:只需查看文件名即可。 – 2010-01-26 09:06:36

+2

我和你在一起,但是你對'委託'和自定義'EventArg'這些小東西做了什麼?我通常把它們放在同一個文件中,因爲它們只用在一個地方。 – 2010-01-26 09:08:41

+0

確保您對讓自己鬆懈的事情感到滿意。這很酷,我使用它,但擁有巨大的權力是非常重要的。 – 2010-01-26 09:11:47

13

個人...

如果接口只可能(在短期內)將用於一類(提供依賴注入的界面時一樣),那麼我就會把它在的頂部類文件。在開發過程中(班級可能發生變化時),每次公共場所變化時都必須更改兩個文件。

當然,如果有一個機會,接口將由多個類實現,那麼我把它放在一個單獨的文件中。

+4

是的,這是我想到的情況,當您僅使用接口來處理DI原因時,除了測試impl之外,您沒有太多機會實現接口的另一個定義。 – Paul 2010-01-26 09:06:25

+2

'如果一個接口只可能用於一個類'你做錯了。一個界面在這裏毫無價值。如果多個類沒有立即實現接口,那麼你做錯了。依賴注入不需要無意義的接口。這是一個神話。使用實際的具體類型。 – 2014-07-24 15:48:36

+5

@ChrisMarisic如果所說的依賴關係不是接口,你會如何爲單元測試提供模塊依賴關係? – Holf 2016-10-25 19:48:50

7

將接口定義和實現放在同一文件中與單元測試無關,因爲該接口無論如何都是可用的。

我通常從一個簡單的界面和實現在同一個文件開始。當事情成長時,當其他代碼需要引用該接口時,我將它們分開。

4

我只是堅持「一個檔次,一個檔案」的規則。I類也意味着接口,枚舉等

的,什麼是錯把對接口名稱光標,打F12?

1

確保它不會傷害有它這樣的,和工具,如ReSharper的就會把下面的界面的實現代碼。但是,他們也會讓您選擇將實現移出到另一個文件中。

你說得對,它不剝削接口的好處單元測試阻止你,但你可能要考慮把接口到另一個組件完全。這樣你可以隨意編程接口和交換實現,給你更多的分離。一如既往,沒有正確或錯誤的答案,這只是歸結於你想要達到的目標。

+1

把接口放在一個單獨的程序集(項目)中的好建議,對我來說也很好。 – Paul 2010-01-26 13:12:31

0

我這樣做,在Java中與幾個小方法接口。在這種情況下,我在接口文件中提供一個或多個基本實現。

這樣可以避免散佈在周圍的小班。

但我不能說,如果這是一個壞或最佳做法,雖然我的同事從來沒有抱怨過。

5

我認爲這是一個壞主意。

保持接口和實現分離。否則,你可能會搞砸設計。包括文件並自動獲得實現,即使你只需要接口,然後意外地(因爲它很方便)使用Impl而不是接口和yay,關閉耦合。