powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / как бороться с if - ами
16 сообщений из 16, страница 1 из 1
как бороться с if - ами
    #38683362
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть легаси код в котором ну очень много if - ов. По сути это импортер данных из множества источников в единый формат. Все источники похожи но везде по немногу исключений.
Ну вроде как где то FIO в базе по разным полям занесено, а где то в едином.
Где то серия и номер документов в одном поле, а где то в разных.
Где то по длине серии определяется тип документа и тд.
Количество настроек уже зашкаливает и каждый раз приходится при добавлении новой фичи или изменении старой отслеживать всю цепочку от места где обрабатывается код - какие там переменные и откуда туда попали данные с самого начала (вплоть до колонки в БД или файла настроек).
Весь код построен на if ах. А настроек просто бизнец сколько. Это какое то разделение данных с помощью определенных правил. Может как то это упорядочить можно.
А как вообще такого рода задачи решаются?
Это какой то специальный тип задач и/или может есть какие то готовые алгоритмы?
Куда смотреть (имеется ввиду в теоретическом плане)?
...
Рейтинг: 0 / 0
как бороться с if - ами
    #38683366
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Полиморфизм в помощь!
Покажи лучше кодом как оно выглядит. Подскажу как зарефакторить.
Рекомендую и книги прочесть по теме:
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
как бороться с if - ами
    #38683371
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
код с душком. один главный метод на 6000 строк был.
За книжки спасибо мартина фаулера уже читаюс недельку, уже удалось сжать до 1500 строк вынесение в методы повторяющихся кусков.
...
Рейтинг: 0 / 0
как бороться с if - ами
    #38683389
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
llemingкод с душком. один главный метод на 6000 строк был.
За книжки спасибо мартина фаулера уже читаюс недельку, уже удалось сжать до 1500 строк вынесение в методы повторяющихся кусков.
Да, "колбаса" часто решается в два этапа. Находим схожий код и выносим в методы. Организуем методы в классы используя наследование и полиморфизм, заменяя множественные if...else/switch...case на параллельные иерархии (что-то типа GoF Bridge)

Трудно что-то конкретное советовать, не видя код.
...
Рейтинг: 0 / 0
как бороться с if - ами
    #38683428
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как всегда + к 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
как бороться с if - ами
    #38683438
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
переменные я переименовал сразу и значения постоянные из DB вынес в константы сразу. Попробую вынести if в методы
...
Рейтинг: 0 / 0
как бороться с if - ами
    #38683446
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник2) Все что в if условии выношу в методы с понятным названием

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

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

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

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

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

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


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