Пять строк кода. Роберт Мартин рекомендует - Кристиан Клаусен - E-Book

Пять строк кода. Роберт Мартин рекомендует E-Book

Кристиан Клаусен

0,0

Beschreibung

В каждой кодовой базе есть ошибки и слабые места, которые нужно найти и исправить. Правильный рефакторинг сделает ваш код элегантным, удобным для чтения и простым в обслуживании. Познакомьтесь с уникальным подходом, позволяющим реализовать любой метод в пяти строках кода. И не забывайте про тайну, хорошо известную большинству senior-разработчиков: иногда проще ухудшить код и вернуться к его исправлению позже. «Пять строк кода» — это свежий взгляд на рефакторинг для разработчиков любого уровня. Вы узнаете, когда проводить рефакторинг, как использовать паттерны, а также научитесь определять признаки, которые говорят о том, что код необходимо удалить Для разработчиков всех уровней. В примерах используется доступный и понятный синтаксис TypeScript, который позволяет перейти к любому языку высокого уровня.

Sie lesen das E-Book in den Legimi-Apps auf:

Android
iOS
von Legimi
zertifizierten E-Readern
Kindle™-E-Readern
(für ausgewählte Pakete)

Seitenzahl: 355

Veröffentlichungsjahr: 2024

Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:

Android
iOS
Bewertungen
0,0
0
0
0
0
0
Mehr Informationen
Mehr Informationen
Legimi prüft nicht, ob Rezensionen von Nutzern stammen, die den betreffenden Titel tatsächlich gekauft oder gelesen/gehört haben. Wir entfernen aber gefälschte Rezensionen.



Кристиан Клаусен
Пять строк кода. Роберт Мартин рекомендует

Переводчик Д. Брайт

Кристиан Клаусен

Пять строк кода. Роберт Мартин рекомендует. — СПб.: Питер, 2023.

ISBN 978-5-4461-1959-2

© ООО Издательство "Питер", 2022

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

Посвящается моим университетским наставникам, которые говорили мне:

«Секрет постоянного успеха и превосходства в тяжелом ежедневном труде».

Оливье Данвии

«Ты упускаешь суть».

Майер Голдберг

Благодарю вас за то, что научили меня не стараться сделать правильно, а просто делать правильно.

Предисловие

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

Так вот, эта книга написана иначе. Материал изложен простым языком и только по самой сути предмета.

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

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

Возможно, вы сочтете подобное утверждение преувеличением, но я буду настаивать на своем. Оглянитесь вокруг. Сколько в данный момент на вашем теле находится процессоров, выполняющих те или иные программы? Часы, телефон, ключи от машины, наушники… сколько их в радиусе 30 метров? Ваша микроволновка, кухонная плита, посудомойка, стиральная машина… автомобиль, наконец.

Сегодня в нашем обществе ничего не происходит без участия программ. Без них уже нельзя ни купить или продать что-либо, ни приготовить еду, ни посмотреть ТВ, ни позвонить друзьям…

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

Эта книга рассказывает не о стерильном и отвлеченном рефакторинге, о котором вы могли слышать или читать до этого. Она знакомит вас с реальным рефакторингом в реальных проектах, рефакторингом унаследованных нашим поколением устаревших, но широко распространенных legacy-систем, рефакторингом в таких средах, с которыми мы все сталкиваемся чуть ли не каждый день.

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

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

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

Так что рекомендую читать внимательно. Изучайте примеры. Пытайтесь как следует понять, с какой именно целью они приведены. Работайте над усовершенствованием приводимого в книге кода, как это рекомендовано по ходу повествования. На это уйдет время. Это будет раздражать. Это станет испытанием. Но пройдите от начала до конца весь путь, переплывите широкую реку — и будете вознаграждены.

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

Роберт К. Мартин (Дядя Боб)

Введение

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

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

Некоторое время спустя, уже покинув университет, я как-то отдыхал с одним из этих друзей. Нам было скучно, и он спросил, могу ли я сымпровизировать лекцию, как делал это раньше. Я ответил: «Давай попробуем». Мы открыли ноутбук, и я на одном дыхании настрочил то, что, по существу, послужило затем основанием части I этой книги.

Когда я перестал печатать, мой друг был ошеломлен. Он решил, что это будет шуточное представление, но я-то думал иначе. Я действительно хотел научить его рефакторингу.

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

Цель: избранные правила и шаблоны рефакторинга

Совершенство достигнуто не тогда, когда больше нечего добавить, а когда уже нечего убрать.

Антуан де Сент-Экзюпери

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

Нет ничего нового под Солнцем.

Книга Екклесиаста

Я не утверждаю, что вложил в книгу много нового, но считаю, что скомпоновал ее содержание не только интересно, но и эффективно. Многие правила были взяты из книги Роберта К. Мартина «Чистый код»1, но при этом изменены для простоты понимания и применения. Многие шаблоны рефакторинга позаимствованы из книги Мартина Фаулера «Рефакторинг»2, но адаптированы под использование компилятора вместо упора на сильные наборы тестов.

Аудитория и план изложения

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

В части II фокус смещается на контекст применения рефакторинга и адресуется команде разработчиков. Здесь я выбрал наиболее ценные, на мой взгляд, уроки разработки программного обеспечения (ПО) в реальном, а не учебном мире. Некоторые темы состоят в основном из теории, например «Сотрудничайте с компилятором» и «Соблюдайте структуру в коде». Другие же в первую очередь практические, например «Страсть к удалению кода» и «Пусть плохой код выглядит плохо». Таким образом, часть II уже более универсальна, и даже опытные разработчики найдут здесь чему поучиться.

Поскольку во всех главах части I используется один общий пример, они тесно связаны между собой, и предполагается, что читать их будут в предложенной очередности. А вот часть II состоит уже из самостоятельных глав, связанных между собой только некоторыми ссылками из одной на другую. Если у вас нет времени на прочтение всей книги, можете просто выбрать наиболее интересные темы в части II и ознакомиться только с ними.

О преподавании

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

Чтобы побороть эту склонность ума, сначала нужно пробудить мотивацию. Для этого я обычно привожу простое с виду упражнение. Когда студенты понимают, что не могут его выполнить, их охватывает естественное любопытство. В этом и состоит цель кода из сквозного примера части I. «Оптимизировать базу кода» — это на первый взгляд так просто. Но при ближайшем рассмотрении код оказывается уже настолько качественным, что многие просто не знают, что еще можно в нем улучшить.

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

1. Просила каждого повторить эту фразу дословно. На этом этапе чистой имитации мы были вынуждены повторить ее один раз.

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

3. Просила использовать фразу в диалоге. Умение синтезировать нечто новое — это сама цель преподавания, и для этого требуется не только понимание, но и уверенность.

Позже я узнал, что этот подход повторяет японский принцип сюхари из боевых искусств, он сейчас становится все более популярным. Состоит он из трех частей: «сю» означает полную имитацию, когда повторение производится без вопросов и собственного понимания; «ха» уже подразумевает некоторую вариа­цию, то есть выполнение изученного в несколько обновленной форме; «ри» же означает оригинальность, то есть полностью свободное применение, отличное от усвоенного автоматически.

Содержание части I книги полностью построено по принципу сюхари. Я рекомендую сначала следовать правилам без их понимания. Затем, когда вы осознаете их ценность, сможете придумывать вариации. В завершение же, когда освоите их в совершенстве, сможете переходить к пониманию запахов кода. Что касается шаблонов рефакторинга, я буду показывать, как применять каждый из них в коде, и нужно будет за мной повторять (это имитация). Затем те же шаблоны я буду демонстрировать в иных контекстах (стадия вариации), а в завершение предложу рассмотреть другое применение шаблона, призывая вас использовать его самостоятельно (стадия синтеза).

При этом вы сможете воспользоваться книгой для оценки самого процесса и тегами Git для оценки кода. Если же вы не будете отслеживать изменения кода примера и вникать в них, то все описанные действия будут казаться излишними повторениями одного и того же. Поэтому настоятельно советую в процессе чтения части I все же параллельно прорабатывать приводимые в ней примеры на компьютере.

О коде

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

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

Код примеров из этой книги доступен для скачивания на сайте издательства Manning (https://www.manning.com/books/five-lines-of-code), а также в моем репозитории на GitHub (https://github.com/thedrlambda/five-lines).

Дополнительный проект

Чтобы вы могли лучше понять, как использовать приводимые в книге правила и шаблоны рефакторинга, я придумал дополнительный проект. Этот проект более продвинутый, и готовое решение к нему не прилагается. Всех заинтересованных он будет ждать на GitHub: https://github.com/thedrlambda/bomb-guy. Удачи!

1Мартин Р. Чистый код. Создание, анализ и рефакторинг. — Питер, 2021.

2Фаулер М. Рефакторинг.

Благодарности

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

Хочу также выразить глубокую благодарность Роберту К. Мартину. Если кто-то сочтет эту книгу настолько же вдохновляющей, насколько я нахожу твои, то меня это безмерно порадует. Кроме того, я очень признателен за то, что ты не пожалел времени для составления обзора моей работы и решил написать к ней вступительное слово.

Еще одним основным участником создания книги стал дизайнер Ли Макгори. Спасибо тебе! Твои креативность и мастерство вывели уровень иллюстраций на уровень содержания.

Глубочайшие благодарности всем сотрудниками команды Manning. Мой рецензент Эндрю Уолдрон дал потрясающую обратную связь и проявил энтузиазм, в результате чего я и решился работать именно с Manning. Мой редактор-консультант Хелен Стергиус стала моим проводником на пути, потребовавшем невероятных усилий по написанию этой книги. Без ее вдохновения и полезной обратной связи такого уровня результата достичь бы точно не удалось. В качестве технического редактора выступил Марк Элстон, чьи комментарии всегда были мудры и точны. Его взгляд на раскрываемые в книге темы всегда дополнял мой. Благодарю также выпускающего редактора, команду маркетологов и само издательство Manning за сотрудничество и проявленное терпение.

Отдельную благодарность направляю людям, которые выступали наставниками в моей работе. Спасибо Джейкобу Блому. Ты на своем примере научил меня быть технически превосходным консультантом без ущерба для себя и своих ценностей. Твоя страсть к собственной деятельности проявляется в том, что ты способен узнать и вспомнить код, с которым работал десять лет назад, — меня это до сих пор поражает. Спасибо Клаусу Норрегаарду. Твой уровень внутреннего спокойствия и благости восхищает меня. Спасибо Йохану Абильдсков. Я еще не встречал человека с настолько обширными и глубокими техническими знаниями, которые соперничают по своей силе только с твоей добротой. Без тебя эта книга никогда бы так и не покинула заповедные пространства моего жесткого диска. Благодарю также всех, кого я обучал и с кем мне довелось близко работать.

Помимо этого выражаю признательность тем, кто принял участие в подготовке этой книги через обратную связь и бесконечные технические беседы. Я принимал решение проводить время с вами, потому что вы делаете мою жизнь лучше. Спасибо Ганнибалу Кебловски. Твое любопытство породило саму идею написания этой книги. Спасибо Миккелю Крингельбаху. Ты помогал мне всякий раз, когда я просил, тренируя мой интеллект, а также делясь своими идеями и опытом. Все это существенно помогло в создании книги. Спасибо Миккелю Бруну Якобсену. Твоя страсть и уровень компетенции в сфере программного обеспечения вдохновляют меня и подталкивают к совершенствованию. Спасибо всем, кто являлся частью сообщества взаимного обучения. Ваша неутолимая тяга к знаниям заставляла меня продолжать ими делиться. В частности, благодарю Суне Орт Сёренсен, Матиаса Воррейтера Педерсена, Йенса Йенсена, Каспера Фрексена, Матиаса Бака, Фредерика Бринка Трульсена, Кента Григо, Джона Смедегаарда, Ричарда Мёна, Кристофера Нёддебо Кнудсена, Кеннета Хансена, Расмуса Буххольдта и Кристофера Юста Андерсена.

В завершение говорю спасибо всем рецензентам: Бену Макнамара, Билли О’Каллагану, Бонни Малеку, Бренту Хонадель, Чарльзу Ламу, Кристиану Хассельбалху Тудалу, Клайву Харберу, Дэниэлу Васкесу, Дэвиду Тримму, Густаво Филипе Рамосу Гомесу, Джеффу Нойманну, Джоэлу Котарски, Джону Гатри, Джону Норкотту, Картикеяраджану Раджендрану, Киму Кьерсульфу, Луису Му, Марселю ван ден Бринку, Мареку Петаку, Матийсу Аффуртиту, Орландо Мендесу Моралесу, Пауло Нуину, Рональду Харингу, Шону Мехаффи, Себастьяну Ларссону, Серджиу Попа, Тану Ви, Тейлору Долезалу, Тому Мэддену, Тайлеру Коваллису и Убальдо Пескаторе — ваши предложения помогли сделать эту книгу лучше.

Об авторе

Кристиан Клаусен имеет степень магистра компьютерных наук и специализируется на языках программирования, в частности на вопросах качества программного обеспечения и написания кода без ошибок. Кристиан был соавтором двух работ по теме качества программного обеспечения, опубликованных в самых престижных журналах. Он участвовал в проекте Coccinelle для исследовательской группы в Париже в роли инженера ПО, преподавал вводный и продвинутый курс программирования на объектно-ориентированных и функциональных языках в двух университетах, а также пять лет проработал консультантом и техническим руководителем.

Иллюстрация на обложке

Изображение на обложке называется Femme Samojede en habit d’t, то есть «Самоедская женщина в летнем наряде». Эта иллюстрация взята из книги, рассказывающей о нарядах народов разных стран, под названием Costumes Civils Actuels de Tous les PeuplesConnus, подготовленной Жаком Грассе де Сен-Совером (1757–1810) и опубликованной во Франции в 1788 году. Каждая иллюстрация в этом издании тщательно прорисована и раскрашена от руки. Богатое разно­образие экспонатов этой коллекции отчетливо напоминает, насколько велики были культурные различия между городами и регионами мира всего 200 лет назад. Отделенные друг от друга, люди говорили на разных языках и диалектах. На улицах городов или в сельской местности по одеянию человека можно было легко определить, где он живет и какое место в обществе занимает.

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

Во времена, когда сложно отличить одну книгу о программировании от другой, издательство Manning выделяется в компьютерном бизнесе изобретательностью и инициативностью, оформляя обложки своих книг примерами самобытной жизни регионов двухсотлетней давности, возвращенными к жизни Жаком Грассе де Сен-Совером.

От издательства

Ваши замечания, предложения, вопросы отправляйте по адресу [email protected] (издательство «Питер», компьютерная редакция).

Мы будем рады узнать ваше мнение!

На веб-сайте издательства www.piter.com вы найдете подробную информацию о наших книгах.

2. Суть рефакторинга

В этой главе

• Читаемость как средство для передачи намерения.

• Локализация инвариантов для повышения обслуживаемости.

• Ускорение разработки за счет техники внесения изменений путем добавления.

• Внедрение рефакторинга в повседневную работу.

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

2.1. Улучшение читаемости и обслуживаемости

Начнем с повторения определения рефакторинга, которое используем в этой книге: «Рефакторинг — это улучшение кода без изменения его функциональности». Разберем подробнее каждую из двух частей этого определения: «улучшение кода» и «без изменения его функциональности».

2.1.1. Улучшение кода

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

Читаемость

Читаемость — это способность кода передать заложенное в него намерение. То есть если мы предполагаем, что код работает должным образом, то при чтении его самого должно быть легко понять, что именно он делает. Для передачи намерения в коде есть много способов: использование и следование соглашениям; написание комментариев; именование переменных, методов, классов и файлов; использование пробелов и отступов.

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

После подобной чистки кода очевидно, что можно просто написать следующее.

Листинг 2.3. Тот же код в упрощенной форме

function isTrue(bool: boolean) {

  return bool;

}

Обслуживаемость

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

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

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

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

Причиной этой хрупкости обычно является глобальное состояние. Здесь глобальное означает «находящееся вне рассматриваемой области и категории». С точки зрения метода глобальными являются поля. Принцип состояния, в свою очередь, чуть более абстрактен. Состояние — это «все, что может изменяться в процессе выполнения программы». Сюда входят все переменные, содержимое базы данных, файлы на жестком диске и само оборудование. (Технически даже намерение пользователя и вся реальность в некотором смысле представляют собой состояние, просто для наших целей они неважны.)

Для простоты при работе можно определять глобальное состояние по фигурным скобкам: {...}. Все находящееся вне этих скобок считается глобальным состоянием по отношению к тому, что находится внутри них.

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