2016-06-16 7 views
0

aは提供されたitemIDsに応じてユーザー情報の配列を返す外部dllを持っています。そのための単純なコード、次のようになります。リファクタリングの最も良い方法は配列要素へのアクセス

private string userName; 
private int userAge; 

const string NAME = "NAME"; 
const string AGE = "AGE"; 

string[] arrID = { NAME, AGE }; //IDs to get name and age, to get surname please add "SURNAME" to the array 

User[] users; 
string[] results; //OK - item found, Unknown - item id not found 

////////read from external dll//////// 
databaseAccessor.GetUsers(arrID, out users, out results); 
////////////////////////////////////// 

int itemNameIndex = Array.IndexOf(arrID, NAME); 
int itemAgeIndex = Array.IndexOf(arrID, AGE); 

if(results[itemNameIndex] == "OK") 
{ 
    userName = users[itemNameIndex].Name; 
} 

if(results[itemAgeIndex] == "OK") 
{ 
    userAge = users[itemAgeIndex].Age; 
} 

私は新しいユーザー「機能」などを取得しようとしたとき、もし新しい句が追加されなければならないので、このコードは好きではありません高さ。変更できないことの1つは、外部DLLへの呼び出しですdatabaseAccessor.GetUsers(arrID, out users, out results);

新しいifsを追加しないようにリファクタリングするにはどうすればよいでしょうか?

+0

「User」クラスの外観を教えてください。 – ViRuSTriNiTy

+0

結果配列とユーザー配列の内容がわかりません。結果配列には、要求された各FIELD(「NAME」や「AGE」など)の結果が含まれていますが、同じインデックスを持つユーザー配列(itemNameIndexおよびitemAgeIndex)。外部DLLから返される配列の内容の例を挙げることができますか? – Quido

答えて

0

外部呼び出しのラッパークラスを作成して、そこに結果を解釈できると思います。次に、有効なユーザーエンティティのみが返されます。ユーザーエンティティは、別のユーザーエンティティクラスのインスタンスでも、名前や年齢などのプロパティでも返されます。それは私の意見でそれをよりきれいにするでしょう(そして、もし必要ならば、外部dllを簡単に交換すること)。ような何か:

IEnumerable<UserEntity> users = UserManager.Get(); 

は、それからちょうどあなたがUserManager.Getでユーザーをアクセスするために必要なすべてのコードを実装します。もちろん、配列から情報にアクセスするためのプライベートメソッドを作成することもできます。 TryGetValueのようにresults[itemNameIndex] == "OK"のチェックを行い、値を返します。

だから、値を取得するためのコードを作成して、より一般的なものを私のアドバイスにしてください。

関連する問題