Бьерн Страуструп.
Язык программирования С++
313
данных, объектно-ориентированного программирования и объектно-ориентированного проектирования,
совершенно неочевидно, что быстрее всего достичь этого можно решительным разрывом с прошлым.
Вряд ли такой явный разрыв будет возможен, обычно стремление к усовершенствованиям
сдерживается или должно сдерживаться, чтобы переход к ним был управляемым. Нужно учитывать
следующее:
-
Разработчикам и программистам требуется время для овладения новыми методами.
-
Новые программы должны взаимодействовать со старыми программами.
-
Старые программы нужно сопровождать (часто бесконечно).
-
Работа по текущим проектам и программам должна быть выполнена в срок.
-
Средства, рассчитанные на новые методы, нужно адаптировать к локальному окружению.
Здесь рассматриваются как раз ситуации, связанные с
перечисленными требованиями. Легко
недооценить два первых требования.
Поскольку в С++ возможны несколько схем программирования, язык допускает постепенный переход на
него, используя следующие преимущества такого перехода:
-
Изучая С++, программисты могут продолжать работать.
-
В окружении, бедном на программные средства, использование С++ может принести
значительные выгоды.
-
Программы, написанные на С++, могут хорошо взаимодействовать с
программами,
написанными на С или других традиционных языках.
-
Язык имеет большое подмножество, совместимое с С.
Идея заключается в постепенном переходе программиста с традиционного языка на С++: вначале он
программирует на С++ в
традиционном процедурном стиле, затем с помощью методов абстракции
данных, и наконец, когда овладеет языком и связанными с ним средствами, полностью переходит на
объектно-ориентированное программирование. Заметим, что хорошо спроектированную библиотеку
использовать намного проще, чем проектировать и реализовывать, поэтому даже с первых своих шагов
новичок может получить преимущества, используя более развитые средства С++.
Идея постепенного, пошагового овладения С++, а также возможность смешивать программы на С++ с
программами, написанными на языках, не имеющих средств абстракции данных и объектно-
ориентированного программирования, естественно приводит к проекту, имеющему гибридный стиль.
Большинство интерфейсов можно пока оставить на процедурном уровне, поскольку что-либо более
сложное не принесет немедленного выигрыша. Например, обращение к стандартной библиотеке math
из С определяется на С++ так:
extern "C" {
#include
}
и стандартные математические функции из библиотеки можно использовать так же, как и в С. Для всех
основных библиотек такое включение должно быть сделано теми, кто поставляет библиотеки, так что
программист на С++ даже не будет знать, на каком языке реализована библиотечная функция.
Использование библиотек, написанных на таких языках как С, является первым и вначале самым
важным способом повторного использования на С++.
На следующем шаге, когда станут необходимы более сложные приемы, средства, реализованные на
таких языках как С или Фортран, представляются в виде классов за счет инкапсуляции структур данных
и функций в интерфейс классов С++. Простым примером введения более высокого семантического
уровня за счет перехода от уровня процедур плюс структур данных к уровню абстракции данных может
служить класс строк из $$7.6. Здесь за счет инкапсуляции символьных строк и стандартных строковых
функций С получается новый строковый тип, который гораздо проще использовать.
Подобным образом можно включить в иерархию классов любой встроенный или отдельно
определенный тип. Например, тип int можно включить в иерархию классов так:
class Int : public My_object {
Бьерн Страуструп.
Язык программирования С++
314
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);
Такой подход позволяет разработчику на С++, если у него уже есть запас программ, написанных на
языках, в
которых отсутствуют понятия абстракции данных и иерархии классов, постепенно
приобщаться к этим понятиям, даже при том требовании, что окончательную версии программы можно
будет вызывать из традиционных процедурных языков.
Достарыңызбен бөлісу: