Бертран Мейер. Объектно-ориентированное конструирование программных систем

в 19:40, , рубрики: книги, ооп, Проектирование и рефакторинг, Читальный зал, метки: ,

Бертран Мейер. Объектно ориентированное конструирование программных систем
DISCLAIMER: более навороченной книги по ООП в природе нет и в ближайшее время, скорее всего, не будет; эта книга заслуженно считается классической книгой по объектной технологии и не зря является первой в списке рекомендуемых книг по этой теме (причем она первая не только в моем списке).

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


Когда же речь касается изучения ООП, то здесь проявляется проблема, которую Мейер называет mOOzak effect или buzzword effect. Сводится она к следующему: человек знакомится с некоторым понятием или термином и начинает интенсивно использовать его в повседневной (рабочей) жизни, не придавая значения тому, что сам он его до конца не понимает. Если прислушаться к обсуждениям в коллективе (или на форумах), то можно заметить употребление множества «страшных слов», типа инвариант, инкапсуляция, полиморфизм, ковариантность, контрактное программирование и многие другие, при этом очень часто они могут употребляться без полного понимания того, что же они означают.

Многие знания по ООП мы впитываем через призму изучаемых объектно-ориентированных языков программирования, через неформальные беседы с коллегами, через некоторые идиомы и принципы проектирования или заметки в Вики. Это дает нам понимание основных концепций, поэтому для многих мысль «а не потратить ли мне годик на изучение ООП с помощью фолианта в 1.2К страниц» кажется весьма сомнительной.

Однако зря.

В последнее время появилась тенденция описывать все, что происходит в нашей с вами компьютерной жизни разными метафорами, идиомами и паттернами. Сейчас, если вы не знаете все GoF-овские паттерны, не знакомы с принципами S.O.L.I.D., и не осилили архитектурные паттерны, то вы УГ, которому за проектирование не стоит даже браться. Нисколько не умаляя заслуги всего перечисленного, я отношусь ко всему этому со здоровым прагматизмом. Во-первых, запоминание всех этих принципов и паттернов слишком утомительно, во-вторых, значительно проще получить определенные базовые знания, из которых вытекает многое другое, нежели тренировать память и из года в год стараться запомнить всякие новомодные словечки.

ПРИМЕЧАНИЕ
Именно о пользе таких фундаментальных знаний шла речь заметке Повторное использование знаний. Книга Мейера – это замечательный способ устаканить в голове множество, казалось бы разрозненных фактов, чтобы получить более цельное представление о разработке ПО вообще и об объектной технологии в частности.

Мейер в своей книге упоминает о паттернах проектирования и описывает довольно большое количество принципов. Некоторые из этих принципов довольно известны (например, принцип открыт-закрыт, (‘O’ из принципов SOLID), «это придумано не здесь» (NIH – Not Invented Here), принцип разделения команд и запросов (CQRS – Command-Query separation principle), и т.д.), другие принципы весьма специфичны (например, принцип Унифицированного Доступа, который позволяет обращаться к полю и процедуре одинаковым образом). Но в отличие от многих других книг, ничего из этого не ставится во главу угла, из этого не делается серебряной пули, способной решить все проблемы. Лишь принцип открыт-закрыт упоминается относительно часто, поскольку играет очень важную роль в наследовании – ключевом аспекте ООП.

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

Несколько лет назад из недр Microsoft Research вышла библиотека Code Contracts, которая добавила поддержку контрактного программирования на платформу .NET. Можно прочитать документацию и кучу статей, но некоторые аспекты ее поведения все еще будут непонятными. Конечно, «библиотечный способ реализации» контрактов дает о себе знать, но Code Contracts (как и многие другие реализации «контрактов») практически полностью следует принципам, заложенным в этой книге, так что для их нормального понимания и использования лучшего источника информации, чем первоисточник просто не найти.

То же самое можно сказать и о наследовании. Это весьма непростая техника, которая может помочь в создании понятного, расширяемого и простого в сопровождении ПО, но при неумелом обращении интенсивное использование наследования может привести к тяжеловесным иерархиям, способным под собственной тяжестью похоронить любое приложение. Только лишь правильному использованию наследования уделено 55 страниц, на которых описаны 10 (!) видов наследования (большая часть которых недоступно в таких языках без множественного и закрытого наследования, таких как C# или Java).

Помимо этого есть главы, посвященные персистентности, многопоточному программированию, обучению объектной методологии, культуре повторного использования. Мейер касается даже таких «мирских вопросов» типа правила именования и рекомендации по написанию комментариев (обратите внимание на раздел 26.4 Комментарии в заголовках: упражнение на сокращение).
К великому сожалению у книги есть и ряд недостатков. Первый недостаток – это 1200 страниц с огромным количеством информации на каждой из них. Эту книгу не осилить лежа на диване под любимый сериал или передачу; на нее придется потратить приличное количество усилий, причем не факт, что одного прохода для этого будет достаточно. Книга довольно сухая, формальная и местами довольно жесткая.

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

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

Оценка: MUSTHAVE(*)

З.Ы. Книга доступна на сайте intuit.ru в виде двух курсов: Основы объектно-ориентированного программирования и Основы объектно-ориентированного проектирования.

Ссылка на озон.


(*) На всяк случай поясню, Must Have – это самая высокая оценка книги, которая только может быть; она означает, что книгу не просто нужно прочитать, ее стоит держать под боком на удобном вам носителе и периодически к ней возвращаться.

Автор: SergeyT

Поделиться

* - обязательные к заполнению поля