понедельник, 19 марта 2012 г.

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

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

Основная сложность при изучении объектно-ориентированного программирования (или любой другой парадигмы программирования) заключается в том, что весьма сложно подобрать формальные критерии, которые бы сказали: «ок, теперь я знаю ООП и стану писать более клевые (читай модульные, реюзабельные и легкие в сопровождении) программы». Например, при изучении языков программирования мы относительно быстро замечаем, опа, 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 лет в него не внесли никаких концептуальных изменений, говорит о том, что язык с самого начала был очень хорошо продуман. Но поскольку большинство современных ОО-языков не поддерживают некоторые ключевые ОО-возможности (с точки зрения Мейера), то далеко не все описываемые концепции удастся пощупать на практике (в основном это касается отсутствия множественного наследования и проектирования по контракту).

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

Оценка: MUST HAVE (*)

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

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

------------------------

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

14 комментариев:

  1. На Интуите полная версия книги?

    ОтветитьУдалить
  2. Я там пару глав пролистывал, вроде бы да, полная.

    ОтветитьУдалить
  3. Не совсем согласен, что народ использует "новомодные" словечки, не понимая их смысла. Программисты - народ дотошный. Если сам не понимаешь, другому объяснить не сможешь. Тут просто - если ты слышал о "каких-то" принципах и употребляешь их в работе - придется объяснять, что они значат. Я к чему - программистов, которые знают паттерны, "принципы" и.т.д. имеют лучший базис для написания "правильного кода". Программисты не обладающие этими знаниями могут писать "правильный" код, но это будут скорее сильно outstanding ребята. Другими словами все эти новомодные штучки при правильном использовании дают весомое преимущество разработчику(... даже на собеседовании :)).

    ОтветитьУдалить
  4. Для меня удивительно, что занимаясь программированием не первый год, я только узнаю об этой книге.
    Если щёлкнуть по Вашей ссылке на Ozon, то 80 или 90% в разделе "Купившие этот товар также покупают" у меня есть. А этой нет, спасибо :)

    ОтветитьУдалить
  5. @t0rch: ИМО, это одна из самых недооцененных книг по Computer Science. Даже о SICP говорят на порядок больше (хотя уверен, что осиливших эту книгу единицы), а вот о книге Мейера даже на stackoverflow и то не много упоминаний.

    ОтветитьУдалить
  6. @eugene: сори за задержку с ответом:(

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

    ОтветитьУдалить
  7. @Sergey Teplyakov, да, SICP у меня есть, но действительно, ни первая, ни вторая и пятая попытки прочитать её не закончились пока для меня успешно.
    Единственное, я не понял, на Интуите, под двумя ссылками, одна и та же книга (хотя размер у файлов отличается)?

    ОтветитьУдалить
  8. @t0rch: на интуите книга Мейера просто разбита на две части.

    ОтветитьУдалить
  9. Этот комментарий был удален автором.

    ОтветитьУдалить
  10. Очень много отсылок к Perl (причём книга старая, из времён Windows 2000). Интересно, его до сих пор используют для подобных задач? Или появились новые инструменты?

    ОтветитьУдалить
  11. @Rikki: вы ничего не перепутали? О каких перлах идет речь?

    ОтветитьУдалить
  12. Перепутал с Pragmatic Programmer (одновременно читать начал) :(

    ОтветитьУдалить
  13. @Rikki: странно, в программисте-прагматике я тоже не помню такого уж большого количества отсылок к перлу. Честно. Читал я ее года три назад, но она вся у меня лежит где-то на полке утыканная закладками и изрисованная вдоль и поперек и я чего-то не помню, чтобы перлу там было уделено хоть какое-то серьезное внимание.

    ОтветитьУдалить
  14. @Sergey Teplyakov

    Там он приводится как типичный скриптовый язык. И самая свежая из упомянутых в книге OS - Windows 2000.

    ОтветитьУдалить