Лекции по информатике (984119), страница 34
Текст из файла (страница 34)
Например, понятие объекта сходно с понятием фрейма, одним из основных понятий в теории представления знаний. ° Интеграция понятий и средств информатики. Об"ьектно-ориентированное программирование знаменует очередной этап сближения (интеграции) понятий и средств информатики, характерный для нее в послсдние годы. ° Целостность языков.
Распространенные об"ьектные языки естественным образом выросли из своих предшественников (Паскаль, Си), не нарушив естественную структуру языка, и эволкхционным образом вводя фон Неймановского программиста в светлое будущее полнообъсктных сред. 7.4.3 Обьектно-ориентированное программирование и структур- ное программирование Обьектно-ориентировапное программирование базируется на структурах (типах) данных и лучше всего работает, когда основная сложность построения алгоритма заключена в выборе организации данных. Структурное программирование основано на нисходящем применении ограничеююго набора простых структур управления и дает хорошие результаты при сложном управлении и простых структурах данных.
Преимущество нисходящего проектирования в том, что на каждом этапе разработки алгоритм определен полностью. Это позволяет программисту понять роль каждого фрагмента во всем программном комплексе. При обьектно-ориентированном программировании основное внимание уделяется обьектам. И порой бывает нс вполне ясно, как обьекты и операции взаимодействуя>т при решении задачи.
1'!оскольку в обьектно-ориентированном подходе выделено понятие операции, то обычно это естественным образом приводит к прекрасной модульной структуре программы. Структурный подход весьма слабо поддерживает процесс декомпозиции программы на процедуры, а для оолыпих программ проолсма их декомпозиции на модули очень непроста. При обьектно-ориентированном подходе также упрощается использование модулей заимствования. После того как выделены обьскты и операции над ними, программисту не составляет труда определить дальнейшую полезность разработанного программного обеспечения.
В результате обьектно-ориентированного программирования основной алгоритм легко читается и понимается, так как запрограммирован в терминах процедур, похожих на абстрактные операции. Операми короткие и понятные, поскольку связаны с независимыми четко определенными задачами. Упрощение внесения изменений — еще одно достоинство обьектно-ориентированного программирования. Операция проще идентифицируется и изменяется, если она реализована в виде отдельной процедуры. В заключение отметим, что наибольший эффект дает совокупное использование обоих методов: обьекты и операции должны выбираться в рамках обьектно-ориентированпого подхода, а реализацию операций луч|не всего проводить сверху-вниз. 410 Удобнее первые шаги разработки программы провести в соответствии с обьектпоориентированным подходом, выпо:шяя разбиение на модули.
Если подходящая структура данных без исследования алгоритма неясна, надо начать нисходящее проектирование. Если составление алгоритмов без предварительного выбора, структуры данных не получается, необходимо провести обьектно-ориентир<>ванное проектирование. 1'!осле каждого уровня детализации полезно выделить в алгоритме характерные обьекты. Каждун> операцию можно рассматривать как отдельнун> задачу для ни<'х<>дягцего проектирования. При выборе обьектов следует использовать заимствуемые компоненты. При проектировании обьектов и операций надо опглраться на абстрактные типы данных.
7.4.4 ООП в фон Неймановских языках Н. Вирт развивал Паскаль в сторону объектной технологии (Молула, Модула;2, Оберон, ... ) см., например, 1591. Фирма Вог!апс! уже в '!.'пгЬо Рааса! 5.5 предоставила возможность объектно-ориентированн<>го программирования на Паскале. Эти средства стали фактическим стандартом и, в частности, вошли в С".1ч с! Равса1. Однако, официального стандарта объектно-ориентированного Паскаля до сглх пор нет. 7.4.4.1 Полиморфная очередь с использованием механизмов ООП Очередь реализуется из объектов типов ТС>гс!е (о>сружность)> ТТг1апа1е (треугольник), ТЕхесг>СаЬ1е (выполняеь>ый объект, вызывающий процедуру саморисования) > которые являются наследниками ТОЬ1есС: 1' Яира!уорЗ: Сошников Д.
В. Т Суре ТОЬ1есС - оЬ1ес1, ргосе<1пге !Эгаъ"! упгпа1; !' Процедуры, к;схаюрые должны с>ь>зьсвапгься по ось~ <хе на ТОЦесС обьяс>ляются виртуольньм<и. 1Три обри<цен>и< к такс>й процедура как к члену базового класса будет вызвана процедура конь>Т>егпного класса — наследника, Зкзс>мп.лярве обстрактиого клас>еа не бь<вает, по апре<!елен>сю, возмоэ>сига т,олька указатели но, них, через когпорые моэ>оно вь звать обгцие для разнснпиппые потомков функции >с !' сопя!та>сСог Тг»С; —,'>с конкретна<их классов копструкгпор будет оп<<с<>н. Ковструк>тор абстрактного классп не имеегп смысла, п,аско.лькд абстрактньсе классы используются как исходная спецификац я для конкретных классов Т' с!езггггсгог Ропе: агапа!; !' Деструктор обаявлен виртуальным, поскольку унгечтоженгсе контейнера — очереди, потребует поочередного уни <тожения всех ее элементов, что приводит, к вызову их: деструкторосс Поскольку пииь злемепта очереди — абстрактпь<гь тс> в<язов абстраклпного деструкгпора будет заменен вызовом конкретного Т' епс1; 411 Суре РОЬ1ес1 — "ТОЬ)ес1; Суре ТРо1п1, -- оЬ)ес1(ТОЬ!ес!); х.
у: геа1; сопз1гпс1ог !г<!1(хх, у): геа1); << Теперь мооюно породить тпо <ку инструкцией ел<да р1;=- Тро1тгй!с<<1(1.0, 1.01; <Г ргосес1пге 1)га<ч; ч!г1<га!; !' У нового точкоооао типа есть своя процедура, в«зуалл<зацил< <г с1ез1гпс1ог Ропе; ч1г1па1; !' Может потребоваться для освобождения памяти, занятой членами класса в куче, различных ресурсов колгпьютера и ОС, как то объекты ОШ, порть<, сокеты... з) епс1; 1' тип точки, использУемый в описании геометРических фигУР зс РРога1 =- ТРо1п1; 1' для, сохранения, концептуальной совместимости с предыдугцил<и примерами ТС)тс1е наследуется отп ТО6)есй Для полной концептуальной законченности необходимо наследовать ТС1тс1е и Тро1п1 от ТТосаИотц который в свою очередь наследуется от ТО6)ес1 вместе с ТЕхеси1а61е.
у Суре ТСьгс1е - оЬ)есг(ТОЬ)ес1) сепсег: ТРоп<1; га<11пз: геа1; сопеггпс1ог 1п11 (хх, уу, гг: геа11; ргосес1пге 1)галч; ч!гспа1; <1слвсгп<1ог !)опе: ч1г1<га1; епс1:, РСггс1е = ТСпс1е; Суре ТТг1апп1е -- гесогс1 А, Н, С: т1ло1<л1; сопаьгпсгог 1п11 (ах,ау,Ьх,1зу,сх,су: геа1); ргосес1пге Вгалч; и!г1па1; с1ев1гпс1ог Г)опе; ч1гС<ла1; епс1; 1<1уре тесотд ТТт)апд1е) РТг1апа!е -- ТТг1ап 1е; Суре ТРгосес)пге Ргосес)пге; Рргосес1пге - Т1ъгосес!пге; Суре ТЕхесп1аЫе — оЬ)ес1(ТОЬ 1ес1 ) РгосРСг: РРгосес1пге; сопзсгпссог 1<<11(Р: РРгосес1пге); ргосес1пге 1)гаж; ч1г1па1; с1езсгпс1ог 1)опе; Ыг1па1; епс1; РЕхеспс а!э1е — "'ГЕхесяйаЫе; Тигс данных для элемента очереди ТУа1пе определяется как указатель на об ьект типа ТОЬ1ес1з что обеспечивает совместимость с УказателЯми на все его потомки: Суре ТУа1пе — РО1э1есй; Везде, где для печати элемента очереди вызывается процедура ип1е1п, необходимо заменить ее на вызов метода ГУгасг, например: шг11е1п(Р) — Р с .Вгаис(); ( где Р; РОЬ1ес1) При этом автоматически вызывается метод 1дгаи'(), соотвсстствующий объекту, указатель на которьпл содержится в данном элементе очереди.
ргосес1пге ГРо1гсС.ГУгам', и1 гспа1; 1' Процедура — мепсод Вгаис для обвекта 'ГРосп1 ~С Ьенш ът1Се1п('Х -- ', х, ', У -'; у):, епс1; ргосес1пге 'ГС1гс1е.1)гаст; т1ггпа1; 1' 1!роцедура — метод 1дгаис для обаектп ТСгс1е зг 1' осюбенности отрисовки на зкрпне 'плси вьсводп на экран опредсл„яются конкретнсхй реализацией с Ьеиш ъът1Се('ОКРУЖНОСТЬ('): СепСег.ГУгатс: жг1Се1п('В.- ',гас11пв,') '); епс1; ргосес1ш е ТТг1апя1е.ГУгаж; м1г1па1; Ьеиш ит1Се('ТРЕУГ('); ит1Се('А= '); А.ГУгаь-, тът1Се( В--'); В.ГУгаск; ит1Се('С -'): С.ГУгаж: исг1Се1п(')')1 епс1; ргосес1пге ТЕхеспгаЫе.
Гсгач', м1гСпа1; Ьенш 11 РгосРСг<>п11 СЬеп РгосРСг: 1' вытсолнссние процедуръс по указателю 1' епс1; Для создания нового объекта и помещения его в очередь используются функциикопструкторы: сопвсгпсгог ТРопй.1ЫС(хх, уу: геа1); Ьеиш пйегйсс1 1ш1: ( вызов То1т1стс1.1нгГ ) х: — хх; у: — уу; ( х,у — метнодьт обаекта, хэ:, уу — нарамстртя конструктора ) епс1; соггаггпгйог ТС1гс1е.1шг(хх, уу, гг: геа1); Ьефп 1пЬег11ес1 1шГ; ( Вызов конотрукгтора базового класса 3 сепгсн.
1шГ (хх, уу); ( Пгт1тоэтсдетггтст точки — центра окруэтсноспит! ) гас1тггг: епс1; сопаггпсгог ТТг1апа1е.1шг(ах, ау, Ьх, Ьу, сх, су: геа1); Ьеиш пгЬег11сс1 1шг,; А.1пЫ(ах, ау); ( Создание точек — вершин треугольника ) В. 1п11 (Ьх Ьу)- С.1п11(сх, су): епс1; сопгггпсГог ТЕхесп1аЬ1е.1п11(Р: РРгосес!пге): Ьеиш ш Ьег1'гес1 1ш1, РгосРгг: - Р; епс1; Правильное уничтожение объектов очереди обеспечивается виртуальным деструктором Рогге, который автоматически вызывается при вызове расширенной функции Вгзрозст(Р, ьтотге): с1ев$гпсгот ТРопгг.Етогге; кпгпа1; Ьеиш ( Здесь не требгтегася, уттглчпгоэгспть то тку сттегтитгльтто, погкольку ни одна из ее компонент, (згс.т) не размещатетпся при помощи пеит() в куче., поэтому и не. требует удаления.
Отта, будет уничптстжена, автполтаплтчески нри выгоде гез блока 3 епс1; с1сгаггпггог '1'С1гг1е.1допе: г1гггггг1; Ьеиш сепгег. Попе: ( В уничтоэтсении нуждается только точка,— цетттр окружности, пороэтсденаая при ее создании ) епс1; Пример добавления объекта в очередь: ргосес1пге Ехагпр!еВгагг; Ьеиш ътЫе1п('ВЬШОЛНЯЕ.'г1ЫЙ'): ( Здесь могла бьипь ваша вгтзуалгтзаиг~я ( РозгБст грг, Яоитгт1сотуе...) ) епс1; маг Ч: Чпепе: РцвЬ(ч, пеъ.(РС1гс1е, 1пй(10, 10, 5))); Рпй(ч, пеж(Р 111ащ,1е, 1п11(1, 2, 3., 4, .5., 6))); Рпй Я, .пеж(РЕхесп1аЫе, .1шг(йЕхап~р3е1)гаът))); 1)1ар!ау(ф; ~г Эта чисть програлсмы остаппсл неинмвнной у' 7.4.4.2 С++ В С-;+ все вышеописанное выглядит короче и яснее. Во-первых, в силу краткости и выразительности языка, а во-вторых все конструкторы и деструкторы вызываются автоматически при об"ьявлении переменных-экземпляров класса и выходе из блока, в котором они были обьявлены.
Так, все объекты Ре1р1п' размещаются только в куче и при этом синтаксис инструкций различается. 11апример, дкя размещения в куче переменной типа 1п$енег необходимо написать пеъь (р1); А чтобы разместить некоторый класс Х, необходимо писать совершенно другие инструк- ции в духе ро:== Х.1шг; или ро:--пеж(Х,1ш1); В С-'+ эти инструкции выглядят более однообразно и логично 1пС* р1 — пен 1пт; Х* рх пен Х; Благодаря этому использование переменной типа класс ничем не отличается от использования переменной любого встроенного типа. 7.4.4.3 Лача Синтаксис языка Лага очень похож на, синтаксис С!С+-.