Продолжаем карнавал веселья и кода. Мы сделали работающую версию автомата. Но так ли она хороша? Я сейчас говорю не про техническую реализацию, а про стилистику кода и удобства работы с ним. Сейчас автомат представлен как монолитный блок кода, который наполнен дублированием, смешиванием ответственностей и неясностью происходящего.
Наша работа сейчас будет заключаться в функциональной декомпозиции. Мы попробуем разобрать нашу программу на набор функций, которые создадут нам слои абстракции и мы опишем в паре движений всю логику на верхнем уровне.
Ваша задача формируется очень просто, но слишком размыто.
Вам нужно:
- Избавиться от дублирующегося кода;
- Сделать программу понятней;
- Сокрыть структуру данных и тонкости работы с ней;
Давайте разберёмся с каждым из пунктов по отдельности.
Избавиться от дублирующегося кода
Когда у вас есть два идентичных участка кода вам необходимо их ликвидировать. Как я писал выше, достаточно всего одного дублирования для решительных действий. В нашем коде полно таких моментов которые впоследствии испортят нам настроение и самое главное замедлят разработку.
В программу мы очень часто вносим изменения и наш код образует определённую логику. Каждый раз, когда эта логика меняется под влиянием изменений бизнес-процессов, нам приходится изменять N участков кода. В случае с небольшими блоками и при маленьких N – это сделать не так уж сложно.
Но основная проблема заключается в том, что можно забыть изменить тот или иной участок. Логика без строго выраженной формы размывается по кодовой базе и можно забыть о её наличие в том или ином участке.
Итак, дублирование плохо потому, что:
- Сложней вносить изменения в программу ;
- Безосновательно увеличивает кодовую базу ;
- Дубли могут вносить новые аспекты в выполнение, которые будут скрыты от понимания из-за совпадения большей части кода (вспомнить детские ребусы – найди 10 отличий).
Что считается дубликатом? Код можно назвать дублирующимся по нескольким причинам. Так, например, в простейшем смысле, код дублируется, если происходит посимвольное совпадение. Но это не единственный случай. Код может дублироваться алгоритмически, при этом операции могут происходить над разными данными и с разными константами. Такое находить по началу сложней, и наша задача к этому привыкнуть.
Избавиться от дубликатов достаточно просто. Нам нужно извлечь метод (функцию), а все различающиеся данные вынести в параметры оставив внутри общий алгоритм.
Сделать программу понятней
Это одна их самых важных задач программиста. Не всегда, но зачастую. У нас командная работа, а также наша работа базируется на разработках других программистов. И если бы API их разработок не было понятным, у нас возникало бы много трудностей при разработке.
Каждый раз, когда вы используете какую-нибудь библиотеку или даже базовые возможности языка C#, который в большей степени обеспечивается BCL (Base Class Library), задумайтесь о том, что это тоже некоторая кодовая база, с которой вы работаете и программисты, которые её разрабатывали, учитывали то, что вы будете работать с этим. И чем лучше они это делали, тем проще и комфортней работать вам.
При разработке своего кода учитывайте, что вы, скорей всего, забудете о том, как он работает и вам придётся разбираться с ним снова. И очень хорошо было бы упростить жизнь будущему себе. Я также надеюсь, что вы в ближайшее время начнете работать в команде и на основе вашего кода будут разрабатывать свои решения ваши коллеги. Вам повезет, если это будут мудрые, живущие в гармонии с собой и миром люди, транслирующие в мир любовь.
И не повезёт, если это будут психопаты, знающие, где вы живёте.
Есть один метод, который позволяет ответить на вопрос: “Стал ли мой код понятней?”, он заключается в задаче вопросов себе или другим людям, плохо знакомым с кодом, но знакомым со спецификой вашей программы.
Можно задавать такие вопросы:
- Сколько времени прошло от момента перевода взгляда на код, до момента когда была найдена нужная точка?
- Читается ли код также хорошо, как книга писателя прозы средней руки?
- Можно ли читать код не мотая головой вверх и вниз? Понятен ли он вне контекста или на сколько этот контекст важен?
Сокрыть структуру данных и тонкости работы с ней
Вы должны были заметить, что у нас есть некая сущность товара, которая описывает его стоимость, название и доступный остаток. Она представляется тремя массивами, которые не объединены друг с другом. А это значит, что при работе с товарами мы можем добавить название товара, но забыть добавить ему количество, что приведет к различным ошибкам. Более детально мы это проработаем дальше, сейчас же хотелось спрятать эти массивы и дать более очевидные методы работы с базой товаров.