2011-01-24 10 views
3

私は従来のソフトウェアシステムで作業しています。古いCOMコンポーネントを.NET 3.5に移行する作業があります。 COMコンポーネントはもともとはMTSでホストされていた後、コンポーネントサービスでホストされていました。 .NETポートでは、ADO.NETトランザクションとのトランザクションを処理するため、メソッドのシグネチャが多少変更されています。推奨パラメータオーダー

私が直面しているジレンマは、パラメータの順序です。各メソッドは、SqlConnectionまたはSqlTransaction(メソッドがデータベースを更新するかどうかによって異なります)のいずれかに渡す必要があります。当然のことながら、いくつかのメソッドは異なる引数で呼び出すことができます。たとえば、次のように

Keyword.Load(string description, SqlTransaction transaction) 

- または -

Keyword.Load(string description, string tag, SqlTransaction transaction) 

は今、複数のオーバーロードを提供枠組みの中でほとんどのメソッドはそう:

A(int arg1) 
A(int arg1, string arg2) 
A(int arg1, string arg2, DateTime arg3) 

特に、パラメータの順序過負荷にもかかわらず一貫しています。しかし、私は本当にユーザーが接続やトランザクションを渡すための要件を強調したいと思います。一般に、これらは最後に指定された引数です。

A(SqlTransaction transaction) 
A(SqlTransaction transaction, int arg1) 

残念ながら、これは接続やトランザクションどちらを取り、あなたのための1を作成し、過負荷の宣言であるブレークダウン:しかし、それらを置くのに最適な場所がパラメータ0であるように私には思えます。

// These overloads create a connection, open it, and start a new transaction. 
A() 
A(int arg1) 
A(int arg1, string arg2) 
A(int arg1, string arg2) 
A(int arg1, string arg2, DateTime arg3) 

// These overloads require that the transaction be passed in, so that the method 
// can take part in it. 
A(SqlTransaction transaction) 
A(SqlTransaction transaction, int arg1) 
A(SqlTransaction transaction, int arg1, string arg2) 
A(SqlTransaction transaction, int arg1, string arg2, DateTime arg3) 

あなたが見ることができるように、それが権利を取得するために多くのオーバーロードを必要としますが、トランザクション重視や接続は私だけに、より明確なようです。

あなたが私の場合は、どのようなパスを選択しますか?このようなシナリオをどのように扱うべきかを規定する設計ガイドラインはありますか?それに対処するにはあまりにも多くの過負荷ですか?

答えて

5

はストレートFrameworkの設計ガイドラインから:

メソッドのパラメータの順序と命名で一貫してください。

編集:

あなたがガイドラインに従うことをしたくない場合は、私はそうのような別の方法に過負荷を破る:で

A() 
A(int arg1) 
A(int arg1, string arg2) 
A(int arg1, string arg2) 

AWithTransaction(SqlTransaction transaction) 
AWithTransaction(SqlTransaction transaction, int arg1) 
AWithTransaction(SqlTransaction transaction, int arg1, string arg2) 
AWithTransaction(
    SqlTransaction transaction, 
    int arg1, 
    string arg2, 
    DateTime arg3 
) 

特に、私は言うだろう

Keyword.Load(string description) 
Keyword.Load(string description, string tag) 
最後のパラメータとして渡すことがトランザクションを必要とする

Keyword.LoadWithTransaction(SqlTransaction transaction, string description) 
Keyword.LoadWithTransaction(
    SqlTransaction transaction, 
    string description, 
    string tag 
) 
+1

。個人的にも、主観的でも、この場合、私は最初に渡すことをお勧めします。 –

+1

@Lieven:自分の編集を参照してください。 – jason

+0

これは実際には悪いモデルではありませんが、Keyword.LoadFromNewConnection(文字列の説明)とKeywordというキーワードをトランザクションに重点を置いたモデルに合わせて変更する可能性があります。ロード(SqlConnection接続、文字列の説明)。私の主な目的は、接続とトランザクションを可能な限り再利用したいということと、呼び出し元が接続の確立方法を明示しなければならないことを強調することです。 –