|
Программирование >> Структурное программирование
Выгоды целостности данных не вытекают просто автоматически из того, что данные-элементы объявляются закрытыми. Программист должен обеспечивать проверку их правильности. С-Ы- предоставляет среду программирования, в которой программист может проектировать хорошие программы в удобной ему манере. Хороший стиль программирования 6.10 функции-элементы, которые записывают значения закрытых данных, должны проверять правильноаь предполагаемых новых значений; если они неправильные, то эти функции должны установить закрытые данные-элементы в соответствующее им непротиворечивое состояние. Клиенты класса должны быть уведомлены о попытке присвоить данным-элементам неверные значения. По этой причине функции записи данных-элементов класса часто оформляются так, чтобы они возвраш;али значения, указывающие на то, что была совершена попытка присвоить объекту класса неверное значение. Это дает возможность клиентам класса проверить значения, возвращаемые функцией записи, чтобы определить, является ли объект, которым они манипулируют, допустимым, и предпринять соответствующие действия, если объект недопустимый. В упражнениях вас попросят изменить программу на рис. 6.10 так, чтобы возвращать соответствующие значения ошибок из записывающих функций. Программа на рис. 6.10 расширяет наш класс Time так, чтобы он включал функции чтения и записи закрытых данных-элементов hour, minute и second. Функции записи жестко управляют установкой данных-элементов. Попытки задать любым данным-элементам неправильные значения вызывают присваивание этим данным-элементам нулевых значений (и, таким образом, приведение данных-элементов в непротиворечивое состояние). Каждая функция чтения просто возвращает соответствующее значение данных-элементов. Программа сначала использует функции записи, чтобы задать правильные значения закрытым данным-элементам объекта t класса Time, затем использует функцию чтения, чтобы вывести эти значения на экран. Далее функции записи пытаются задать элементам hour и second неправильные значения, а элементу minute - правильное, и затем функции чтения направляют эти значения на экран. Результат подтверждает, что неправильные значения вызывают установку данных-элементов в нулевое состояние. В итоге программа устанавливает время 11:58:00 и прибавляет 3 минуты при вызове функции incrementMinutes. Функция incrementMinutes не является элементом класса; поэтому она использует функции-элементы записи и чтения для соответствующего увеличения элемента minute. Это функционирует правильно, но снижает производительность из-за многократных вызовов функций. В следующей главе мы обсудим запись дружественных функций как средства устранения этого недостатка. Замечание по технике программирования 6.17 Задание закрытых данных-элементов и управление доступом к ним, особенно доступом к записи данных-элементов, посредством открытых функций-элементов помогает гарантировать целостность данных. Типичная ошибка программирования 6.8 Конструктор может вызывать другие функции-элементы класса такие, как функции записи и чтения. Но поскольку конструктор инициализирует объект, данные-элементы могут в этот момент еще не быть в непротиворечивом состоянии. Использование данных-элементов до того, как они получили соответствующие начальные значения, может вызвать ошибки. Функции записи особенно важны с точки зрения разработки программного обеспечения, поскольку они могут производить проверку правильности данных. Функции записи и чтения имеют и другие достоинства при разработке программного обеспечения. TIME3. Н Объявление класса Time. Функции-элементы, определены в TIME3.CPP Предотвращение многократного включения заголовочного файла #ifndef Т1МЕЗ Н ttdefine TIME3 Н class Time { public: Time(int = 0, int = 0, int функции записи void setTime(int, int, int) void setHour(int); void setMinute(int); void setSecond(int); функции чтения int getHour(); int getMinute () ; int getSecond(); = 0); конструктор установка часов, минут, секунд установка часа установка минут установка секунд возвращает час возвращает минуты возвращает секунды void printMilitaryО; void printStandardО; private: int hour; int minute; int second; выводит военное время выводит стандартное время 0-23 0-59 0-59 #endif Рис. 6.10. Объявление класса Time (часть1 из 4) I TIME3.CPP Определения функций-элементов класса Time, tinclude times.h tinclude <iostream.h> Функция конструктор для задания начальных значений I закрытых данных вызывает функцию-элемент setTime, чтобы Л установить значения переменных по умолчанию равными нулю Л (смотри определение класса). Я Time: .-Time (int hr, int min, int sec) { setTime(hr, min, sec); } Установка значений часов, минут, секунд, void Time::setTime(int h, int m, int s) tiour = (h >= 0 && h < 24) ? h : 0; minute = (m >= 0 && m < 60) ? m : 0; second = (s >= 0 && s < 60) ? s : 0; Установка значения часа void Time::setHour(int h) { hour = (h >= 0 && h < 24) ? h : 0;} Установка значения минут void Time::setMinute(int m) { minute = (m >= 0 && m < 60) ? m : 0; } Установка значения секунд void Time::setSecond(int s) { second = (s >= 0 && s < 60) ? s : 0; } Получение значения часа ;>;ч1 int Time: :getHour О { return hour; } *~ Получение значения минут int Time::getMinute{) { return minute; } 1* Получение значения секунд .* . int Time: :getSecond() { return second; } **** Отображение времени в военном формате: HH:MM:SS i\ void Time :: printMilitary () cout (hour < 10 ? 0 : ) hour : (minute < 10 ? 0 : ) minute : (second < 10 ? 0 : ) second; Отображение времени в стандартном формате: HH:MM:SS AM (или РМ) void Time:: printStandard () s cout ((hour == 0 I I hour == 12) ? 12 : hour % 12) : (minute < 10 ? 0 : ) minute : (second < 10 ? 0 : ) second (hour < 12 ? AM : PM ); Рис. 6.-10. Определения функций-элементов класса Time (часть 2 из 4)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |