2010-07-28 4 views
2

У меня есть относительно большой унаследованный метод, который я хотел бы реорганизовать. Он подходит для типа «Bulleted method», как указано в «Майклах Персе» «Эффективно работает с устаревшим кодом», и поэтому его можно разделить несколькими последовательными способами довольно прямолинейно. Но каждый из его последовательных шагов выводит какое-то сообщение в журнале, и для формирования этого сообщения требуется гораздо больше данных, чем для самого шага. Поэтому, когда я пытаюсь извлечь метод, я получаю метод, имеющий, скажем, 6 параметров. Если бы я удалил эти операторы журнала, у меня был бы метод только с одним параметром. Поэтому я фактически не могу реорганизовать что-либо. И мне не разрешено просто записывать записи журнала.Заявления журнала запрещают рефакторинг: как это сделать?

Часть метода выглядит следующим образом:

// much of code before 
Device device = getDevice(deviceID); 
boolean isFirstRegistration = false; 

if (device == null) { 
    /*logger.trace(
      "DeviceId", deviceID, 
      "ADM", adminCode, 
      "Phone", clientData.getPhone() 
    ); 
    logger.info("First registration of the device. Device ID - " + deviceID);*/ 
    isFirstRegistration = true; 
} else { 
    /*logger.trace(
      "DeviceId", deviceID, 
      "ADM", adminCode, 
      "Phone", clientData.getPhone() 
    ); 
    logger.info("Device ID - " + deviceID 
      + " has been previously registered by adminCode: " 
      + device.getAdminCode());*/ 
} 
// much of code after 

Как вы видите, закомментирована заявления протоколирования. В этом случае я могу извлечь метод boolean isFirstRegistration(String deviceId). Но когда они раскоментированы, подпись раздувается до boolean isFirstRegistration(String deviceId, String adminCode, ClientData clientData). И это не самый экстремальный случай, только один из первого взгляда. У вас есть идеи, как мне реорганизовать такой метод?

+1

Можем ли мы это увидеть? Вы могли бы использовать метод вспомогательного журнала, чтобы получить дополнительные данные, и вернуть одну строку/объект, который затем передается вашему методу ведения журнала. Или поставьте все элементы, необходимые для входа в один массив или хеш, и передайте их. – CaffGeek

+0

Что вы пытаетесь выполнить через рефакторинг? –

+0

Я попытаюсь написать фрагмент, похожий на часть этого метода. – Rorick

ответ

6

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

Обновление: Используя представленные переменные примера, я бы назвал, например, myLogger.setDevice(device), как только устройство было заполнено; аналогично для adminCode, clientData и т. д. Дайте методы журнала журнала, такие как traceDeviceAdminCodeAndPhone() и logFirstRegistration(), где он использует свои собственные переменные экземпляра. В любом месте переменные меняются, снова загружайте их в регистратор. Теперь передайте регистратор в методы, которые вы извлекаете, а также любые параметры, которые непосредственно необходимы новому методу (но не более), и ваш регистратор все равно может сообщить, что ему нужно, из извлеченного метода.

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

+0

Это правильный ответ, но он может использовать более подробную информацию. –

+1

@Peter, соответственно. Это лучше? –

+0

Да, действительно. Благодарю вас, любезно. –

3

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

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

Некоторые из фреймворков, которые его поддерживают, - Log4J, SLF4J, но я думаю, что нечто подобное должно существовать и в мире «не-Java».

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

  • менее, чистый код
  • нет необходимости передавать Params, которые необходимы только для регистрации
  • равномерно занесенные в журнал сообщения (отформатированные каркасом в соответствии с рисунком, который вы ему даете)
  • больше гибкости - то, что/когда/как записывается в журнал, управляется конфигурацией журнала (там, где она принадлежит).

Единственное, что следует отметить: в пар ключ/значение, как правило, хранятся в резьбовыми локальных переменных, что приводит к некоторым возможным ловушками:

  • он не может работать слишком хорошо/не будет легко используйте, если вы часто переключаете потоки
  • Обычно очистка (удаление нежелательных значений) - это ваша задача, а не сама по себе программа.
Смежные вопросы