Шаг 2: определение набора операций




Уточните определения классов, указав набор операций для каждого.В действительности нельзя разделить процессы определения классов ивыяснения того, какие операции для них нужны. Однако, на практикеони различаются, поскольку при определении классов вниманиеконцентрируется на основных понятиях, не останавливаясьна программистских вопросах их реализации, тогда как при определенииопераций прежде всего сосредотачивается на том, чтобы задать полный иудобный набор операций. Часто бывает слишком трудно совместить обаподхода, в особенности, учитывая, что связанные классы надопроектировать одновременно. Возможно несколько подходов к процессу определения набора операций.Предлагаем следующую стратегию: [1] Рассмотрите, каким образом объект класса будет создаваться, копироваться (если нужно) и уничтожаться. [2] Определите минимальный набор операций, который необходим для понятия, представленного классом. [3] Рассмотрите операции, которые могут быть добавлены для удобства записи, и включите только несколько действительно важных. [4] Рассмотрите, какие операции можно считать тривиальными, т.е. такими, для которых класс выступает в роли интерфейса для реализации производного класса. [5] Рассмотрите, какой общности именования и функциональности можно достигнуть для всех классов компонента.Очевидно, что это - стратегия минимализма. Гораздо проще добавлятьлюбую функцию, приносящую ощутимую пользу, и сделать все операциивиртуальными. Но, чем больше функций, тем больше вероятность, чтоони не будут использоваться, наложат определенные ограничения нареализацию и затруднят эволюцию системы. Так, функции, которыемогут непосредственно читать и писать в переменную состояния объектаиз класса, вынуждают использовать единственный способ реализации изначительно сокращают возможности перепроектирования. Такие функцииснижают уровень абстракции от понятия до его конкретной реализации.К тому же добавление функций добавляет работы программисту идаже разработчику, когда он вернется к проектированию. Гораздолегче включить в интерфейс еще одну функцию, как толькоустановлена потребность в ней, чем удалить ее оттуда, когда ужеона стала привычной. Причина, по которой мы требуем явного принятия решения овиртуальности данной функции, не оставляя его на стадию реализации,в том, что, объявив функцию виртуальной, мы существенно повлияемна использование ее класса и на взаимоотношения этого класса сдругими. Объекты из класса, имеющего хотя бы одну виртуальнуюфункцию, требуют нетривиального распределения памяти, если сравнитьих с объектами из таких языков как С или Фортран. Класс с хотя быодной виртуальной функцией по сути выступает в роли интерфейсапо отношению к классам, которые "еще могут быть определены", авиртуальная функция предполагает зависимость от классов, которые"еще могу быть определены" (см. $$12.2.3) Отметим, что стратегия минимализма требует, пожалуй, большихусилий со стороны разработчика. При определении набора операций больше внимания следует уделятьтому, что надо сделать, а не тому, как это делать. Иногда полезно классифицировать операции класса по тому,как они работают с внутренним состоянием объектов: - Базовые операции: конструкторы, деструкторы, операции копирования. - Селекторы: операции, не изменяющие состояния объекта. - Модификаторы: операции, изменяющие состояние объекта. - Операции преобразований, т.е. операции порождающие объект другого типа, исходя из значения (состояния) объекта, к которому они применяются. - Повторители: операции, которые открывают доступ к объектам класса или используют последовательность объектов.Это не есть разбиение на ортогональные группы операций. Например,повторитель может быть спроектирован как селектор или модификатор.Выделение этих групп просто предназначено помочь в процессепроектирования интерфейса класса. Конечно, допустима и другаяклассификация. Проведение такой классификации особенно полезно дляподдержания непротиворечивости между классами в рамках одногокомпонента. В языке С++ есть конструкция, помогающая заданию селекторов имодификаторов в виде функции-члена со спецификацией const и без нее.Кроме того, есть средства, позволяющие явно задать конструкторы,деструкторы и функции преобразования. Операция копирования реализуетсяс помощью операций присваивания и конструкторов копирования.


Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: