Лучший способ построить объект из строки с разделителями (надеюсь, не зацикленный регистр) - PullRequest
3 голосов
/ 31 марта 2009

кажется, что этот вопрос уже задавался, но я ничего не нашел, так что вот так ...

У меня есть конструктор, которому передается строка с разделителями. Из этой строки мне нужно заполнить переменные экземпляра объекта. Я могу легко разбить строку на разделитель, чтобы получить массив строк. Я знаю, что могу просто перебрать массив и установить переменные своего экземпляра, используя ifs или оператор switch / case, основываясь на текущем индексе массива - однако это кажется немного неприятным. Псевдокод:

String[] tokens = <from generic string tokenizer>;

for (int i = 0;i < tokens.length;i++) {
   switch(i) {
      case(0): instanceVariableA = tokens[i];
      case(1): instanceVarliableB = tokens[i];
      ...
   }
}

У кого-нибудь есть идеи, как мне сделать это лучше / лучше?

Что бы это ни стоило, я работаю на Java, но, думаю, это не зависит от языка.

Ответы [ 5 ]

4 голосов
/ 31 марта 2009

Хм ... "противный" - это способ, которым конструктор обрабатывает параметры. Если вы не можете это изменить, тогда ваш фрагмент кода настолько хорош, насколько может быть.

Вы можете избавиться от цикла for, хотя ...

instanceVariableA = tokens[0];
instanceVariableB = tokens[1];

, а затем ввести константы (для читабельности):

instanceVariableA = tokens[VARIABLE_A_INDEX];
instanceVariableB = tokens[VARIABLE_B_INDEX];

ПРИМЕЧАНИЕ : если бы вы могли изменить синтаксис строковых параметров, вы могли бы ввести простой синтаксический анализатор и, немного подумав, обработать эту вещь немного более элегантным образом:

String inputString = "instanceVariableA=some_stuff|instanceVariableB=some other stuff";
String[] tokens = inputString.split("|");
for (String token : tokens)
{
    String[] elements = token.split("=");
    String propertyName = tokens[0];
    String propertyValue = tokens[1];
    invokeSetter(this, propertyName, propertyValue); // TODO write method
}
0 голосов
/ 31 марта 2009

просто непроверенная идея,

сохранить оригинальный токен ...

String[] tokens = <from generic string tokenizer>;

затем создайте

int instanceVariableA = 0;
int instanceVariableB = 1;

если вам нужно его использовать, просто

tokens[instanceVariableA];

следовательно, больше нет петель, не больше VARIABLE_A_INDEX ...

может JSON может помочь?

0 голосов
/ 31 марта 2009

Python-специфичное решение:

Допустим, params = ["instanceVariableA", "instanceVariableB"]. Тогда:

self.__dict__.update(dict(zip(params, tokens)))

должно работать; это примерно эквивалентно

for k,v in zip(params, tokens):
    setAttr(self, k, v)

в зависимости от наличия / отсутствия аксессоров.

В нединамическом языке вы могли бы добиться того же эффекта, создавая отображение из строк в ссылки / средства доступа какого-либо рода.

(Также имейте в виду, что zip останавливается при исчерпании любого списка.)

0 голосов
/ 31 марта 2009

Я действительно думаю, что то, как вы это делаете, прекрасно, и Манрико дает хорошее предложение и об использовании констант.

Другим методом было бы создание HashMap с целочисленными ключами и строковыми значениями, где ключ - это индекс, а значение - это имя свойства. Затем вы можете использовать простой цикл и некоторое отражение, чтобы установить свойства. Часть отражения может сделать это немного медленным, но на другом языке (скажем, PHP) это будет намного чище.

0 голосов
/ 31 марта 2009

Не могли бы вы использовать цикл «для каждого», чтобы устранить большую часть беспорядка?

...