Java: рефакторинг кода / оптимизация - PullRequest
4 голосов
/ 25 ноября 2008

Пожалуйста, просветите меня:

Какой из них вы предпочитаете? Зачем? [Читаемость? Память беспокоит? Некоторые другие проблемы?]

1.

String strSomething1 = someObject.getSomeProperties1();
strSomething1 = doSomeValidation(strSomething1);
String strSomething2 = someObject.getSomeProperties2();
strSomething2 = doSomeValidation(strSomething2);
String strSomeResult = strSomething1 + strSomething2;
someObject.setSomeProperties(strSomeResult);

2.

someObject.setSomeProperties(doSomeValidation(someObject.getSomeProperties1()) + 
                             doSomeValidation(someObject.getSomeProperties2()));

Если бы вы сделали это другим способом, что бы это было? Почему ты так поступил?

Ответы [ 8 ]

17 голосов
/ 25 ноября 2008

Я бы пошел с:

String strSomething1 = someObject.getSomeProperties1();
String strSomething2 = someObject.getSomeProperties2();

// clean-up spaces
strSomething1 = removeTrailingSpaces(strSomething1);
strSomething2 = removeTrailingSpaces(strSomething2);

someObject.setSomeProperties(strSomething1 + strSomething2);

Мое личное предпочтение - организовывать по действиям, а не по последовательности. Я думаю, что это просто читается лучше.

12 голосов
/ 25 ноября 2008

Я бы, наверное, встал между:

String strSomething1 = doSomeValidation(someObject.getSomeProperties1());
String strSomething2 = doSomeValidation(someObject.getSomeProperties2());
someObject.setSomeProperties(strSomething1 + strSomething2);

Вариант № 2, похоже, много в одной строке. Это читабельно, но требует немного усилий для анализа. В варианте № 1 каждая строка очень удобочитаема и понятна, но многословие замедляет меня, когда я перебираю ее. Я бы попытался сбалансировать краткость и ясность, как указано выше, с каждой строкой, представляющей простое «предложение» кода.

6 голосов
/ 25 ноября 2008

Я предпочитаю второе. Вы можете сделать его таким же читаемым с небольшим форматированием, без объявления дополнительных промежуточных ссылок.

someObject.setSomeProperties(
    doSomeValidation( someObject.getSomeProperties1() ) + 
    doSomeValidation( someObject.getSomeProperties2() ));

Ваши имена методов содержат все необходимые объяснения.

4 голосов
/ 25 ноября 2008

Вариант 2 для удобочитаемости . Я не вижу здесь проблем с памятью, если методы делают только то, что указывают их имена. Я бы не согласился с конкатенациями, хотя. Производительность определенно идет в ногу с увеличением числа строк в силу неизменности Java Strings.

Просто любопытно узнать, действительно ли вы написали свой собственный метод removeTrailingSpaces () или это просто пример?

3 голосов
/ 25 ноября 2008

Я пытаюсь выполнить одну операцию на строку. Основная причина такова:

setX(getX().getY()+getA().getB())

Если у вас есть NPE, какой метод вернул null? Поэтому мне нравится иметь промежуточные результаты в некоторой переменной, которую я вижу после того, как код попал в сильные руки отладчика и без необходимости перезапуска!

2 голосов
/ 25 ноября 2008

для меня это зависит от контекста и окружающего кода.

[РЕДАКТИРОВАТЬ: не имеет никакого смысла, извините] если бы он был в методе, подобном "setSomeObjectProperties ()", я бы предпочел вариант 2, но, возможно, создал бы закрытый метод "getProperty (String name)", который удаляет завершающие пробелы, если удаление пробелов не является важной операцией [/ EDIT]

Если проверка свойств является важным шагом вашего метода, то я бы вызвал метод "setValidatedProperties ()" и предпочел бы вариант вашего первого предложения:

validatedProp1 = doValidation(someObject.getSomeProperty1());
validatedProp2 = doValidation(someObject.getSomeProperty2());
someObject.setSomeProperties(validatedProp1, validatedProp2);

Если проверка не является чем-то важным для этого метода (например, нет смысла возвращать свойства, которые не проверены), я бы попытался поместить шаг проверки в "getSomePropertyX ()"

1 голос
/ 25 ноября 2008

Мне нравятся версии как Грега, так и Билла, я думаю, что я бы более естественно написал код, подобный тому, который написал Грег. Одно преимущество с промежуточными переменными: его легче отлаживать (в общем случае).

1 голос
/ 25 ноября 2008

Лично я предпочитаю второй. Это менее загромождено, и мне не нужно отслеживать эти временные переменные.

Может легко измениться с помощью более сложных выражений.

...