Стиль разработки объектно-ориентированных проектов
8.1. Общие правила оформления классов
Объектно-ориентированная технология не является средством, которое автоматически создает более понятные и легко модифицируемые программы по отношению к другим техноолгиям, например, структурному программированию. Необходимо уметь использовать потенциал, заложенный в этой технологии. Для этого ниже приводятся некоторые рекомендации по стилю оформления классов.
Составление атрибутов
Атрибуты класса должны быть связаны с базовыми свойствами этого класса в предметной области и не должны быть связаны с конкретной задачей или методом реализации этой задачи. Не рекомендуется использовать атрибуты, предназначенные для хранения временных переменных, или являющиеся просто заменителем описания локальных переменных в методах. Так, например, для класса “матрица” нельзя вводить атрибуты i, j, которые предназначены для того, что бы не описывать локальные переменные i и j в реализации каждого метода. Лишние атрибуты резко ухудшают читабельность программ и являются дополнительным источником ошибок.
Необходимое и достаточное количество свойств
Каждый класс должен содержать необходимое и достаточное количество свойств ( атрибутов и методов поведения ). Нужно избегать слишком слабого или слишком детального определения классов. Наиболее типичный класс должен включать не более 10 атрибутов и не более 10 методов поведения. При превышении этого количества стоит подумать о создании нового класса. Недостаточное количество свойств приведет к необходимости добавления их во всех производных класса, что замедлит повторное использование класса. Избыточность свойств приведет к тяжеловесности программы при выполнении и чтении.
Конструкторы
Каждый класс должен иметь конструктор, который в свою очередь должен инициализировать все атрибуты, даже если для конкретной задачи известно, что после конструктора всегда вызывается другой метод, устанавливающие новые значения атрибутов. Это устранит ошибки неправильной инициализации полей на весь жизненный цикл класса.
Конструктор всегда должен инициализировать только собственные атрибуты и не должен инициализировать наследуемые атрибуты. Для инициализации наследуемых атрибутов должен быть вызван конструктор базового класса. Даже если необходимо переопределить начальные значения одного или нескольких атрибутов базового класса, то сначала вызывается его конструктор, а затем значения атрибутов изменяются. Такой подход обеспечит легкую модификацию свойств базового класса, без необходимости просматривать реализацию методов всех производных классов.
Независимость от системных библиотек и реализации
Базовые классы не должны использовать операции ввода или вывода. Это связано с тем, что базовые классы часто будут использоваться, а это в свою очередь приводит к выводу о том, что данные для них часто будут формироваться с помощью других программ, а не вводиться пользователем. Если в методе “вставить” для хэш-таблицы будет использоваться ввод с клавиатуры для получения значения ключа, то такую таблицу невозможно будет использовать в компиляторе. Аналогичная ситуация сложится, если этот же метод после вставки выдаст на экран сообщение вида “вставка успешно завершена”.
Наследование
Наследование разделяется на две важные части:
· наследование атрибутов,
· наследование методов поведения.
Наследование атрибутов
Наследование атрибутов позволяет производному классу использовать атрибуты базового класса, без дополнительного их переопределения. Это дает возможность легкой модификации структур данных путем внесения минимальных изменений. Например, пусть классы геометрических фигур выглядят следующим образом:
Рис. 8.1. пример наследования атрибутов.
и пусть необходимо для каждой фигуры добавить атрибут “цвет заполнения внутренней области”. Наследование позволяет очень легко модифицировать группу структур данных за одну операцию. Но это можно сделать двумя способами: во-первых, можно ввести новый атрибут “цвет” в класс “геометрическая фигура” и по наследованию этот атрибут получат все новые фигуры, во-вторых, можно ввести новый класс “цветная фигура”, как наследника от “геометрической фигуры”. Посмотрим на различия этих двух вариантов:
новый класс увеличивает количество классов и следовательно сложность проекта,
точка изгиба в многоугольнике не должна иметь цвет.
Таким образом можно сказать, что добавляя новый атрибут в некоторый класс необходимо учесть следующие обстоятельства: можно добавить атрибут без добавления класс, но необходимо взвесить, что более накладно создать новый класс или иметь не нужные атрибуты в других классах.