Длительная фаза анализа считается признаком плохой обслуживаемости кода и указывает на необходимость его доработки
4 Ұнайды
Всегда оставляйте за собой место в лучшем виде, чем вы его нашли.
3 Ұнайды
Выбирайте композицию вместо наследования
1 Ұнайды
Сначала сделайте изменение простым, а затем уже внесите это простое изменение.
Кент Бек
1 Ұнайды
Я не могу предоставить универсальные правила для создания хорошего имени, но могу назвать несколько свойств, которыми оно должно обладать:
• оно должно быть правдивым и описывать реальное назначение функции;
• оно должно быть полноценным, то есть охватывать все, что делает функция;
• оно должно быть понятно для работающих в этой области людей, поэтому следует использовать соответствующую терминологию. В качестве дополнительного преимущества это повышает эффективность коммуникации и упрощает обсуждение кода с коллегами или заказчиками.
Но помните, что можно легко перемудрить, стараясь быть умнее, что обычно себя не оправдывает.
Дополнительный проект
Чтобы вы могли лучше понять, как использовать приводимые в книге правила и шаблоны рефакторинга, я придумал дополнительный проект. Этот проект более продвинутый, и готовое решение к нему не прилагается. Всех заинтересованных он будет ждать на GitHub: https://github.com/thedrlambda/bomb-guy. Удачи!
1. Просила каждого повторить эту фразу дословно. На этом этапе чистой имитации мы были вынуждены повторить ее один раз.
2. Задавала каждому вопрос. Вопрос не всегда был понятен, но по интонации было очевидно, что это именно вопрос. Поскольку других вариантов у нас не было, приходилось еще раз повторять фразу. Такое повторение внушало уверенность и предоставляло нам первый пример контекста применения изучаемой фразы. На этом этапе зарождалось понимание.
3. Просила использовать фразу в диалоге. Умение синтезировать нечто новое — это сама цель преподавания, и для этого требуется не только понимание, но и уверенность.
Позже я узнал, что этот подход повторяет японский принцип сюхари из боевых искусств, он сейчас становится все более популярным. Состоит он из трех частей: «сю» означает полную имитацию, когда повторение производится без вопросов и собственного понимания; «ха» уже подразумевает некоторую вариацию, то есть выполнение изученного в несколько обновленной форме; «ри» же означает оригинальность, то есть полностью свободное применение, отличное от усвоенного автоматически.
Содержание части I книги полностью построено по принципу сюхари. Я рекомендую сначала следовать правилам без их понимания. Затем, когда вы осознаете их ценность, сможете придумывать вариации. В завершение же, когда освоите их в совершенстве, сможете переходить к пониманию запахов кода. Что касается шаблонов рефакторинга, я буду показывать, как применять каждый из них в коде, и нужно будет за мной повторять (это имитация). Затем те же шаблоны я буду демонстрировать в иных контекстах (стадия вариации), а в завершение предложу рассмотреть другое применение шаблона, призывая вас использовать его самостоятельно (стадия синтеза).
При этом вы сможете воспользоваться книгой для оценки самого процесса и тегами Git для оценки кода. Если же вы не будете отслеживать изменения кода примера и вникать в них, то все описанные действия будут казаться излишними повторениями одного и того же. Поэтому настоятельно советую в процессе чтения части I все же параллельно прорабатывать приводимые в ней примеры на компьютере.
О коде
Эта книга содержит множество примеров исходного кода, который приводится как в нумерованных листингах, так и в самом тексте. В обоих случаях шрифт кода имеет моноширинныйформат, подобный этому, чтобы отличаться от прочего текста.
Во многих случаях оригинальный исходный код был переформатирован. Например, были добавлены разрывы строк и переработаны отступы, чтобы грамотно вписать все в доступное пространство книги. Помимо этого, во многих случаях, когда код описывался в самом тексте, соответствующие комментарии из него удалялись. В то же время множество листингов снабжено комментариями, подчеркивающими важные моменты.
Код примеров из этой книги доступен для скачивания на сайте издательства Manning (https://www.manning.com/books/five-lines-of-code), а также в моем репозитории на GitHub (https://github.com/thedrlambda/five-lines).
Нет ничего нового под Солнцем.
Книга Екклесиаста
Я не утверждаю, что вложил в книгу много нового, но считаю, что скомпоновал ее содержание не только интересно, но и эффективно. Многие правила были взяты из книги Роберта К. Мартина «Чистый код»1, но при этом изменены для простоты понимания и применения. Многие шаблоны рефакторинга позаимствованы из книги Мартина Фаулера «Рефакторинг»2, но адаптированы под использование компилятора вместо упора на сильные наборы тестов.
Аудитория и план изложения
Книга состоит из двух частей, сильно различающихся по стилю. Часть I закладывает прочный фундамент для выполнения рефакторинга и адресована каждому отдельно взятому разработчику. Не стремясь охватить вообще все стороны рефакторинга, я решил сделать упор на простоту изложения. Эта часть предназначена для тех, кому еще предстоит сформировать устойчивую основу для проведения рефакторинга, например для студентов, для начинающих программистов, в том числе самоучек. Если же, взглянув на исходный код в книге, вы решите, что улучшить его несложно, тогда часть I не для вас.
В части II фокус смещается на контекст применения рефакторинга и адресуется команде разработчиков. Здесь я выбрал наиболее ценные, на мой взгляд, уроки разработки программного обеспечения (ПО) в реальном, а не учебном мире. Некоторые темы состоят в основном из теории, например «Сотрудничайте с компилятором» и «Соблюдайте структуру в коде». Другие же в первую очередь практические, например «Страсть к удалению кода» и «Пусть плохой код выглядит плохо». Таким образом, часть II уже более универсальна, и даже опытные разработчики найдут здесь чему поучиться.
Поскольку во всех главах части I используется один общий пример, они тесно связаны между собой, и предполагается, что читать их будут в предложенной очередности. А вот часть II состоит уже из самостоятельных глав, связанных между собой только некоторыми ссылками из одной на другую. Если у вас нет времени на прочтение всей книги, можете просто выбрать наиболее интересные темы в части II и ознакомиться только с ними.
О преподавании
Я много размышлял о преподавании. Передача знаний и навыков несет в себе много сложностей. Учитель должен стимулировать у студентов интерес, уверенность и отдачу. Но по факту мозг учащегося склонен к сохранению энергии, поэтому постоянно стремится отвлечься от процесса обучения.
Чтобы побороть эту склонность ума, сначала нужно пробудить мотивацию. Для этого я обычно привожу простое с виду упражнение. Когда студенты понимают, что не могут его выполнить, их охватывает естественное любопытство. В этом и состоит цель кода из сквозного примера части I. «Оптимизировать базу кода» — это на первый взгляд так просто. Но при ближайшем рассмотрении код оказывается уже настолько качественным, что многие просто не знают, что еще можно в нем улучшить.
На втором этапе нужно подтолкнуть студентов к уверенному экспериментированию и применению новых знаний. Всю важность этого я осознал во время факультативов по французскому языку. Когда преподавательница хотела научить нас новой фразе, она всегда делала это в три этапа.
Предисловие
Сталкивались ли вы со сложностями чтения литературы по программному обеспечению из-за нагромождения терминологии и запутанных принципов? Возникало ли у вас ощущение, что книга написана для круга посвященных, к которым вы не относитесь?
Так вот, эта книга написана иначе. Материал изложен простым языком и только по самой сути предмета.
Хотя и пособием для начинающих предлагаемая книга тоже не является. Изложение здесь не начинается с азов и утомительных основ программирования, и не стоит рассчитывать на то, что вас бережно проведут через тернии постижения предмета. Я гарантирую, что чтение этой книги станет для вас испытанием, но вполне посильным. Оно пройдет без пугающих сложностей и высокомерного жонглирования терминологией со стороны автора.
Рефакторинг, а именно ему посвящена книга, — это дисциплина, которая нацелена делать из плохого кода хороший без нарушения его функциональности. Если учесть, что существование современного цивилизованного мира уже немыслимо без программного обеспечения, то становится очевидной исключительная актуальность этой темы.
Возможно, вы сочтете подобное утверждение преувеличением, но я буду настаивать на своем. Оглянитесь вокруг. Сколько в данный момент на вашем теле находится процессоров, выполняющих те или иные программы? Часы, телефон, ключи от машины, наушники… сколько их в радиусе 30 метров? Ваша микроволновка, кухонная плита, посудомойка, стиральная машина… автомобиль, наконец.
Сегодня в нашем обществе ничего не происходит без участия программ. Без них уже нельзя ни купить или продать что-либо, ни приготовить еду, ни посмотреть ТВ, ни позвонить друзьям…
А сколько из всех этих программ реально представляют собой хороший код? Подумайте о системах, с которыми работаете в данный момент. Прозрачна ли их реализация, понятна ли эксплуатация? А может, как и большинство других, они представляют собой мешанину, отчаянно жаждущую рефакторинга?
Эта книга рассказывает не о стерильном и отвлеченном рефакторинге, о котором вы могли слышать или читать до этого. Она знакомит вас с реальным рефакторингом в реальных проектах, рефакторингом унаследованных нашим поколением устаревших, но широко распространенных legacy-систем, рефакторингом в таких средах, с которыми мы все сталкиваемся чуть ли не каждый день.
Более того, я не стану никого винить в отсутствии автоматизированного тестирования программ. Ведь очевидно, что большинство унаследованных систем росли, развивались с очень давних пор, поэтому наличием подобных тестов они нас не балуют.
Итак, здесь изложены простые правила, которым вы сможете следовать, чтобы уверенно рефакторить сложные, запутанные, беспорядочные, непротестированные системы. Изучив эти правила и придерживаясь их, вы сможете эффективно улучшить обслуживаемые вами базы кода (совокупности листингов программ).
Но сразу оговорюсь: обучая рефакторингу, автор не вручает вам волшебную палочку. Рефакторинг старого, неработоспособного, непротестированного кода никогда не будет легок. Однако, вооружившись описанными в книге правилами и примерами, вы сможете пробиться через всю запутанность таких систем, разрешить проблемы с их сопровождением, которые долго не давали вам покоя.
