2017-06-15 5 views
2

私は、実装が互いに関連するオブジェクト間に型階層を確立しようとしています。構文が冗長になり、私がジェネリックを乱用しているとか、このようなインタフェース間の関係を表現するためのより洗練された手段があると私は信じています。ジェネリックとの関係を確立する

例を挙げましょう:この階層の

interface Interface 
{ } 
interface Class<I> 
    where I : Interface 
{ } 
interface Method<I, C> 
    where I : Interface 
    where C : Class<I> 
{ } 
interface Parameter<I, C, M> 
    where I : Interface 
    where C : Class<I> 
    where M : Method<I, C> 
{ } 

}

ルートがInterfaceです。次に、特定のInterfaceからのみ派生できるClassがあります。

Methodは、Classの特定の実装に属している必要があります。

Parameterは、特定のMethodの実装でのみ実装できます。

これについてもっと良い方法がありますか?私は過去1年間CとGoで泳いでいたので、C#のジェネリックスの構文で少し錆びています。

+3

それは本当にあなたがこれを使用する方法によって異なります。今すぐあなたの質問は、一般的な意味では少しのように思われます。 – juharr

答えて

8

タイプドメインシステムで、ビジネスドメインのビジネスルール(インターフェイス、クラス、メソッド、パラメータ)を取得しようとしているようです。

私はそれをやろうとしないことをお勧めします。タイプシステムのルールは必ずしもビジネスドメインのルールに完全に対応していないため、痛みを引き起こす傾向があります。

特に、ビジネスドメインには、「XはZを行うことから制限されるYの一種」という形式のルールが多くあり、Liskov置換原則を使用するタイプシステムではすぐに表現することが困難です。 Yが一種のXであり、XがZを行うことができるならば、YはZ個の実行を必要とする文脈で使用できることを意味する。

ジェネリックはコンテナ、比較関数、モナド型(nullable、sequence、future、lazyなど)と他の型構造の問題を解決するように設計されています。私の経験則:あなたの説明に「of」という言葉を使うことができない、または素敵な簡単な形容詞を作れない場合は、ジェネリックを使用しないでください。 "リンゴのボウル、オレンジのボウル、大丈夫、ボウルのような音は一般的です。数字のシーケンス、名前のシーケンス、確かに、ヌル日付、怠惰な文字列。それらのすべては素敵で簡単です。インターフェイスのクラス?あまり明確ではない。ここ

もっと思考:

https://ericlippert.com/2015/04/27/wizards-and-warriors-part-one/

+0

あなたは正確です。答えは、はい、私はジェネリック薬を乱用しています!そのアイデアは、独自システムの実装のさまざまな部分を置き換えるために、UnityなどのIoCフレームワークを使用することに起因していました。しかし、ある時点でアーキテクチャがジェネリックスを介してビジネスロジックを獲得しようとしていたと仮定すると正しいです。これは濫用が始まった場所です。 –

関連する問題