Объектно-ориентированный подход. Объектно_ориентированный_подход. Объектно ориентированный подход Мэтт Вайсфельд 5е международное издание ббк 32. 973. 2018
Скачать 5.43 Mb.
|
РУКОВОДСТВО ПО ПРОЕКТИРОВАНИЮ КЛАССОВ SOUND ____________________________ Имейте.в.виду,.что.можно.создать.неудачно.спроектированные.объектно-ориенти- рованные.классы,.которые.не.ограничивают.доступ.к.атрибутам.классов..Суть.за- ключается.в.том,.что.при.объектно-ориентированном.проектировании.вы.можете. создать.плохой.код.с.той.же.легкостью,.как.и.при.использовании.любой.другой.ме- тодологии.программирования..Просто.примите.меры.для.того,.чтобы.придержи- ваться.руководства.по.проектированию.классов.Sound.(см..главу.5). А что будет, если другому объекту, например myObject , потребуется получить доступ к сумме значений myInt1 и myInt2 ? Он обратится к объекту Math : myObject отправит сообщение объекту Math . На рис. 1.3 показано, как два объекта обща- ются друг с другом с помощью своих методов. Сообщение на самом деле пред- ставляет собой вызов метода sum объекта Math . Метод sum затем возвращает значение объекту myObject . Вся прелесть заключается в том, что myObject не нужно знать, как вычисляется сумма (хотя, я уверен, он может догадаться). Глава.1..Введение.в.объектно-ориентированные.концепции 28 Используя эту методологию проектирования, вы можете изменить то, как объ- ект Math вычисляет сумму, не меняя объект myObject (при условии, что средства для извлечения значения суммы останутся прежними). Все, что вам нужно, — это сумма, и вам безразлично, как она вычисляется. Рис. 1.3. Коммуникации.между.объектами Простой пример с калькулятором позволяет проиллюстрировать эту концепцию. При определении суммы на калькуляторе вы используете только его интер- фейс — кнопочную панель и экран на светодиодах. В калькулятор заложен метод для вычисления суммы, который вызывается, когда вы нажимаете соот- ветствующую последовательность кнопок. После этого вы сможете получить правильный ответ, однако не будете знать, как именно этот результат был до- стигнут — в электронном или алгоритмическом порядке. Вычисление суммы не является обязанностью объекта myObject — она возлага- ется на Math . Пока у myObject есть доступ к объекту Math , он сможет отправлять соответствующие сообщения и получать надлежащие результаты. Вообще го- воря, объекты не должны манипулировать внутренними данными других объ- ектов (то есть myObject не должен напрямую изменять значения myInt1 и myInt2 ). Кроме того, по некоторым причинам (их мы рассмотрим позднее) обычно лучше создавать небольшие объекты со специфическими задачами, нежели крупные, но выполняющие много задач. 29 Переход.с.процедурной.разработки.на.объектно-ориентированную. . Переход с процедурной разработки на объектно-ориентированную Теперь, когда мы имеем общее понятие о некоторых различиях между про- цедурными и объектно-ориентированными технологиями, углубимся и в те и в другие. Процедурное программирование При процедурном программировании данные той или иной системы обычно отделяются от операций, используемых для манипулирования ими. Например, если вы решите передать информацию по сети, то будут отправлены только релевантные данные (рис. 1.4) с расчетом на то, что программа на другом конце сетевой магистрали будет знать, что с ними делать. Иными словами, между клиентом и сервером должно быть заключено что-то вроде джентльменского соглашения для передачи данных. При такой модели вполне возможно, что на самом деле по сети не будет передаваться никакого кода. Рис. 1.4. Данные,.передаваемые.по.сети Объектно-ориентированное программирование Основное преимущество объектно-ориентированного программирования за- ключается в том, что и данные, и операции (код), используемые для манипули- рования ими, инкапсулируются в одном объекте. Например, при перемещении объекта по сети он передается целиком, включая данные и поведение. ЕДИНОЕ ЦЕЛОЕ _______________________________________________________________________ Хотя.мышление.в.контексте.единого.целого.теоретически.является.прекрасным. подходом,.сами.поведения.не.получится.отправить.из-за.того,.что.с.обеих.сторон. имеются.копии.соответствующего.кода..Однако.важно.мыслить.в.контексте.всего. объекта,.передаваемого.по.сети.в.виде.единого.целого. На рис. 1.5 показана передача объекта Employee по сети. Глава.1..Введение.в.объектно-ориентированные.концепции 30 Рис. 1.5. Объект,.передаваемый.по.сети ПРАВИЛЬНОЕ ПРОЕКТИРОВАНИЕ ____________________________________________________ Хорошим.примером.этой.концепции.является.объект,.загружаемый.браузером.. Часто.бывает.так,.что.браузер.заранее.не.знает,.какие.действия.будет.выполнять. определенный.объект,.поскольку.он.еще.«не.видел».кода..Когда.объект.загрузится,. браузер.выполнит.код,.содержащийся.в.этом.объекте,.а.также.использует.заклю- ченные.в.нем.данные. Что такое объект? Объекты — это строительные блоки объектно-ориентированных программ. Та или иная программа, которая задействует объектно-ориентированную тех- нологию, по сути, является набором объектов. В качестве наглядного примера рассмотрим корпоративную систему, содержащую объекты, которые представ- ляют собой работников соответствующей компании. Каждый из этих объектов состоит из данных и поведений, описанных в последующих разделах. Данные объектов Данные, содержащиеся в объекте, представляют его состояние. В терминологии объектно-ориентированного программирования эти данные называются атри- бутами. В нашем примере, как показано на рис. 1.6, атрибутами работника Рис. 1.6. Атрибуты.объекта.Employee 31 Что.такое.объект?. . могут быть номер социального страхования, дата рождения, пол, номер теле- фона и т. д. Атрибуты включают информацию, которая разнится от одного объ- екта к другому (ими в данном случае являются работники). Более подробно атрибуты рассматриваются далее в этой главе при исследовании классов. Поведение объектов Поведение объекта представляет то, что он может сделать. В процедурных язы- ках поведение определяется процедурами, функциями и подпрограммами. В терминологии объектно-ориентированного программирования поведения объектов содержатся в методах, а вызов метода осуществляется путем отправ- ки ему сообщения. Примите по внимание, что в нашем примере с работниками одно из необходимых поведений объекта Employee заключается в задании и воз- врате значений различных атрибутов. Таким образом, у каждого атрибута будут иметься соответствующие методы, например setGender() и getGender() . В дан- ном случае, когда другому объекту потребуется такая информация, он сможет отправить сообщение объекту Employee и узнать значение его атрибута gender Неудивительно, что применение геттеров и сеттеров, как и многое из того, что включает объектно-ориентированная технология, эволюционировало с тех пор, как было опубликовано первое издание этой книги. Это особенно актуально для тех случаев, когда дело касается данных. Помните, что одно из самых интересных преимуществ использования объектов заключается в том, что данные являются частью пакета — они не отделяются от кода. Появление XML не только сосредоточило внимание людей на представлении данных в переносимом виде, но и обеспечило для кода альтернативные способы доступа к данным. В .NET-методиках геттеры и сеттеры считаются свойствами самих данных. Например, взгляните на атрибут с именем Name , который при использовании в Java выглядит следующим образом: public String Name; Соответствующие геттер и сеттер выглядели бы так: public void setName (String n) {name = n;}; public String getName() {return name;}; Теперь, при создании XML-атрибута с именем Name , определение на C# .NET может выглядеть примерно так: Private string strName; public String Name { get { return this.strName; } Глава.1..Введение.в.объектно-ориентированные.концепции 32 set { if (value == null) return; this.strName = value; } } При такой технике геттеры и сеттеры в действительности являются свойствами атрибутов — в данном случае атрибута с именем Name Независимо от используемого подхода, цель одна и та же — управляемый доступ к атрибуту. В этой главе я хочу сначала сосредоточиться на концептуальной природе методов доступа. О свойствах мы поговорим подробнее в последующих главах. ГЕТТЕРЫ И СЕТТЕРЫ __________________________________________________________________ Концепция.геттеров.и.сеттеров.поддерживает.концепцию.сокрытия.данных..По- скольку.другие.объекты.не.должны.напрямую.манипулировать.данными,.содержа- щимися.в.одном.из.объектов,.геттеры.и.сеттеры.обеспечивают.управляемый.доступ. к.данным.объекта..Геттеры.и.сеттеры.иногда.называют.методами.доступа.и.метода- ми-модификаторами.соответственно. Следует отметить, что мы показываем только интерфейс методов, а не реализа- цию. Приведенная далее информация — это все, что пользователям потребует- ся знать для эффективного применения методов: имя метода; параметры, передаваемые методу; возвращаемый тип метода. Поведения показаны на рис. 1.7. На рис. 1.7 демонстрируется, что объект Payroll содержит метод с именем calculatePay() , который используется для вычисления суммы зарплаты каждо- го конкретного работника. Помимо прочей информации, объекту Payroll потре- буется номер социального страхования соответствующего работника. Для этого он должен отправить сообщение объекту Employee (в данном случае дело касает- ся метода getSocialSecurityNumber() ). В сущности, это означает, что объект Payroll вызовет метод getSocialSecurityNumber() объекта Employee . Объект Employee «увидит» это сообщение и возвратит запрошенную информацию. UML-ДИАГРАММЫ КЛАССОВ _________________________________________________________ Это.были.первые.диаграммы.классов,.которые.мы.рассмотрели..Как.видите,.они.весь- ма.просты.и.лишены.части.конструкций.(таких,.например,.как.конструкторы),.которые. должен.содержать.надлежащий.класс..Более.подробно.мы.рассмотрим.диаграммы. классов.и.конструкторы.в.главе.3.«Прочие.объектно-ориентированные.концепции». 33 Что.такое.объект?. . Рис. 1.7. Поведения.объекта.Employee Рис. 1.8. Диаграммы.классов.Employee.и.Payroll Более подробно все показано на рис. 1.8, где приведены диаграммы классов, представляющие систему Employee / Payroll , о которой мы ведем речь. Каждая диаграмма определяется тремя отдельными секциями: именем как та- ковым, данными (атрибутами) и поведениями (методами). На рис. 1.8 показано, что секция атрибутов диаграммы класса Employee содержит socialSecurityNumber , gender и dateofBirth , в то время как секция методов включает методы, которые оперируют этими атрибутами. Вы можете использовать средства моделирования Глава.1..Введение.в.объектно-ориентированные.концепции 34 UML для создания и сопровождения диаграмм классов, соответствующих ре- альному коду. СРЕДСТВА МОДЕЛИРОВАНИЯ ________________________________________________________ Средства.визуального.моделирования.обеспечивают.механизм.для.создания.и.ма- нипулирования.диаграммами.классов.с.использованием.унифицированного.языка. моделирования.Unified.Modeling.Language.(UML)..Диаграммы.классов.рассматри- ваются.по.ходу.всей.книги..Они.используются.как.средство,.помогающее.визуали- зировать.классы.и.их.взаимоотношения.с.другими.классами..Использование.UML. в.этой.книге.ограничивается.диаграммами.классов. О взаимоотношениях между классами и объектами мы поговорим позднее в этой главе, а пока вы можете представлять себе класс как шаблон, на основе которо- го создаются объекты. При создании объектов мы говорим, что создаются эк- земпляры этих объектов. Таким образом, если мы создадим три Employee , то на самом деле сгенерируем три полностью отдельных экземпляра класса Employee Каждый объект будет содержать собственную копию атрибутов и методов. На- пример, взгляните на рис. 1.9. Объект Employee с именем John (которое Рис. 1.9. Программные.пространства 35 Что.такое.класс?. . является его идентификатором) включает собственную копию всех атрибутов и методов, определенных в классе Employee Объект Employee с именем Mary тоже содержит собственную копию атрибутов и методов. Оба объекта включают в себя отдельную копию атрибута dateOfBirth и метода getDateOfBirth ВОПРОС РЕАЛИЗАЦИИ _______________________________________________________________ Знайте,.что.необязательно.располагать.физической.копией.каждого.метода.для.каж- дого.объекта..Лучше,.чтобы.каждый.объект.указывал.на.одну.и.ту.же.реализацию.. Однако.решение.этого.вопроса.будет.зависеть.от.используемого.компилятора./.опе- рационной.платформы..На.концептуальном.уровне.вы.можете.представлять.себе. объекты.как.полностью.независимые.и.содержащие.собственные.атрибуты.и.методы. Что такое класс? Если говорить просто, то класс — это «чертеж» объекта. При создании экзем- пляра объекта вы станете использовать класс как основу для того, как этот объект будет создаваться. Фактически попытка объяснить классы и объекты подобна стремлению решить дилемму «что было раньше — курица или яйцо?» Трудно описать класс без использования термина объект, и наоборот. Например, какой-либо определенный велосипед — это объект. Однако для того, чтобы по- строить этот велосипед, кому-то сначала пришлось подготовить чертежи (то есть класс), по которым он затем был изготовлен. В случае с объектно-ориентиро- ванным программным обеспечением, в отличие от дилеммы «что было раньше — курица или яйцо?», мы знаем, что первым был именно класс. Нельзя создать экземпляр объекта без класса. Таким образом, многие концепции в этом раз- деле схожи с теми, что были представлены ранее в текущей главе, особенно если вести речь об атрибутах и методах. Несмотря на то что эта книга сосредоточена на концепциях объектно-ориенти- рованного программного обеспечения, а не на конкретной реализации, зачастую полезно использовать примеры кода для объяснения некоторых концепций, поэтому фрагменты кода на Java задействуются по ходу всей этой книги, в со- ответствующих случаях помогая в объяснении отдельных тем. Однако для не- которых ключевых примеров код предоставляется для загрузки на нескольких языках программирования. В последующих разделах описываются некоторые фундаментальные концепции классов и то, как они взаимодействуют друг с другом. Создание объектов Классы можно представлять себе как шаблоны или кондитерские формочки для объектов, как показано на рис. 1.10. Класс используется для создания объекта. Глава.1..Введение.в.объектно-ориентированные.концепции 36 Рис. 1.10. Шаблон.класса Класс можно представлять себе как нечто вроде типа данных более высокого уровня. Например, точно таким же путем, каким вы создаете то, что относится к типу данных int или float : int x; float y; вы можете создать объект с использованием предопределенного класса: myClass myObject; В этом примере сами имена явно свидетельствуют о том, что myClass является классом, а myObject — объектом. Помните, что каждый объект содержит собственные атрибуты (данные) и по- ведения (функции или программы). Класс определяет атрибуты и поведения, которые будут принадлежать всем объектам, созданным с использованием этого класса. Классы — это фрагменты кода. Объекты, экземпляры которых созданы на основе классов, можно распространять по отдельности либо как часть библиотеки. Объекты создаются на основе классов, поэтому классы долж- ны определять базовые строительные блоки объектов (атрибуты, поведения и сообщения). В общем, вам потребуется спроектировать класс прежде, чем вы сможете создать объект. 37 Что.такое.класс?. . Вот, к примеру, определение класса Person : public class Person{ // Атрибуты private String name; private String address; // Методы public String getName(){ return name; } public void setName(String n){ name = n; } public String getAddress(){ return address; } public void setAddress(String adr){ address = adr; } } Атрибуты Как вы уже видели, данные класса представляются атрибутами. Любой класс должен определять атрибуты, сохраняющие состояние каждого объекта, экзем- пляр которого окажется создан на основе этого класса. Если рассматривать класс Person из предыдущего раздела, то он определяет атрибуты для name и address ОБОЗНАЧЕНИЯ ДОСТУПА _____________________________________________________________ Когда.тип.данных.или.метод.определен.как. public ,.у.других.объектов.будет.к.нему. прямой.доступ..Когда.тип.данных.или.метод.определен.как. private ,.только.конкрет- ный.объект.сможет.получить.к.нему.доступ..Еще.один.модификатор.доступа.—. protected .—.разрешает.доступ.с.использованием.связанных.объектов,.но.на.эту. тему.мы.поговорим.в.главе.3. Методы Как вы узнали ранее из этой главы, методы реализуют требуемое поведение класса. Каждый объект, экземпляр которого окажется создан на основе этого класса, будет содержать методы, определяемые этим же классом. Методы могут реализовывать поведения, вызываемые из других объектов (с помощью сообще- ний) либо обеспечивать основное, внутреннее поведение класса. Внутренние поведения — это закрытые методы, которые недоступны другим объектам. Глава.1..Введение.в.объектно-ориентированные.концепции 38 В классе Person поведениями являются getName() , setName() , getAddress() и setAddress() . Эти методы позволяют другим объектам инспектировать и из- менять значения атрибутов соответствующего объекта. Это методика, широко распространенная в сфере объектно-ориентированных систем. Во всех случаях доступ к атрибутам в объекте должен контролироваться самим этим объектом — никакие другие объекты не должны напрямую изменять значения атрибутов этого объекта. |