Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / как бороться с if - ами / 16 сообщений из 16, страница 1 из 1
30.06.2014, 09:43
    #38683362
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как бороться с if - ами
Есть легаси код в котором ну очень много if - ов. По сути это импортер данных из множества источников в единый формат. Все источники похожи но везде по немногу исключений.
Ну вроде как где то FIO в базе по разным полям занесено, а где то в едином.
Где то серия и номер документов в одном поле, а где то в разных.
Где то по длине серии определяется тип документа и тд.
Количество настроек уже зашкаливает и каждый раз приходится при добавлении новой фичи или изменении старой отслеживать всю цепочку от места где обрабатывается код - какие там переменные и откуда туда попали данные с самого начала (вплоть до колонки в БД или файла настроек).
Весь код построен на if ах. А настроек просто бизнец сколько. Это какое то разделение данных с помощью определенных правил. Может как то это упорядочить можно.
А как вообще такого рода задачи решаются?
Это какой то специальный тип задач и/или может есть какие то готовые алгоритмы?
Куда смотреть (имеется ввиду в теоретическом плане)?
...
Рейтинг: 0 / 0
30.06.2014, 09:45
    #38683366
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как бороться с if - ами
Полиморфизм в помощь!
Покажи лучше кодом как оно выглядит. Подскажу как зарефакторить.
Рекомендую и книги прочесть по теме:
http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672
http://www.amazon.com/Robert-Martin-Clean-Code-Collection-ebook/dp/B00666M59G
...
Рейтинг: 0 / 0
30.06.2014, 09:54
    #38683371
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как бороться с if - ами
код с душком. один главный метод на 6000 строк был.
За книжки спасибо мартина фаулера уже читаюс недельку, уже удалось сжать до 1500 строк вынесение в методы повторяющихся кусков.
...
Рейтинг: 0 / 0
30.06.2014, 10:10
    #38683389
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как бороться с if - ами
llemingкод с душком. один главный метод на 6000 строк был.
За книжки спасибо мартина фаулера уже читаюс недельку, уже удалось сжать до 1500 строк вынесение в методы повторяющихся кусков.
Да, "колбаса" часто решается в два этапа. Находим схожий код и выносим в методы. Организуем методы в классы используя наследование и полиморфизм, заменяя множественные if...else/switch...case на параллельные иерархии (что-то типа GoF Bridge)

Трудно что-то конкретное советовать, не видя код.
...
Рейтинг: 0 / 0
30.06.2014, 10:37
    #38683428
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как бороться с if - ами
Как всегда + к Blazkowicz.

Лично я еще использую такие вещи -

1) перво-наперво переименовываю все переменные чтобы они отражали суть происходящего
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
int d1 = 0;
int a = 20;
int b = getFromUser();
int c = b\100;
if (b < 30) {
 a = b
} else {
  c =a;
}



на какое нибудь.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
int fixedPercent = 0;
int defaultPercent = 20;
int userInput = getFromUser();
int userPercent = b\100;
if (userPercent  > 30) {
 fixedPercent  = userPercent ;
} else {
  fixedPercent   = defaultPercent ;
}



2) Все что в if условии выношу в методы с понятным названием

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
int fixedPercent = 0;
int defaultPercent = 20;
int userInput = getFromUser();
int userPercent = b\100;
if (userPercentAcceptable()) {
 fixedPercent  = userPercent ;
} else {
  fixedPercent   = defaultPercent ;
}



3) Ну и после этого уже начинаешь понимать какие куски кода в какой класс\стратегию\команду и тп можно завернуть
...
Рейтинг: 0 / 0
30.06.2014, 10:51
    #38683438
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как бороться с if - ами
переменные я переименовал сразу и значения постоянные из DB вынес в константы сразу. Попробую вынести if в методы
...
Рейтинг: 0 / 0
30.06.2014, 10:54
    #38683446
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как бороться с if - ами
забыл ник2) Все что в if условии выношу в методы с понятным названием

Вот это дельный совет. В Clean Code об этом тоже есть.
...
Рейтинг: 0 / 0
30.06.2014, 18:46
    #38684083
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как бороться с if - ами
Replace Conditional with Polymorphism
...
Рейтинг: 0 / 0
30.06.2014, 22:53
    #38684212
chabapok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как бороться с if - ами
Можно придумать язык описания формата исходных данных и парсер, который берет файл описания формата и парсит данные.
Дальше на каждый источник вы заводите свой файл описания формата данных.

второй вариант - это тупо на каждый источник по классу-парсеру. Делаются они копипастой и модификацией
ну и наследование, если в форматах данных много похожего.
...
Рейтинг: 0 / 0
01.07.2014, 02:01
    #38684281
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как бороться с if - ами
...
Рейтинг: 0 / 0
01.07.2014, 02:06
    #38684283
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как бороться с if - ами
Usmanlleming,

http://ru.wikipedia.org/wiki/Контрактное_программирование Например, при помощи AspectJ
...
Рейтинг: 0 / 0
01.07.2014, 10:03
    #38684424
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как бороться с if - ами
UsmanUsmanlleming,

http://ru.wikipedia.org/wiki/Контрактное_программирование Например, при помощи AspectJ
Каким образом автору может быть полезен AspectJ ? Ему нужно делать жёсткий
рефакторинг кода. Здесь никакие аспеакты не помогут.
...
Рейтинг: 0 / 0
01.07.2014, 10:04
    #38684425
chabapok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как бороться с if - ами
Usman,

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

Насколько я понял, простыми словами - это перед вызовом проверить корректность входных данных а после позврата результата - проверить корректность результата. Но момент - как это может помочь топик стартеру, не раскрыт.
...
Рейтинг: 0 / 0
01.07.2014, 13:51
    #38684752
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как бороться с if - ами
chabapokНасколько я понял, простыми словами - это перед вызовом проверить корректность входных данных а после позврата результата - проверить корректность результата.Именно. Проверки можно осуществлять как для входных (before), так и для выходных данных методов (after),
как раздельно, так и "одновременно" (around) (условно - в одном "обработчике").chabapokНо момент - как это может помочь топик стартеру, не раскрыт.Основная проблема на данный момент у ТС - разгрести многокилометровый if-овый код (и не только).
Для начала, как и советовали выше, ТСу необходимо избавиться от повторяющегося функционала,
выделить сущности... и оформить все это дело в виде отдельных классов/методов.
И только после этого можно говорить о применении каких-либо ООП-решений.
...
Рейтинг: 0 / 0
01.07.2014, 13:52
    #38684754
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как бороться с if - ами
maytonЕму нужно делать жёсткий рефакторинг кода.Ну, с этим никто не спорит (:
...
Рейтинг: 0 / 0
01.07.2014, 14:42
    #38684817
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как бороться с if - ами
Здесь надо в код смотреть. Я-бы дал 9 против 1 что там нужен RCWP. Типичная ситуация
- где-то в БД лежат разные объекты в одной таблице и для каждого нужна своя логика
обработки. От этого растут огромные if, switch-case на 1000 строк кода и прочее.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / как бороться с if - ами / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]