Объектно-ориентированный подход. Объектно_ориентированный_подход. Объектно ориентированный подход Мэтт Вайсфельд 5е международное издание ббк 32. 973. 2018
Скачать 5.43 Mb.
|
Глава 8. Фреймворки.и.повторное.использование:.проектирование. с.применением.интерфейсов.и.абстрактных.классов........................................162 Код:.использовать.повторно.или.нет?..........................................................162 Что.такое.фреймворк?.................................................................................163 Что.такое.контракт?......................................................................................166 Абстрактные.классы................................................................................166 Интерфейсы............................................................................................170 Связываем.все.воедино..........................................................................172 Код,.выдерживающий.проверку.компилятором.......................................175 Заключение.контракта............................................................................176 Системные.«точки.расширения».............................................................179 11 .Оглавление. Пример.из.сферы.электронного.бизнеса.....................................................179 Проблема,.касающаяся.электронного.бизнеса.......................................179 Подход.без.повторного.использования.кода...........................................180 Решение.для.электронного.бизнеса........................................................183 Объектная.модель.UML...........................................................................183 Резюме........................................................................................................188 Ссылки.........................................................................................................188 Глава 9. Создание.объектов.и.объектно-ориентированное.проектирование....189 Отношения.композиции...............................................................................190 Поэтапное.создание....................................................................................191 Типы.композиции.........................................................................................194 Агрегации...............................................................................................194 Ассоциации.............................................................................................195 Использование.ассоциаций.в.сочетании.с.агрегациями..........................196 Избегание.зависимостей.............................................................................197 Кардинальность...........................................................................................198 Ассоциации,.включающие.множественные.объекты................................200 Необязательные.ассоциации..................................................................202 Связываем.все.воедино:.пример..................................................................203 Резюме........................................................................................................204 Ссылки.........................................................................................................204 Глава 10. Паттерны.проектирования................................................................205 Чем.хороши.паттерны.проектирования?.......................................................206 Схема.«Модель.—.Представление.—.Контроллер».в.языке.Smalltalk.............207 Типы.паттернов.проектирования..................................................................209 Порождающие.паттерны.........................................................................210 Структурные.паттерны............................................................................215 Паттерны.поведения...............................................................................218 Антипаттерны...............................................................................................219 Заключение..................................................................................................221 Ссылки.........................................................................................................221 12 .Оглавление Глава 11. Избегание.зависимостей.и.тесно.связанных.классов........................222 Композиция.против.наследования.и.внедрения.зависимостей....................225 1..Наследование.....................................................................................225 2..Композиция.........................................................................................227 Внедрение.зависимостей.......................................................................230 Внедрение.с.помощью.конструктора.......................................................232 Заключение..................................................................................................233 Ссылки.........................................................................................................233 Глава 12. Принципы.объектно-ориентированного.проектирования.SOLID........234 Принципы.объектно-ориентированной.разработки.SOLID............................236 1..SRP:.принцип.единственной.ответственности.....................................236 2..OCP:.принцип.открытости/закрытости................................................239 3..LSP:.принцип.подстановки.Лисков.......................................................242 4..ISP:.принцип.разделения.интерфейса.................................................245 5..DIP:.принцип.инверсии.зависимостей.................................................246 Заключение..................................................................................................253 Ссылки.........................................................................................................253 Об обложке ................................................................................ 254 Шэрон, Стейси, Стефани и Пауло БЛАГОДАРНОСТИ Как и в случае с первыми четырьмя изданиями, эта книга потребовала совмест- ных усилий многих людей. Я хотел бы поблагодарить как можно больше этих людей, поскольку без их помощи книга никогда бы не увидела свет. Прежде всего, хотелось бы выразить благодарность моей жене Шэрон за помощь. Она не только поддерживала и подбадривала меня во время длительного на- писания книги, но и выступила в роли первого редактора черновиков. Я также хотел бы поблагодарить маму и других членов моей семьи за их по- стоянную поддержку. Трудно поверить в то, что работа над первым изданием этой книги началась еще в 1998 году. На протяжении работы над всеми пятью изданиями мне было очень приятно сотрудничать с ребятами из компании Pearson. А работа с такими ре- дакторами, как Марк Тэбер (Mark Taber) и Тоня Симпсон (Tonya Simpson), принесла мне массу удовольствия. Выражаю особую благодарность Джону Апчерчу (Jon Upchurch) за проверку большей части приведенного в этой книге кода, а также за научное редактиро- вание рукописи. Его обширные познания в технических областях оказали не- оценимую помощь. И наконец, спасибо моим дочерям Стейси и Стефани, а также коту Пауло за то, что постоянно держат меня в тонусе. ОБ АВТОРЕ Мэтт Вайсфельд — профессор колледжа, разработчик программного обеспече- ния и автор. Проживает в Кливленде, штат Огайо. Прежде чем стать штатным преподавателем, Мэтт 20 лет проработал в индустрии информационных техно- логий разработчиком ПО, занимая должность адъюнкт-профессора, вел пред- принимательскую деятельность. Имеет степень магистра MBA и computer science. Помимо первых четырех изданий книги «Объектно-ориентированный подход», написал еще две книги на тему разработки программного обеспечения, а также опубликовал множество статей в таких журналах, как developer.com, Dr. Dobb’s Journal, The C/C++ Users Journal, Software Development Magazine, Java Report и международном журнале Project Management. Авторские права на иллюстрации Рисунок 8.1, скриншот Microsoft Word, © Корпорация Microsoft, 2019. Рисунок 8.2, скриншот документации API, © Корпорация Oracle, 1993, 2018. От издательства Ваши замечания, предложения и вопросы отправляйте по адресу электронной почты comp@piter.com (издательство «Питер», компьютерная редакция). Мы будем рады узнать ваше мнение! На сайте издательства http://www.piter.com вы найдете подробную информацию о наших книгах. ВВЕДЕНИЕ Как следует из названия, эта книга посвящена объектно-ориентированному подходу. Хотя выбор темы и названия книги является важным решением, оно оказывается совсем не простым, когда речь идет о концептуальной теме. Во многих книгах рассматривается тот или иной уровень программирования и объ- ектной ориентации. В отдельных популярных книгах охватываются темы, в число которых входят объектно-ориентированный анализ, объектно-ориен- тированное проектирование, шаблоны проектирования, объектно-ориентиро- ванные данные (XML), унифицированный язык моделирования Unified Modeling Language (UML), объектно-ориентированная веб-разработка (в том числе мобильная), различные объектно-ориентированные языки программиро- вания и многие другие темы, связанные с объектно-ориентированным програм- мированием (ООП). Однако при чтении таких книг многие люди забывают, что все эти темы бази- руются на одном фундаменте: важно, как вы мыслите объектно-ориентирован- ным образом. Зачастую бывает так, что многие профессионалы в области соз- дания программного обеспечения, а также студенты начинают читать эти книги, не потратив достаточно времени и усилий на то, чтобы действительно разо- браться в концепциях проектирования, кроющихся за кодом. Я считаю, что освоение объектно-ориентированных концепций не сводится к изучению конкретного метода разработки, языка программирования или на- бора инструментов проектирования. Работа в объектно-ориентированном стиле является образом мышления. Эта книга всецело посвящена объектно- ориентированному мышлению. Отделение языков программирования, методик и инструментов разработки от объектно-ориентированного мышления — нелегкая задача. Зачастую люди знакомятся с объектно-ориентированными концепциями, «ныряя» с головой в тот или иной язык программирования. Например, какое-то время назад мно- гие программисты на C впервые столкнулись с объектной ориентацией, перей- дя прямо на C++ еще до того, как они хотя бы отдаленно познакомились с объ- ектно-ориентированными концепциями. Важно понимать значительную разницу между изучением объектно-ориенти- рованных концепций и программированием на объектно-ориентированном языке. Я четко осознал это до того, как начал работать еще над первым издани- ем данной книги, когда прочитал статью, написанную Крейгом Ларманом (Craig 17 Введение. . Larman) What the UML Is — and Isn’t («Что такое UML и чем он не является»). В этой статье он пишет: К сожалению, в контексте разработки программного обеспечения и язы- ка UML, позволяющего создавать диаграммы, умение читать и писать UML-нотацию, похоже, иногда приравнивается к навыкам объектно- ориентированного анализа и проектирования. Конечно, на самом деле это не так, и последнее из упомянутого намного важнее, чем первое. Поэтому я рекомендую искать учебные курсы и материалы, в которых приобрете- нию интеллектуальных навыков в объектно-ориентированном анализе и проектировании придается первостепенное значение по сравнению с написанием UML-нотации или использованием средств автоматизиро- ванной разработки программного обеспечения. Таким образом, несмотря на то что изучение языка моделирования является важным шагом, намного важнее сначала приобрести объектно-ориентированные навыки. Изучение UML до того, как вы полностью разберетесь в объектно-ори- ентрованных концепциях, аналогично попытке научиться читать электрические схемы, изначально ничего не зная об электричестве. Та же проблема возникает с языками программирования. Как отмечалось, мно- гие программисты на С ушли в область объектной ориентации, перейдя на С ++, прежде чем соприкоснуться с объектно-ориентированными концепциями. Это всегда обнаруживается в процессе собеседования. Довольно часто разработчи- ки, которые утверждают, что они программисты на C ++, являются просто про- граммистами на C, использующими компиляторы C ++. Даже сейчас, с такими хорошо зарекомендовавшими себя языками, как C # .NET, VB .NET, Objective-C, Swift и Java, ключевые вопросы во время собеседования при приеме на работу могут быстро выявить сложности в понимании объектно-ориентированных концепций. Ранние версии Visual Basic не являются объектно-ориентированными. Язык C тоже не объектно-ориентированный, а C++ разрабатывался как обратно со- вместимый с ним. По этой причине вполне возможно использовать компиля- тор C++ при написании синтаксиса на C, но отказавшись от всех объектно-ори- ентированных свойств C++. Язык Objective-C создавался как расширение стандартного языка ANSI C. Что еще хуже, программисты могут применять ровно столько объектно-ориентированных функций, сколько нужно для того, чтобы сделать приложения непонятными для остальных программистов, как использующих, так и не использующих объектно-ориентированные языки. Таким образом, жизненно важно, чтобы вы, приступая к изучению того, как пользоваться средами объектно-ориентированной разработки, сначала освоили фундаментальные объектно-ориентированные концепции. Не поддавайтесь искушению сразу перейти непосредственно к языку программирования, снача- ла уделите время освоению объектно-ориентированного мышления. .Введение 18 Что нового в пятом издании Как часто отмечалось во введении к предыдущим изданиям, мое видение перво- го издания заключалось в том, чтобы придерживаться концепций, а не сосре- доточиваться на конкретной новейшей технологии. Несмотря на следование такому же подходу в пятом издании, я стараюсь привести больше «контраргу- ментов», чем в предыдущих четырех изданиях. Этим я даю понять, что хотя объектно-ориентированная разработка, несомненно, имеет важнейшее значение, не стоит ограничивать лишь ею свое внимание. Поскольку книга была впервые издана в 1999 году, за прошедшее время успели появиться многие технологии, а некоторые были вытеснены. В те времена язык Java только находился в начале своего становления и был главным языком в сфере объектно-ориентированного программирования. В скором времени веб-страницы уже являлись неотъемлемой частью личной и деловой жизни. И нам хорошо известно, насколько повсеместными стали мобильные устройства. За последние 20 лет разработчики программ столкнулись с XML, JSON, CSS, XSLT, SOAP и RESTful Web Services. В устройствах Android используется Java и, уже, Kotlin, а в iOS — Objective C и Swift. Хочу обратить внимание на то, что за 20 лет (и четыре издания книги) мы ох- ватили много различных технологий. В этом издании я ставлю себе основной задачей сконцентрировать весь предыдущий материал и вернуться к изначаль- ному замыслу первого издания — концепциям объектно-ориентированного программирования. Мне приятно считать, что каким бы ни был успех первого издания книги, он связан с тем, что оно было сосредоточено на самих концеп- циях. Мы, в некотором роде, прошлись по кругу, потому что настоящее издание включает в себя все технологии, которые были упомянуты. Наконец, концепции, которые объединяют все эти технологии в методику про- ектирования, описываются принципами SOLID. Ими пронизана каждая глава этого издания, а также две новые главы в конце. Пять принципов SOLID: SRP — принцип единственной ответственности (Single Responsibility Principle). OCP — принцип открытости/закрытости (Open/Close Principle). LSP — принцип подстановки Барбары Лисков (Liskov Substitution Principle). ISP — принцип разделения интерфейса (Interface Segregation Principle). DIP — принцип инверсии зависимостей (Dependency Inversion Principle). В первых девяти главах я расскажу о принципах объектно-ориентированного программирования, которые считаю классическими. Последние три главы по- священы паттернам проектирования, избеганию зависимостей и понятию 19 Целевая.аудитория. . SOLID, которое построено на классических принципах и предполагает четко определенную методику. Целевая аудитория Эта книга представляет собой общее введение в фундаментальные концепции объектно-ориентированного программирования. Понятие концепции важно, по- тому что хотя весь материал темы для наглядности сопровождается кодом, глав- ная цель книги — познакомить читателя с азами объектно-ориентированного мышления. Немаловажно для программистов и понимание того, что объектно- ориентированное программирование не представляет собой какой-то отчетливой парадигмы (пускай многие в это и верят), но является лишь частью обширного инструментария для современных разработчиков программного обеспечения. Когда в 1995-м был подготовлен начальный материал для первого издания, объ- ектно-ориентированное программирование только появилось. Я могу так сказать потому, что, помимо немногих объектно-ориентированных языков вроде Smalltalk, настоящих языков объектно-ориентированного программирования в то время не существовало. C++, где применение объектно-ориентированных конструкций не- обязательно, был доминирующим языком программирования, основанным на C. Первый релиз Java 1.0 состоялся в 1996 году, а C# — в 2002-м. Собственно, когда вышло первое издание этой книги в 1999 году, никто не мог быть уверен, что объ- ектно-ориентированное программирование действительно станет ведущей пара- дигмой среди разработчиков (Java 2 вышел только в декабре 1998-года). Несмотря на доминирование в настоящее время, объектно-ориентированное программиро- вание не лишено некоторых любопытных изъянов, к которым мы еще вернемся. Итак, аудитория этой книги сейчас отличается от аудитории первого издания. С 1995 и вплоть до 2010 года я в основном обучал структурных программистов искусству объектно-ориентированного программирования. Подавляющее боль- шинство моих учеников набирали опыт на COBOL, FORTRAN, C и VB как во время учебы, так и на работе. Сегодняшние ученики, которые выпускаются из заведений, пишут видеоигры, создают сайты или мобильные приложения, прак- тически уже научились писать программы на объектно-ориентированных язы- ках. Из этого следует, что подход пятого издания значительно отличается от того, что был в первом, втором и последующих. Вместо того чтобы обучать структурных программистов разработке на объектно-ориентированных языках, сейчас нам нужно обучать поколение программистов, выросших на таких языках. Целевая аудитория этой книги включает проектировщиков, разработчиков, про- граммистов и менеджеров проектов, дизайнеров, проще говоря, всех желающих получить общее представление о том, что такое объектно-ориентированное про- граммирование. Я очень надеюсь на то, что прочтение этой книги создаст прочную основу для перехода к материалам, затрагивающим более продвинутые темы. |