Erhalten Sie Zugang zu diesem und mehr als 300000 Büchern ab EUR 5,99 monatlich.
Объектно-ориентированное программирование (ООП) лежит в основе языков C++, Java, C#, Visual Basic .NET, Ruby, Objective-C и даже Swift. Не могут обойтись без объектов веб-технологии, ведь они используют JavaScript, Python и PHP. Именно поэтому Мэтт Вайсфельд советует выработать объектно-ориентированное мышление и только потом приступать к объектно-ориентированной разработке на конкретном языке программирования. Эта книга написана разработчиком для разработчиков, и позволяет выбрать оптимальные подходы для решения конкретных задач. Вы узнаете, как правильно применять наследование и композицию, поймете разницу между агрегацией и ассоциацией и перестанете путать интерфейс и реализацию. Технологии программирования непрерывно меняются и развиваются, но объектно-ориентированные концепции не зависят от платформы и остаются неизменно эффективными. В этом издании основное внимание уделяется фундаментальным основам ООП: паттернам проектирования, зависимостям и принципам SOLID, которые сделают ваш код понятным, гибким и хорошо сопровождаемым.
Sie lesen das E-Book in den Legimi-Apps auf:
Seitenzahl: 285
Veröffentlichungsjahr: 2024
Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:
Переводчик И. Сигайлюк
Технический редактор М. Петруненко
Литературные редакторы М. Петруненко, А. Руденко
Художник В. Мостипан
Корректор Н. Викторова
Верстка Л. Егорова
Мэтт Вайсфельд
Объектно-ориентированный подход. 5-е межд. изд.. — СПб.: Питер, 2021.
ISBN 978-5-4461-1431-3
© ООО Издательство "Питер", 2021
Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав.
Шэрон, Стейси, Стефани и Пауло
Как и в случае с первыми четырьмя изданиями, эта книга потребовала совместных усилий многих людей. Я хотел бы поблагодарить как можно больше этих людей, поскольку без их помощи книга никогда бы не увидела свет.
Прежде всего, хотелось бы выразить благодарность моей жене Шэрон за помощь. Она не только поддерживала и подбадривала меня во время длительного написания книги, но и выступила в роли первого редактора черновиков.
Я также хотел бы поблагодарить маму и других членов моей семьи за их постоянную поддержку.
Трудно поверить в то, что работа над первым изданием этой книги началась еще в 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.
Ваши замечания, предложения и вопросы отправляйте по адресу электронной почты [email protected] (издательство «Питер», компьютерная редакция).
Мы будем рады узнать ваше мнение!
На сайте издательства http://www.piter.com вы найдете подробную информацию о наших книгах.
Как следует из названия, эта книга посвящена объектно-ориентированному подходу. Хотя выбор темы и названия книги является важным решением, оно оказывается совсем не простым, когда речь идет о концептуальной теме. Во многих книгах рассматривается тот или иной уровень программирования и объектной ориентации. В отдельных популярных книгах охватываются темы, в число которых входят объектно-ориентированный анализ, объектно-ориентированное проектирование, шаблоны проектирования, объектно-ориентированные данные (XML), унифицированный язык моделирования Unified Modeling Language (UML), объектно-ориентированная веб-разработка (в том числе мобильная), различные объектно-ориентированные языки программирования и многие другие темы, связанные с объектно-ориентированным программированием (ООП).
Однако при чтении таких книг многие люди забывают, что все эти темы базируются на одном фундаменте: важно, как вы мыслите объектно-ориентированным образом. Зачастую бывает так, что многие профессионалы в области создания программного обеспечения, а также студенты начинают читать эти книги, не потратив достаточно времени и усилий на то, чтобы действительно разобраться в концепциях проектирования, кроющихся за кодом.
Я считаю, что освоение объектно-ориентированных концепций не сводится к изучению конкретного метода разработки, языка программирования или набора инструментов проектирования. Работа в объектно-ориентированном стиле является образом мышления. Эта книга всецело посвящена объектно-ориентированному мышлению.
Отделение языков программирования, методик и инструментов разработки от объектно-ориентированного мышления — нелегкая задача. Зачастую люди знакомятся с объектно-ориентированными концепциями, «ныряя» с головой в тот или иной язык программирования. Например, какое-то время назад многие программисты на C впервые столкнулись с объектной ориентацией, перейдя прямо на C++ еще до того, как они хотя бы отдаленно познакомились с объектно-ориентированными концепциями.
Важно понимать значительную разницу между изучением объектно-ориентированных концепций и программированием на объектно-ориентированном языке. Я четко осознал это до того, как начал работать еще над первым изданием данной книги, когда прочитал статью, написанную Крейгом Ларманом (Craig 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. Что еще хуже, программисты могут применять ровно столько объектно-ориентированных функций, сколько нужно для того, чтобы сделать приложения непонятными для остальных программистов, как использующих, так и не использующих объектно-ориентированные языки.
Таким образом, жизненно важно, чтобы вы, приступая к изучению того, как пользоваться средами объектно-ориентированной разработки, сначала освоили фундаментальные объектно-ориентированные концепции. Не поддавайтесь искушению сразу перейти непосредственно к языку программирования, сначала уделите время освоению объектно-ориентированного мышления.
Как часто отмечалось во введении к предыдущим изданиям, мое видение первого издания заключалось в том, чтобы придерживаться концепций, а не сосредоточиваться на конкретной новейшей технологии. Несмотря на следование такому же подходу в пятом издании, я стараюсь привести больше «контраргументов», чем в предыдущих четырех изданиях. Этим я даю понять, что хотя объектно-ориентированная разработка, несомненно, имеет важнейшее значение, не стоит ограничивать лишь ею свое внимание.
Поскольку книга была впервые издана в 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).
В первых девяти главах я расскажу о принципах объектно-ориентированного программирования, которые считаю классическими. Последние три главы посвящены паттернам проектирования, избеганию зависимостей и понятию SOLID, которое построено на классических принципах и предполагает четко определенную методику.
Эта книга представляет собой общее введение в фундаментальные концепции объектно-ориентированного программирования. Понятие концепции важно, потому что хотя весь материал темы для наглядности сопровождается кодом, главная цель книги — познакомить читателя с азами объектно-ориентированного мышления. Немаловажно для программистов и понимание того, что объектно-ориентированное программирование не представляет собой какой-то отчетливой парадигмы (пускай многие в это и верят), но является лишь частью обширного инструментария для современных разработчиков программного обеспечения.
Когда в 1995-м был подготовлен начальный материал для первого издания, объектно-ориентированное программирование только появилось. Я могу так сказать потому, что, помимо немногих объектно-ориентированных языков вроде Smalltalk, настоящих языков объектно-ориентированного программирования в то время не существовало. C++, где применение объектно-ориентированных конструкций необязательно, был доминирующим языком программирования, основанным на C. Первый релиз Java 1.0 состоялся в 1996 году, а C# — в 2002-м. Собственно, когда вышло первое издание этой книги в 1999 году, никто не мог быть уверен, что объектно-ориентированное программирование действительно станет ведущей парадигмой среди разработчиков (Java 2 вышел только в декабре 1998-года). Несмотря на доминирование в настоящее время, объектно-ориентированное программирование не лишено некоторых любопытных изъянов, к которым мы еще вернемся.
Итак, аудитория этой книги сейчас отличается от аудитории первого издания.
С 1995 и вплоть до 2010 года я в основном обучал структурных программистов искусству объектно-ориентированного программирования. Подавляющее большинство моих учеников набирали опыт на COBOL, FORTRAN, C и VB как во время учебы, так и на работе. Сегодняшние ученики, которые выпускаются из заведений, пишут видеоигры, создают сайты или мобильные приложения, практически уже научились писать программы на объектно-ориентированных языках. Из этого следует, что подход пятого издания значительно отличается от того, что был в первом, втором и последующих. Вместо того чтобы обучать структурных программистов разработке на объектно-ориентированных языках, сейчас нам нужно обучать поколение программистов, выросших на таких языках.
Целевая аудитория этой книги включает проектировщиков, разработчиков, программистов и менеджеров проектов, дизайнеров, проще говоря, всех желающих получить общее представление о том, что такое объектно-ориентированное программирование. Я очень надеюсь на то, что прочтение этой книги создаст прочную основу для перехода к материалам, затрагивающим более продвинутые темы.
К настоящему времени должна быть очевидна моя твердая убежденность в том, что сначала нужно хорошо освоить объектно-ориентированное мышление, а затем уже приступать к изучению языка программирования или моделирования. Эта книга наполнена примерами кода и UML-диаграмм, однако необязательно владеть определенным языком программирования или UML для того, чтобы переходить к ее чтению. Но после всего того, что я сказал об изучении в первую очередь объектно-ориентированных концепций, почему же в этой книге так много кода и диаграмм класса?
Во-первых, они отлично иллюстрируют объектно-ориентированные концепции. Во-вторых, они жизненно важны для освоения объектно-ориентированного мышления и должны рассматриваться на вводном уровне. Основной принцип заключается не в том, чтобы сосредотачиваться на Java, C# и т.д., а в использовании их в качестве средств, которые помогают понять основополагающие концепции.
Обратите внимание на то, что мне очень нравится применять UML-диаграммы классов как визуальные средства, помогающие понять классы, их атрибуты и методы. Фактически диаграммы классов — это единственный компонент UML, использованный в этой книге. Я считаю, что UML-диаграммы классов отлично подходят для представления концептуальной природы объектных моделей. Я продолжу использовать объектные модели в качестве образовательного инструмента для наглядной демонстрации конструкции классов и того, как классы соотносятся друг с другом.
Примеры кода в этой книге иллюстрируют концепции вроде циклов и функций. Однако понимание этого кода как такового не является необходимым условием для понимания самих концепций; возможно, целесообразно иметь под рукой книгу, в которой рассматривается синтаксис соответствующего языка, если вы захотите узнать дополнительные подробности.
Я не могу строго утверждать, что эта книга не учит языку Java, C# .NET, VB .NET, Objective-C, Swift или UML, каждому из которых можно было бы посвятить целые тома. Я надеюсь, что она пробудит в вас интерес к другим объектно-ориентированным темам вроде объектно-ориентированного анализа, объектно-ориентированного проектирования и объектно-ориентированного программирования.