2016-06-16 1 views
0

a имеет внешнюю 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; 
} 

Мне не нравится этот код, как должен быть добавлен новый пункт, если при попытке получить новый пользователь «особенность», например, высота. Одна вещь, которая не может быть изменена, - это вызов внешней dll. databaseAccessor.GetUsers(arrID, out users, out results);

Что было бы лучшим способом реорганизовать его, чтобы избежать добавления новых ifs?

+0

Покажите нам, как выглядит класс 'User'. – ViRuSTriNiTy

+0

Я не понимаю, что такое содержимое массива результатов и массив пользователей ... Похоже, что массив результатов содержит результат для каждого запрашиваемого поля (например, «НАЗВАНИЕ» и «ВОЗРАСТ»), но вы получаете доступ к user array с тем же индексом (itemNameIndex и itemAgeIndex). Не могли бы вы привести пример содержимого массива, возвращаемого вашей внешней DLL? – Quido

ответ

0

Я думаю, вы могли бы создать класс-оболочку для внешнего вызова en, чтобы интерпретировать результаты там. Затем вы можете убедиться, что возвращаются только действительные пользовательские объекты, которые будут экземплярами отдельного класса пользовательских сущностей, а также с такими свойствами, как имя и возраст. Это сделало бы его чище, на мой взгляд (и, проще говоря, поменять внешнюю dll). Что-то вроде:

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

Тогда просто реализовать весь код, необходимый для доступа пользователей в UserManager.Get. После этого вы могли бы создать некоторые частные методы для доступа к информации из массива. Как TryGetValue, который делает проверку на results[itemNameIndex] == "OK", а затем возвращает значение.

Так что оберните его и сделайте код, чтобы получить значения, более общие данные будут моим советом.

 Смежные вопросы

  • Нет связанных вопросов^_^