-2

匿名(ラムダ)関数とデリゲートについて少し読んだことがあります。私は、自分の機能の一部がそれらを利用できる/利用すべき状況に対処していると思います。私の仮定が正しいかどうかはわかりません。

現在のコード:

fDoSave(fGetSqlCheckEmpJob(), fGetSqlUpdateEmpJob(), fGetSqlInsertEmpJob());
fDoSave(fGetSqlCheckEmpPayrl(), fGetSqlUpdateEmpPayrl(), fGetSqlInsertEmpPayrl());
fDoSave(fGetSqlCheckEEO(), fGetSqlUpdateEEO(), fGetSqlInsertEEO());
fDoSave(fGetSqlCheckEmpPhone(), fGetSqlUpdateEmpPhone(), fGetSqlInsertEmpPhone());

fGetSqlCheck...()- 特定の ID を持つすべての行の count() を返す文字列として SQL ステートメントを fGetSqlUpdate...()返します。更新を行う文字列として SQL ステートメントを返します。 fGetSqlInsert...()挿入を行う文字列として sql ステートメントを返します。 fDoSave()によって返される値に応じて、更新または挿入のいずれかを行いますfGetCheck...()

fGetSql 関数は次のようになります。

private string fGetSql...()
{
   StringBuilder sb = new StringBuilder();
   //Create sql statement
   return sb.ToString();
}

fDoSave 関数は次のようになります。

private void fDoSave(string sSql_Check, string sSql_Update, sSql_Insert)
{
   OracleDataReader dr = ERPDB.sqlGetDataReader(sSql_Check);
   while (dr.Read())
   {
        if(fCheckIfRecrodExists(dr) > 0) //if fGetSqlCheck...() found a row with a specific ID
            //do update using sSql_Update
        else
            //do insert using sSql_Insert
    }
}

ラムダ関数またはデリゲートのいずれかを使用してこれを書き直すことはできますか? どのように書き直せばよいでしょうか。

4

1 に答える 1

3

あなたの質問はまだ漠然としていますが、私はこのように言います。

ケース:

1: 再利用可能で「静的」
SQL ステートメントを再利用し、多少静的である場合は、それらを [プロパティ] に入れます。そして、より良い名前を検討してください。

2: 再利用可能だが単純だが「可変」
SQL ステートメントを再利用し、それらが可変であるが CPU をあまり使用しない場合、つまり状態によって変化し、作成と構築が非常に高速である場合は、そのままにしておく.

3: 再利用可能だが「可変」で複雑
SQL ステートメントを再利用し、それらが可変であるが非常に複雑であり、多くの CPU パワーを必要とする場合は、それらをメソッドに入れ、デリゲートとして呼び出し、匿名にしないでください。

4: 再利用できないが、「可変」で複雑
SQL ステートメントを再利用しない場合 (これはおそらくそうではありません)、それらが可変で非常に複雑であり、大量の CPU パワーを必要とする場合は、それらを無名関数に入れます。

いずれの場合も、
より適切な名前を使用してください。

私の提案
では、ケース 1 と 2 をお勧めします。残りの部分は、おそらく存在しない問題に対する非常に複雑な解決策のように思われるからです。
また、私はあなたのコードベース全体を知りませんが、保存されるはずのオブジェクトが fDoSave() に渡されないのは好きではありません。

私はそれを次のようにしたでしょう:

// Also often called Upsert short for "Update or Insert"
public int Save(EmpObj employeeObj) 
{
     if(CheckIfEmployeeExists(employeeObj))
     {
         return Update(employeeObj); // returns rows affected
     }
     else
     {
         return Insert(employeeObj); // Returns new Id of the employee.
     }
}

// Other methods, where the select, update and insert statements lies 
or gets called    and build
public bool CheckIfEmployeeExists(employeeObj) // Check If Employee Exists
public int Update(employeeObj); // Updates the employee
public int Insert(employeeObj); // Inserts the employee
于 2013-08-09T23:40:38.983 に答える