Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Первые шаги применения рефакторинга.


Информационный Канал Subscribe.Ru

Мир экстремального программирования

Появились новые паттерны рефакторинга

Формирование шаблона метода (Form Template Method)
Скрытие делегирования (Hide Delegate)
Скрытие метода (Hide Method)
Встраивание класса (Inline Class)
Встраивание метода (Inline Method)

Изучаем методики XP

Первые шаги применения рефакторинга.

Рефакторинг, как одно из перспективных направлений объектно-ориентированного программирования, получил распространение не только в рамках гибких методологий. Основное его отличие от объектно-ориентированного проектирования заключается в возможности построения красивых программ постфактум или когда часть кода уже написана. Если выражаться простым языком, то рефакторинг можно представить как штукатура, исправляющего изъяны строительства с помощью объектно-ориентированных методов. Давайте смело посмотрим правде в глаза: вряд ли у кого-то получалось поддерживать хороший стиль кода длительное время. Если всё же задаться такой целью, то это неоправданно займёт слишком много времени. Но даже в этом случае, последующие изменения могут резко нарушить вашу идиллию. Как же может помочь рефакторинг в поддержке хорошего дизайна системы? Мартин Фаулер собрал множество паттернов рефакторинга в одноимённой книге. Они то и являются инструментарием программиста. Попробуем проиллюстрировать применение рефакторинга на реальном примере. Будет использован паттерн "выделение метода" для устранения дублирования кода. Есть два метода одного класса, выполняющие схожие действия:

CString ReportBuilder::GetTempReportPath()
{
    TCHAR szTempPath[MAX_PATH];
    GetTempPath(MAX_PATH , szTempPath);
    return AppendPath(szTempPath, "Report.htm");
}

CString ReportBuilder::GetTempDocumentPath()
{
    TCHAR szTempPath[MAX_PATH];
    GetTempPath(MAX_PATH , szTempPath);
    return AppendPath(szTempPath, "Document.txt");
}

Попробуем выделить общее в отдельный метод:

CString ReportBuilder::PrepareTempPath(CString name)
{
    TCHAR szTempPath[MAX_PATH];
    GetTempPath(MAX_PATH , szTempPath);
    return AppendPath(szTempPath, name);
}

Видоизменим наши методы следующим образом:

CString ReportBuilder::GetTempReportPath()
{
    return PrepareTempPath("Report.htm");
}

CString ReportBuilder::GetTempDocumentPath()
{
    return PrepareTempPath("Document.txt");
}

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

Упражнение.

Видоизменим представленный выше пример и предположим, что эти два метода находятся в двух независимых классах:

CString ReportBuilder::GetTempReportPath()
{
    TCHAR szTempPath[MAX_PATH];
    GetTempPath(MAX_PATH , szTempPath);
    return AppendPath(szTempPath, "Report.htm");
}

CString DocumentTemplate::GetTempDocumentPath()
{
    TCHAR szTempPath[MAX_PATH];
    GetTempPath(MAX_PATH , szTempPath);
    return AppendPath(szTempPath, "Document.txt");
}

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

Жду ответов!

До новых встреч,
Ведущий рассылки, Александр Федоренко.



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное