Программирование >>  Поддержка объектно-ориентированного программирования 

1 ... 98 99 100 [ 101 ] 102 103 104 ... 120


k(const F& a, const G& b, const H& c)

a.f(); b.g(); c.h();

main()

X x; Y y; Z z;

k(x,y,z); k(z,x,y); k(y,x,z); k(x,z,y);

ok

ok

error F required for first argument

error G required for second argument

Обратите внимание, что сделав предположения k() о своих аргументах явными, мы переместили контроль ошибок с этапа выполнения на этап трансляции. Сложные примеры, подобные приведенному, возникают, когда пытаются реализовать на С++ проекты, сделанные на основе опыта работы с другими системами типов. Обычно это возможно, но в результате получается неестественная и неэффективная программа. Такое несовпадение между приемами проектирования и языком программирования можно сравнить с несовпадением при пословном переводе с одного естественного языка на другой. Ведь английский с немецкой грамматикой выглядит столь же неуклюже, как и немецкий с английской грамматикой, но оба языка могут быть доступны пониманию того, кто бегло говорит на одном из них.

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

12.1.4 Гибридный проект

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

Язык С++ создавался с целью сократить такой риск за счет постепенного введения новых методов. Хотя очевидно, что наибольшие преимущества при использовании С++ достигаются за счет абстракции

class H {

virtual void h();

class X : public virtual F, public virtual G { void f(); void g();

class Y : public virtual G, public virtual H { void g(); void h();

class Z : public virtual H, public virtual F { void h();

void f();



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

- Разработчикам и программистам требуется время для овладения новыми методами.

- Новые программы должны взаимодействовать со старыми программами.

- Старые программы нужно сопровождать (часто бесконечно).

- Работа по текущим проектам и программам должна быть выполнена в срок.

- Средства, рассчитанные на новые методы, нужно адаптировать к локальному окружению.

Здесь рассматриваются как раз ситуации, связанные с перечисленными требованиями. Легко недооценить два первых требования.

Поскольку в С++ возможны несколько схем программирования, язык допускает постепенный переход на него, используя следующие преимущества такого перехода:

- Изучая С++, программисты могут продолжать работать.

- В окружении, бедном на программные средства, использование С++ может принести значительные выгоды.

- Программы, написанные на С++, могут хорошо взаимодействовать с программами, написанными на С или других традиционных языках.

- Язык имеет большое подмножество, совместимое с С.

Идея заключается в постепенном переходе программиста с традиционного языка на С++: вначале он программирует на С++ в традиционном процедурном стиле, затем с помощью методов абстракции данных, и наконец, когда овладеет языком и связанными с ним средствами, полностью переходит на объектно-ориентированное программирование. Заметим, что хорошо спроектированную библиотеку использовать намного проще, чем проектировать и реализовывать, поэтому даже с первых своих шагов новичок может получить преимущества, используя более развитые средства С++.

Идея постепенного, пошагового овладения С++, а также возможность смешивать программы на С++ с программами, написанными на языках, не имеющих средств абстракции данных и объектно-ориентированного программирования, естественно приводит к проекту, имеющему гибридный стиль. Большинство интерфейсов можно пока оставить на процедурном уровне, поскольку что-либо более сложное не принесет немедленного выигрыша. Например, обращение к стандартной библиотеке math из С определяется на С++ так:

extern C {

#include <math.h>

и стандартные математические функции из библиотеки можно использовать так же, как и в С. Для всех основных библиотек такое включение должно быть сделано теми, кто поставляет библиотеки, так что программист на С++ даже не будет знать, на каком языке реализована библиотечная функция. Использование библиотек, написанных на таких языках как С, является первым и вначале самым важным способом повторного использования на С++.

На следующем шаге, когда станут необходимы более сложные приемы, средства, реализованные на таких языках как С или Фортран, представляются в виде классов за счет инкапсуляции структур данных и функций в интерфейс классов С++. Простым примером введения более высокого семантического уровня за счет перехода от уровня процедур плюс структур данных к уровню абстракции данных может служить класс строк из $$7.6. Здесь за счет инкапсуляции символьных строк и стандартных строковых функций С получается новый строковый тип, который гораздо проще использовать.

Подобным образом можно включить в иерархию классов любой встроенный или отдельно определенный тип. Например, тип int можно включить в иерархию классов так:

class Int : public My object {



int i; public:

definition of operations

see exercises [8]-[11] in section 7.14 for ideas определения операций получаются в упражнениях [8]-[11] за идеями обратитесь к разделу 7.14

Так следует делать, если действительно есть потребность включить такие типы в иерархию.

Обратно, классы С++ можно представить в программе на С или Фортране как функции и структуры данных. Например:

class myclass {

representation public:

void f();

T1 g(T2);

...

extern C { map myclass into C callable functions: void myclass f(myclass* p) { p->f(); } T1 myclass g(myclass* p, T2 a) { return p->g(a); } ...

В С-программе следует определить эти функции в заголовочном файле следующим образом:

in C header file

extern void myclass f(struct myclass*); extern T1 myclass g(struct myclass*, T2);

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

12.2 Классы

Основное положение объектно-ориентированного проектирования и программирования заключается в том, что программа служит моделью некоторых понятий реальности. Классы в программе представляют основные понятия области приложения и, в частности, основные понятия самого процесса моделирования реальности. Объекты классов представляют предметы реального мира и продукты процесса реализации.

Мы рассмотрим структуру программы с точки зрения следующих взаимоотношений между классами:

- отношения наследования,

- отношения принадлежности,

- отношения использования и

- запрограммированные отношения.

При рассмотрении этих отношений неявно предполагается, что их анализ является узловым моментом в проекте системы. В $$1 2.4 исследуются свойства, которые делают класс и его интерфейс полезными для представления понятий. Вообще говоря, в идеале, зависимость класса от остального мира должна быть минимальна и четко определена, а сам класс должен через интерфейс открывать лишь минимальный объем информации для остального мира.

Подчеркнем, что класс в С++ является типом, поэтому сами классы и взаимоотношения между ними



1 ... 98 99 100 [ 101 ] 102 103 104 ... 120

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика