インターフェイスの拡張メソッドをinterface.csファイルに含める必要がありますか?


8

この設定を想像してください:

public interface IMass{
    double Mass {get;}
}

public static class IMassExtension {
    public static double ToKg(this IMass massObject) {
        return massObject.Mass / 1000.0;
    }

    public static double CalculateInteractiveGravity(this IMass massObject, IMass otherMassObject)          
    {
         return blah;
    }
}

拡張クラスをインターフェースと同じファイル(つまり、IMass.cs)に配置してもよいですか、それとも別のファイル(IMassExtension.cs)に配置する必要がありますか?


ここでは基本クラスは使用できません。想像してみて

public class Person : Animal, IMass {}

そして

public class House : Building, IMass {}

@Yusubov基本クラスは、ここで更新の問題は動作しません
Moop

回答:


13

ええ、それは全く問題ありません。さらに、「このcsprojにはどのような機能がありますか?」のノイズを減らしながら、インターフェイスで使用可能な機能を見つけやすくするために、そうすることをお勧めします。ビジュアルスタジオで表示します。

これに対して私が聞いた唯一の議論は:

  • 「しかし、ファイルごとに2つのタイプがあります!」-ガイドラインはあなたを助けるためにあり、あなたの手を結ぶことではありません。できれば、1つのタイプだけにします。
  • 「しかし、その拡張はXYZを使用します!」-ええ、もしそれが抽象クラスであるならメソッドを含めないなら、あなたはそれをインターフェースにハードワイヤーするべきではありません。これはこのプラクティスの問題ではなく、デザインの問題です。

新しい言語機能は、これを大幅に強化します
user1496062

2

要約すると、拡張メソッドを別のファイルに含めることが、アプローチの1つです。メンテナンス中に間違いなく安全な時間になるので、拡張に適切な名前を付けることも非常に重要です。

私は間違いなく名前MassExtensionsを好むでしょうIMassExtensions。その理由は、ほとんどのプログラマにとって、型のIプレフィックスは、それがインターフェイスであることを意味します。これは非常に一般的なパターンであり、.NET設計ガイドラインの一部でもあります。

拡張メソッドのケースにI接頭辞を追加すると、仮定と確立されたガイドラインの両方が破られます。

また、Base Class Libraryにもこの優先順位があります。で使用できる拡張メソッドの大部分はIEnumerable、タイプに含まれていEnumerableます。

関連する投稿をフォローすると役立つ場合があります。


このブログ記事は、同じ名前空間に対してお勧めします。blogs.msdn.com/b/vbteam/archive/2007/03/10/...
Moop

同意します。独自の名前空間にある必要があります
Yusubov '

1

通常、インターフェイスと同じファイルに拡張メソッドを配置しません。同じライブラリ/パッケージ?承知しました。

この例では、間違いなくそうします。誰かが帝国単位(ナメクジ)で質量を実装した場合はどうなりますか?toKg()はインターフェース内にある必要があります(おそらくtoSlug()と同様ですが、技術的にはtoKg()から派生可能であり、拡張メソッドはtoG()、toMcg()などのメソッドです。インターフェイスメソッドを使用して実装できます。


0

別のファイルに入れて、「IMassExtension.cs」よりもわかりやすい名前を付けます。おそらく「MassConversions.cs」のようなものです。それは、クラスが実際に行うことだからです。

拡張メソッドは、単純な静的メソッド(などMassConversions.ToKg(massObject))であるかのように呼び出すことができるので、クラスはそのことを念頭に置いて名前を付けてください。また、拡張クラスはインターフェースではないため、先頭に「I」を付けると誤解を招く可能性があります。


まあ、これは単純な例にすぎません。さまざまなことを行う拡張メソッドがたくさんありますが、それに対する一般的な名前はありません
Moop

これは、機能を整理するためにさらに検討が必要であることを示している可能性があります。「キッチンシンク」クラスは、通常、多くの苦痛の原因となるため、通常は避ける必要があります。機能が拡張メソッドの形で表面化されているからといって、適切なクラス構造を放棄する理由にはなりません。
エリックキング

質問を更新して、この設計に役立つ理由を示しました。
Moop、2014

私はあなたのアップデートを見ました、そして私のコメントはまだ適用されます。機能の種類ごとに個別の(適切な名前の)クラスを作成します。私の意見では、それらすべてを同じクラスに配置するのは便利ですが、ずさんです。
エリックキング

あなたはそれを言っていてAnimial : MassBuilding : MassもしMassベースクラスだったら?
Moop、2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.