Бьерн Страуструп - Язык программирования С++. Вступление, глава 1
Страница 20. Пределы абстракции данных


 

1.2.4  Пределы абстракции данных

    Абстрактный тип данных определяется как некий "черный ящик". После
своего определения он по сути никак не взаимодействует с программой. Его
никак нельзя приспособить для новых целей, не меняя определения. В этом
смысле это негибкое решение. Пусть, например, нужно определить для
графической системы тип shape (фигура).  Пока считаем, что в системе могут
быть такие фигуры: окружность (circle), треугольник (triangle) и квадрат
(square). Пусть уже есть определения точки и цвета:

        class point { /* ... */ };
        class color { /* ... */ };

    Тип shape можно определить следующим образом:

        enum kind { circle, triangle, square };

        class shape
        {
           point center;
           color col;
           kind k;
           // представление фигуры
        public:
           point where () { return center; }
           void move ( point to )  { center = to; draw (); }
           void draw ();
           void rotate ( int );
           // еще некоторые операции
        };

    "Поле типа" k необходимо для того, чтобы такие операции, как draw () и
rotate (), могли определять, с какой фигурой они имеют дело (в языках
вроде Паскаля можно использовать для этого запись с вариантами, в которой
k является полем-дескриминантом). Функцию draw () можно определить так:

         void shape :: draw ()
         {

           switch ( k )
           {
           case circle:
               // рисование окружности
               break;
           case triangle:
               // рисование треугольника
               break;
           case square:
               // рисование квадрата
               break;
           }
         }

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

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