Книга: Технологии программирования
8.8.3. Шаг 2. Уточнение классов с определением набора операций (методов) для каждого
8.8.3. Шаг 2. Уточнение классов с определением набора операций (методов) для каждого
В действительности нельзя разделить процессы определения классов и выяснения того, какие операции для них нужны. Однако на практике они различаются, поскольку при определении классов внимание концентрируется на основных понятиях, не останавливаясь на программистских вопросах их реализации, тогда как при определении операций прежде всего сосредоточиваются на том, чтобы задать полный и удобный набор операций. Часто бывает слишком трудно совместить оба подхода, в особенности, учитывая, что связанные классы надо проектировать одновременно.
Возможно несколько подходов к процессу определения набора операций. Предлагаем следующую стратегию:
— рассмотрите, каким образом объект класса будет создаваться, копироваться (если нужно) и уничтожаться;
— определите минимальный набор операций, необходимый для понятия, представленного классом;
— рассмотрите операции, которые могут быть добавлены для удобства записи, и включите только несколько действительно важных;
— рассмотрите, какие операции можно считать тривиальными, т. е. такими, для которых класс выступает в роли интерфейса для реализации производного класса;
— рассмотрите, какой общности именования и функциональности можно достигнуть для всех классов компонента.
Очевидно, что это стратегия минимализма. Гораздо проще добавить любую функцию, приносящую ощутимую пользу, и сделать все операции виртуальными. Но чем больше функций, тем больше вероятность, что они не будут использоваться, наложат определенные ограничения на реализацию и затруднят эволюцию системы. Гораздо легче включить в интерфейс еще одну функцию, как только установлена потребность в ней, чем удалить ее оттуда, когда уже она стала привычной.
Причина, по которой мы требуем явного принятия решения о виртуальности данной функции, не оставляя его на стадию реализации, в том, что, объявив функцию виртуальной, существенно повлияем на использование ее класса и на взаимоотношения этого класса с другими.
При определении набора операций (методов) больше внимания следует уделять тому, что надо сделать, а не тому, как это сделать.
Иногда полезно классифицировать операции класса по тому, как они работают с внутренним состоянием объектов:
1) базовые операции: конструкторы, деструкторы, операции копирования;
2) селекторы: операции, не изменяющие состояния объекта;
3) модификаторы: операции, изменяющие состояние объекта;
4) операции преобразований, т. е. операции, порождающие объект другого типа, исходя из значения (состояния) объекта, к которому они применяются;
5) повторители: операции, которые открывают доступ к объектам класса или используют последовательность объектов.
Кроме уже перечисленных групп методов, в классы могут быть введены дополнительные методы самотестирования и проверки корректности данных. Это не есть разбиение на ортогональные группы операций. Например, повторитель может быть спроектирован как селектор или модификатор.
Выделение этих групп просто предназначено помочь в процессе проектирования интерфейса класса. Конечно, допустима и другая классификация.
- 8.8.1. Укрупненное изложение проектной процедуры Б. Страуструпа
- 8.8.2. Шаг 1. Выделение понятий и установление основных связей между ними
- 8.8.3. Шаг 2. Уточнение классов с определением набора операций (методов) для каждого
- 8.8.4. Шаг 3. Уточнение классов с точным определением их зависимостей от других классов
- 8.8.5. Шаг 4. Задание интерфейсов классов
- 8.8.6. Перестройка иерархии классов
- 8.8.7. Свод правил
- 8.8.8. Пример простейшего проекта
- Пошаговые инструкции для перехода на 3-й диалект
- Семерка - первый шаг нового семейства
- Шаг 1. Приветствие
- Множественные интерфейсы и имена методов
- 4. Свойства унарных операций
- 3. Свойства бинарных операций
- 4. Варианты операций соединения
- Шаг 1
- Перегрузка методов с несколькими параметрами типа
- Шаг 6 Завершение продажи на кассе, предложение сопутствующих товаров
- Первые шаги в нефтяном деле
- 3.6. Шаг 5. Балансировка ассортимента по глубине