Технологии программирования
Шрифт:
Правило 11. Определяйте интерфейсы так, чтобы сделать открытым минимальный объем информации, требуемой для интерфейса.
Правило 12. Проводите строгую типизацию интерфейсов всегда, когда это возможно.
Правило 13. Используйте в интерфейсах типы из области приложения всегда, когда это возможно.
Правило 14. Многократно исследуйте и уточняйте как проект, так и реализацию.
Правило 15. Используйте лучшие доступные средства
Правило 16. Экспериментируйте, анализируйте и проводите тестирование на самом возможном раннем этапе.
Правило 17. Стремитесь к простоте, максимальной простоте, но не сверх того.
Правило 18. Не разрастайтесь, не добавляйте возможности "на всякий случай".
Правило 19. Не забывайте об эффективности.
Правило 20. Сохраняйте уровень формализации, соответствующий размеру проекта.
Правило 21. Не забывайте, что разработчики, программисты и даже менеджеры остаются людьми.
Б. Страуструп придумал реализацию механизма множественного наследования и при этом отвергал агрегирование, хотя и реализовал это в своем языке C++.
Приведенный далее пример показывает невозможность осуществления решения следующей простой задачи двумя способами решения — с использованием множественного наследования и агрегирования. В процессе решения задач было выявлено, что в ряде задач без выполнения третьего шага невозможно корректное выполнение второго шага. Таким образом, при решении одного и того же примера двумя способами второй и третий шаги проекта были взаимно переставлены. Также добавлен шаг "классификация объектов" (составление словаря).
Первый способ решения задачи — использование множественного наследования.
Постановка задачи примера. Вывести на экран фигуру, показанную на рис. 8.4.
Рис. 8.4. Изображение выводимой фигуры
Изображенная на рис. 8.4 фигура состоит из правильного пятиугольника и описанной вокруг него окружности, где хс, yc — координаты центра описанной вокруг пятиугольника окружности; R — радиус описанной вокруг пятиугольника окружности.
Кроме того, фигура рисуется заданным цветом.
Следует отметить, что задача может быть решена несколькими способами.
Шаг 1а. Определение объектов и выявление их свойств.
Объект — Рисунок. Свойства объекта:
— радиус окружности (R);
— координаты центра окружности (xc; yc);
— цвет линий.
Объект — Пятиугольник. Свойства объекта:
— радиус описанной вокруг него окружности (R);
—
— цвет линии.
Объект — Окружность. Свойства объекта:
— радиус (R);
— координаты центра (хс; yc);
— цвет линии.
Решение задачи примера с использованием множественного наследования.
Шаг 1б. Классификация объектов (составление словаря).
Пятиугольник — центрально-симметричная фигура с пятью вершинами.
Окружность — центрально-симметричная фигура, каждая точка которой отстоит от заданной точки — центра, на заданную величину — радиус окружности.
Полученный граф наследования классов изображен на рис. 8.5.
Шаг 2. Уточнение классов с точным определением их зависимостей от других классов. Выясняется наследование и использование зависимостей.
Рис. 8.5. Граф наследования классов согласно первому способу
Поскольку Пятиугольник и Окружность — это разновидности центрально-симметричных фигур, то им может соответствовать следующая иерархия классов. Базовый класс: Центрально-симметричная фигура с данными R, хс, yc. Классы Пятиугольник и Окружность являются наследниками этого класса, а класс Рисунок является наследником классов Окружность и Пятиугольник, поскольку в данной задаче рисунок является сочетанием пятиугольника и окружности.
Шаг 3. Уточнение классов с определением наборов операций для каждого. Здесь анализируется потребность в конструкторах, деструкторах и операциях копирования. При этом принимается во внимание минимальность, полнота и удобство.
Класс Рисунок. Экземпляр этого класса должен создаваться и рисоваться, а следовательно, в интерфейсе класса Рисунок должны присутствовать конструкторы и функция — член рисования рисунка. Тогда получаем:
• конструктор без параметров;
• конструктор с параметрами (Радиус, х-координата, y-координата, Цвет);
• функцию-член вывода рисунка — "Начертить".
Класс Пятиугольник. Экземпляр этого класса должен создаваться и рисоваться, а следовательно, в интерфейсе класса Пятиугольник должны присутствовать конструкторы и функция-член рисования пятиугольника. Тогда получаем:
• конструктор без параметров;
• конструктор с параметрами (Радиус, х-координата, y-координата);
• функцию-член вывода пятиугольника на экран — "Начертить".
Класс Окружность. Экземпляр этого класса должен создаваться и рисоваться, а следовательно, в интерфейсе класса Окружность должны присутствовать конструкторы и функция-член вывода окружности на экран. Тогда получаем:
• конструктор без параметров;
• конструктор с параметрами (Радиус, х-координата, у-координата);