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

КДПВ

Каждый раз, когда начинаю читать книгу неизвестного автора, стараюсь познакомиться с его бэкграундом и на этот раз автор немного удивил. Оказалось, что он где-то в 2015 году издал целую серию книг, посвященных тестированию, разработке через тестирование и просто введению по нескольким языкам, включая PHP, Ruby и C. Чуть позже он издал книгу “Эффективное тестирование программного обеспечения” и она даже есть у меня в библиотеке! Не знаю, когда до неё доберусь, но думаю что скоро. В принципе, мне понравилась эта работа автора.

Скажу сразу, что опытные разработчики тут не найдут ничего нового для себя. Мне же она понравилась по тому, что я более-менее знаю Perl, но совершенно не знаком с Java и при этом пробую написать простую игрушку на этом языке. И конечно же, в процессе написания прошелся по всем граблям, о которых пишет Маурисио. Надо отметить, что в книге примеры кода написаны на псевдоязыке, который только похож на Java, но это мелочи.

Автор выделяет управлению сложностью, как ключевой момент в проектировании и для этого самого управления сложностью он выделяет следующие ключевые пункты, которые рассматриваются дальше, каждый в отдельной главе:

  • простой код;
  • консистентные объекты;
  • качественное управление зависимостями;
  • хорошие абстракции;
  • правильная работа с внешними зависимостями и инфраструктурой;
  • продуманная модульность;

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

Что касается консистентности объектов, то я так же столкнулся с этой проблемой. Например, добавил некие хранилище всех объектов, которые находятся на игровом поле. Что бы добавил или удалить объект, пришлось использовать методы этого хранилища, при этом добавлять отдельный метод, который бы синхронизировал состояние после каждого игрового цикла, иначе консистентность нарушалась. Другими словами, три проблемы из трех первых глав меня коснулись практически сразу же. Третья проблема - это упрощение кода, но тут я быстро нашел подходящий плагин SonarQube, который бы следил за “сложностью методов” (речь о Cyclomatic Complexity и Cognitive Complexity и прочими метриками, следить за которыми уже научились автоматически). После чего пришлось потратить целый день на то, что бы провести рефакторинг и избавиться от всех предупреждений :)

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

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

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

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

Если подумать, как изменился мой подход к проектированию после книги, то я бы отметил в первую очередь то, что уже есть инструменты, которые могут мягко указывать на появляющиеся проблемы и их обязательно надо подключать как можно раньше. Лишний раз убедился, что более-менее правильно понимаю процесс проектирования, что тоже является плюсом. В процессе чтения несколько раз встречалась ссылка на ресурс о рефакторинге: - https://refactoring.guru/ru, надо будет его изучить отдельно. Так же встретил ссылку на инструмент ArchUnit, как говорится в описании A Java architecture test library. Тоже отметил, что надо будет изучить со временем. В книге много отсылок к Martin Fowler, Sam Newman, Eric Evans и пр., наверняка найдется что-то интересное. В конце книги есть отдельный пункт, который посвящен ссылкам на книги для дальнейшего изучения темы. В целом, с ссылками на дополнительные материалы тут вообще всё хорошо, и причем большая часть материалов уже была переведена и издана в том же “Питере”, например.

Что касается качества издания, но это совершенно небольшая брошюра на 200 страниц, с мягкой обложкой и полностью повторяет, например, серию книг “Грокаем…”. С качеством издания, в общем, все хорошо.


Автор(ы):

  • Mauricio Aniche

Год издания: 2025
Количество страниц: 224
Оценка: 4/5

Издатель: Питер
Ссылка на страницу книги на сайте издательства: https://www.piter.com/collection/all/product/prostoe-obektno-orientirovannoe-proektirovanie-chistyy-i-gibkiy-kod

Оригинальное название: Simple Object-Oriented Design: Create clean, maintainable applications
Год издания оригинала: 2024