2011-12-26 10 views
2

C#定型コード

だから私はこのような何かをやってと思っています。

Shall() - Not quite sure about this one yet 
    .Test(...) - Determines whether the contained logic executed without any errors 
    .Guard(...) - Guards the contained logic from throwing any exception 
    .Assert(...) - Asserts before the execution of the code 
    .Throw(...) - Throws an exception based on a certain condition 
    .Assume(...) - Similar to assert but calls to Contract.Assume 

使用法:。father.Shall()ガード(F => f.Shop())

事は、私は、実行時にこれらの余分な呼び出しをしたくないということであると私はAOPを知っています私のためにこれを解決することができます、私はあなたがそれを行うより良い方法を持っている場合は、発信者に直接これらの呼び出しをインラインしたいと思います。

さて、私は研究か何かをやって前に私は、誰かがすでにそのやったり、それをやっているツールを知っているだろうか?

私はそれは時間と頭痛の多くを救うことができると思いますので、私は本当にそのようなものを構築し、国民にそれを解放します。

いくつかの例。

DbSet<TEntity> set = Set<TEntity>(); 

if (set != null) 
{ 
    if (Contains(entity)) 
    { 
     set.Remove(entity); 
    } 
    else 
    { 
     set.Attach(entity); 

     set.Remove(entity); 
    } 
} 

次のように変更されました。代わりに、面白いものと私は受け入れるだろうことを、あなたはあなたの経験を共有し、それについてとても良いか悪いものを私に伝えることができ、他の人の楽​​しみは、一部の人は本当に成熟度について何かを学ぶことができるようにしようの

Set<TEntity>().Shall().Guard(set => 
{ 
    if (Contains(entity)) 
    { 
     set.Remove(entity); 
    } 
    else 
    { 
     set.Attach(entity); 

     set.Remove(entity); 
    } 
}); 

私はコード契約を再作成しようとしていません、私はそれが毎日それを使用していることを知っています、私は1つの場所に書き込まれた定型句コードを移動しようとしています。

時には、呼び出しごとに返されたオブジェクトをチェックする必要があり、コードではないため、呼び出し元がnullにならないようにすることができないため、呼び出し側でnullチェックを実行する必要があります返されたオブジェクトには、コールを連鎖させるときにこれらのチェックを簡単に実行できるようになると考えました。

更新:私はもう少し考えて、意図を明確にしてコードを読みやすくするためにAPIを変更しなければならないでしょう。

私は考えは全く磨かないが、実際に私はすべてのこれらの方法にすぎ行ったことと思います。

とにかく、私は今のためにそれを残しておきます。

+0

コード契約よりも何を得ようとしているのかよく分かりません。 – CodesInChaos

+3

Pray()メソッドを追加するのを忘れています。誰かがあなたのコードを読んで楽しむことを期待しないでください。 –

+1

'Shall'、' Test'と 'Guard'はかなり無意味に見えます。 – CodesInChaos

答えて

6

あなたはコードの契約のようなものを記載しているように聞こえる:http://msdn.microsoft.com/en-us/devlabs/dd491992

+0

@eyalそれは新しい、実際には非常に古い(コンピューティングが進む限り) –

0

私はあなたが探しているものを理解していれば、その後、私が作ってみた最も近いものは、拡張メソッドです:

public static Chain<T>(this T obj, Action<T> act) 
{ 
    act(obj); 
    return obj; 
} 

これは、あなたが次の操作を行うことができます:

Set.Remove(Set.FirstOrDefault(entity) ?? entity.Chain(a => Set.Add(a))); 

あなたが見ることができるように、しかし、これは最も読みやすいコードではありません。これは、チェーン拡張メソッドが悪い(とはっきりとその用途を持っている)とは限りませんが、チェーン拡張メソッドは間違いなく濫用される可能性があるので、慎重に使用するか、過去のプログラミングのゴーストが戻ってきます。

+0

例外が発生したときにこのメソッドを使用するといくつかの興味深いスタックトレースが生成されるので、すべての結果を理解していることを確認してくださいあなたが外出してコード内で使用する前にChainを使用すること。 – William