Идеи рефакторинга потребности для Антишаблона Стрелки

Принятый ответ выше:

-Duser.timezone="Europe/Sofia" 

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

-Duser.timezone=Europe/Sofia
12
задан Gordon Gustafson 12 May 2017 в 17:36
поделиться

7 ответов

Конечный автомат походит на логическое место для запуска, и использующий WF, если можно качаться, это (кажется, что Вы не можете).

Можно все еще реализовать один без WF, просто необходимо сделать это сами. Однако размышление о нем как конечный автомат от запуска, вероятно, даст Вам лучшую реализацию, затем создающую процедурного монстра, который проверяет внутреннее состояние на каждом действии.

Схематически изобразите свои состояния, что вызывает переход. Фактический код для обработки записи нужно факторизовать и назвать, когда состояние выполняется (если то конкретное состояние требует его).

Так State1 выполняются, называет Ваше "чтение записью", затем на основе тот рекордные переходы к другому состоянию.

Следующее состояние может считать несколько записей и записи вызова, обрабатывающей инструкции, затем переход назад к State1.

2
ответ дан 2 December 2019 в 05:16
поделиться

Одна вещь, которую я делаю в этих случаях, состоит в том, чтобы использовать 'Составленный Метод' шаблон. Посмотрите Сообщение в блоге Jeremy Miller на этом предмете. Основная идея состоит в том, чтобы использовать инструменты рефакторинга в Вашем IDE для извлечения маленьких значимых методов. После того как Вы сделали это, Вы можете далее осуществлять рефакторинг и извлекать значимые классы.

2
ответ дан 2 December 2019 в 05:16
поделиться

У меня просто был некоторый унаследованный код на работе на этой неделе, которая была подобна (хотя не столь страшный) как что Вы описываете.

Нет никакой вещи, которая вытащит Вас из этого. Конечный автомат мог бы быть конечной формой, которую принимает Ваш код, но это не собирается помогать Вам добраться там, и при этом Вы не должны выбирать такое решение прежде, чем распутать путаницу, которую Вы уже имеете.

Первый шаг, который я сделал бы, должен записать тест для существующего кода. Этот тест не должен показывать, что код является правильным, но удостоверяться, что Вы не повредили что-то, когда Вы начинаете осуществлять рефакторинг. Заставьте большой комок данных обрабатывать, подавать его монстру и получать вывод. Это - Ваше решающее испытание. если можно сделать это с инструментом покрытия кода, Вы будете видеть то, что Вы тестируете, не покрывает. Если Вы можете, создать некоторые искусственные записи, которые также осуществят этот код и повторение. После того как Вы себя чувствуете, что Вы делаете то, что Вы можете с этой задачей, выходные данные становится Вашим ожидаемым результатом для Вашего теста.

Рефакторинг не должен изменять поведение кода. Помните это. Поэтому Вы знали вход и знали, что наборы выходных данных для проверки Вас не собираются повреждать вещи. Это - Ваша система поддержки.

Теперь осуществите рефакторинг!

Пара вещей, я сделал это, я нашел полезным:

Инвертирование if операторы

Огромная проблема, которую я имел, просто читала код, когда я не мог найти соответствие else оператор, я заметил, что много блоков было похоже на это

if (someCondition)
{
  100+ lines of code
  {
    ...
  }
}
else
{
  simple statement here
}

Путем инвертирования if Я видел простой случай, и затем перейдите на более сложный блок, знающий, что уже сделал другой. не огромное изменение, но помог мне в понимании.

Метод извлечения

Я использовал это много. Возьмите некоторый сложный много блок строки, grok это и пихните его в стороне в своем собственном методе. это позволило мне более легко видеть, где было дублирование кода.

Теперь, надо надеяться, Вы не взломали свой код (тест все еще передает право?), и у Вас есть больше читаемого и лучшего понятого процессуального кодекса. Посмотрите это уже улучшено! Но тот тест, который Вы записали ранее, не действительно достаточно хорош..., он только говорит Вам, что Вы дублирование функциональности (ошибки и все) исходного кода, и это - только строка, у Вас было покрытие на том, поскольку я уверен, что Вы нашли бы блоки кода, которые Вы не можете выяснить, как совершить нападки или просто никогда не можете совершать нападки (я видел обоих в своей работе).

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

Рефакторинг к Шаблонам является замечательной книгой для помощи в explainging шаблонах, которые полезны в этих ситуациях.

Вы пытаетесь съесть слона, и нет никакого другого способа сделать это, но один укус за один раз.Удачи.

20
ответ дан 2 December 2019 в 05:16
поделиться

Я запустил бы со свободного использования Метода Извлечения. Если у Вас нет его в Вашей текущей Visual Studio IDE, можно или получить стороннее дополнение или загрузить проект в более новом VS. (Это попытается обновить Ваш проект, но Вы тщательно проигнорируете те изменения вместо того, чтобы регистрировать их.)

Вы сказали, что у Вас есть код, форматируемый 15 уровней. Запустите о 1/2-way, и Метод Извлечения. Если можно придумать хорошее имя, используйте его, но если Вы не можете, извлечение так или иначе. Разделение в половине снова. Вы не идете для идеальной структуры сюда; Вы пытаетесь прервать код к частям, которые поместятся в Ваш мозг. Мой мозг не является очень большим, таким образом, я продолжал бы повреждаться и повреждаться, пока он больше не причиняет боль.

Когда Вы идете, ищете любые новые длинные методы, которые, кажется, отличаются, чем остальные; сделайте их в к новым классам. Просто используйте простой класс, который имеет только один метод на данный момент. Heck, делая метод статичным прекрасен. Не потому что Вы думаете, что они - хорошие классы, но потому что Вы так отчаянно нуждаетесь в некоторой организации.

Регистрация часто, когда Вы идете, таким образом, можно отметить работу контрольной точкой, понимает историю позже, быть готова сделать некоторую "реальную работу", не будучи должен объединить, и сохранить товарищей по команде стычка трудного слияния.

В конечном счете необходимо будет возвратиться и удостовериться, что имена методов хороши, что набор методов, которые Вы создали, имеет смысл, очищает новые классы и т.д.

Если у Вас есть высоконадежный инструмент Extract Method, можно уйти без хороших автоматизированных тестов. (Я доверял бы VS этому, например.) Иначе, удостоверьтесь, что Вы не повреждаете вещи, или Вы закончите хуже, чем Вы запустили: с программой, которая не работает вообще.

Соединяющийся партнер был бы услужлив здесь.

2
ответ дан 2 December 2019 в 05:16
поделиться

Судя описанием, конечный автомат мог бы быть лучшим способом иметь дело с ним. Имейте перечислимую переменную, чтобы сохранить текущее состояние и реализовать обработку как цикл по записям, с переключателем или если операторы для выбора действия для взятия на основе текущего состояния и входных данных. Можно также легко отправить работу отдельным функциям на основе состояния с помощью указателей функции также, если это становится слишком большим.

1
ответ дан 2 December 2019 в 05:16
поделиться

Было довольно хорошее сообщение в блоге об этом при Кодировании Ужаса. Я только столкнулся с этим антишаблоном однажды, и я в значительной степени просто выполнил его шаги.

1
ответ дан 2 December 2019 в 05:16
поделиться

Иногда я комбинирую шаблон состояния со стеком.

Это работает хорошо на иерархические структуры; родительский элемент знает, какое состояние продвинуть на стек для обработки дочернего элемента, но ребенок ничего не должен знать о его родителе. Другими словами, ребенок не знает, каково следующее состояние, оно просто сигнализирует, что это "завершено" и выталкивается от стека. Это помогает отделить состояния друг от друга путем сохранения зависимостей однонаправленными.

Это работает отлично для обработки XML с синтаксическим анализатором SAX (обработчик содержимого просто продвигает и выталкивает состояния для изменения его поведения, поскольку элементы введены и выходятся). EDI должен предоставить себя этому подходу также.

1
ответ дан 2 December 2019 в 05:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: