Программирование >>  Структурное программирование 

1 ... 141 142 143 [ 144 ] 145 146 147 ... 342


Делайте все данные-элементы класса закрытыми. Используйте открытые функции-элементы для задания и получения значений закрытых данных-элементов. Такая архитектура помогает скрыть реализацию класса от его клиентов, что снижает число ошибок и улучшает модифицируемость программ.

Клиент класса может быть функцией-элементом другого класса или глобальной функцией.

По умолчанию доступ к элементам класса - private. Доступ к элементам класса можно явно установить как public, protected (как мы увидим в главе 9) или private. В отличие от этого доступ к элементам структуры struct по умолчанию - public. Доступ к элементам структуры struct также может быть установлен явно как public, protected или private.

Замечание по технике программирования 6.12

Разработчики классов используют доступ типа public, protected или private, чтобы обеспечить скрытие информации и принцип наименьших привилегий.

Заметим, что элементы класса по умолчанию являются закрытыми, так что никогда не возникает необходимости явно использовать спецификатор доступа к элементам private. Однако, многие программисты предпочитают сначала описывать интерфейс класса (т.е. открытые элементы класса), а затем перечислять закрытые элементы, откуда вытекает необходимость явного использования в определении класса спецификатора доступа к элементам private.

Хороший стиль программирования 6.6

Использование спецификаторов доступа к элементам public, protected и private

лишь по одному разу в любом определении класса позволяет избежать путаницы.

Из того, что данные класса закрытые, не следует, что клиенты не могут изменять эти данные. Данные могут быть изменены функциями-элементами или друзьями этого класса. Как мы увидим, эти функции должны быть спроектированы так, чтобы гарантировать целостность данных.

Доступ к закрытым данным класса должен тщательно контролироваться использованием функций-элементов, называемых функциями доступа. Например, чтобы разрешить клиентам прочитать закрытое значение данных, класс может иметь функцию получить ( get ). Чтобы дать клиентам возможность изменять закрытые данные, класс может иметь функцию установить ( set ). Казалось бы, подобные изменения противоречат смыслу закрытых данных. Но фзшкция-элемент set (установить) может обеспечить проверку правильности данных (например, проверку диапазона) и дать уве-

Хороший стиль программирования 6.5

Несмотря на то, что спецификаторы public и private могут повторяться и чередоваться, перечисляйте сначала все элементы класса открытой группы, а затем все элементы закрытой группы. Это концентрирует внимание клиентов класса в большей степени на его открытом интерфейсе, чем на реализации класса.

Замечание по технике программирования 6.11



ренность в том, что данные установлены верно. Функция set может также быть переводчиком между формой данных, используемой в интерфейсе, и формой, используемой в реализации. Функция get (получить) не требует представления данных в сыром , необработанном виде; функция get может редактировать данные и ограничивать область данных, видимых клиенту.

Замечание по технике программирования 6.13

Разработчик класса не обязательно должен снабжать каждый элемент закрытых дан -ных функциями get и set; такие возможности должны быть обеспечены, только тогда, когда это имеет смысл, и лишь поспе тщательного обдумывания разработчиком класса.

Замечание по технике программирования 6.14

Задание данных-элементов класса закрытыми, а функций-элементов класса открытыми облегчает отладку, так как проблемы с манипуляциями данных локализуются в рамках либо функций-элементов класса, либо друзей класса.

6.9. Функции доступа и обслуживающие функции-утилиты

Не все функции-элементы необходимо делать открытыми как часть интерфейса класса. Некоторые функции-элементы оставляются закрытыми и служат обслуживающими функциями-утилитами для других функций класса.

Замечание по технике программирования 6.15

Функции-элементы можно разбить на ряд категорий: функции, которые читают и возвращают значения закрытых данных-элементов; функции, которые устанавливают значения закрытых данных-элементов; функции, которые реализуют возможности класса; функции, которые выполняют для класса различные вспомогательные операции, такие, как задание начальных значений объектам класса, присваивания объектам класса, преобразования между классами и встроенными типами или между классами и другими классами, вьщеление памяти для объектов класса.

Функции доступа могут читать или отображать данные. Другим типичным применением функций доступа является проверка истинности или ложности условий - такие функции часто называют предикатными функциями. Примером предикатной функции могла бы быть функция isEmpty для любого класса контейнера - класса, способного содержать внутри себя много объектов, например, связного списка, стека или очереди. Программа проверяла бы функцию isEmpty прежде, чем пытаться прочесть очередной элемент из объекта контейнера. Предикатная функция isFull могла бы проверять объект класса контейнер, чтобы выяснить, имеется ли в нем дополнительное пространство.

Рис. 6.7 демонстрирует запись функции-утилиты. Функция-утилита не является частью интерфейса класса. Она является закрытой функцией-элементом, которая поддерживает работу открытых функций-элементов класса. Функции-утилиты не предназначены для использования клиентами класса.



#ifndef SALESP H #define SALESP H

class Salesperson { public:

Salesperson 0; конструктор

void setSales(int, double); Установка введенных

void printAnnualSales() ;

пользователем сведений о продажах за один месяц.

private:

double sales[12]; сведения о продажах за 12 месяцев

double totalAnnualSales(); функция-утилита

#endif

Рис. 6.7. Использование функции-утилиты (часть! из 3)

SALESP.CPP

Функции-элементы класса Salesperson iinclude <iostream.h> iinclude <iomanip.h> iinclude salesp.h

Функция конструктор присваивает начальные значения массиву

Salesperson::Salesperson()

for (int i = 0; i < 12; i++) sales [ i ] = 0.0;

Функция установки сведений о продажах за 1 из 12 месяцев

void Salesperson::setSales(int month, double amount)

if (month >= 1 && month <= 12 && amount > 0)

sales[month - 1] = amount; else

cout << Ошибочный месяц или сведения о продажах << endl;

Закрытая функция-утилита для суммирования продаж за год

double Salesperson::totalAnnualSales()

Класс Salesperson имеет массив, содержащий 12 сведений о месячных продажах, которым с помощью конструктора присвоены нулевые начальные значения и которым значения, задаваемые пользователем, устанавливаются с помощью функции setSales. Открытая функция-элемент printAnnualSales печатает сумму продаж за последние 12 месяцев. Функция-утилита totalАп-nuaiSales суммирует сведения о продажах за 12 месяцев, обеспечивая работу printAnnualSales. Функция-элемент printAnnualSales редактирует сведения о продажах и переводит их в формат суммы долларов.

SALESP.H

I Определение класса Salesperson

Функции-элементы, описаны в SALESP.CPP

If



1 ... 141 142 143 [ 144 ] 145 146 147 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика