Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С++ Страуструп.doc
Скачиваний:
4
Добавлен:
18.04.2019
Размер:
2.72 Mб
Скачать

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

Переход на новые методы работы может быть мучителен для любой

организации. Раскол внутри нее и расхождения между сотрудниками могут

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

превратить эффективных и квалифицированных сторонников "старой школы"

в неэффективных новичков "новой школы" обычно неприемлем. В то же

время, нельзя достичь больших высот без изменений, а

значительные изменения обычно связаны с риском.

Язык С++ создавался с целью сократить такой риск за счет

постепенного введения новых методов. Хотя очевидно, что наибольшие

преимущества при использовании С++ достигаются за счет абстракции

данных, объектно-ориентированного программирования и

объектно-ориентированного проектирования, совершенно неочевидно,

что быстрее всего достичь этого можно решительным

разрывом с прошлым. Вряд ли такой явный разрыв будет возможен,

обычно стремление к усовершенствованиям сдерживается или должно

сдерживаться, чтобы переход к ним был управляемым. Нужно учитывать

следующее:

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

новыми методами.

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

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

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

выполнена в срок.

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

локальному окружению.

Здесь рассматриваются как раз ситуации, связанные с перечисленными

требованиями. Легко недооценить два первых требования.

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

язык допускает постепенный переход на него, используя

следующие преимущества такого перехода:

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

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

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

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

с программами, написанными на С или других традиционных языках.

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

Идея заключается в постепенном переходе программиста с

традиционного языка на С++: вначале он программирует на С++

в традиционном процедурном стиле, затем с помощью методов абстракции

данных, и наконец, когда овладеет языком и связанными с ним средствами,

полностью переходит на объектно-ориентированное программирование.

Заметим, что хорошо спроектированную библиотеку использовать намного

проще, чем проектировать и реализовывать, поэтому даже с первых своих

шагов новичок может получить преимущества, используя более

развитые средства С++.

Идея постепенного, пошагового овладения С++, а также возможность

смешивать программы на С++ с программами, написанными на языках,

не имеющих средств абстракции данных и объектно-ориентированного

программирования, естественно приводит к проекту, имеющему

гибридный стиль. Большинство интерфейсов можно пока оставить

на процедурном уровне, поскольку что-либо более сложное не

принесет немедленного выигрыша. Например, обращение к стандартной

библиотеке 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);

Такой подход позволяет разработчику на С++, если у него уже есть

запас программ, написанных на языках, в которых отсутствуют понятия

абстракции данных и иерархии классов, постепенно приобщаться к этим

понятиям, даже при том требовании, что окончательную версии программы

можно будет вызывать из традиционных процедурных языков.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]