Бьерн Страуструп - Язык программирования С++. Главы 11-13
Страница 28. Гибридный проект



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);

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

 
« Предыдущая статья   Следующая статья »