Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Мизрохи С.В. -> "Turbo Pascal и объектно-ориентированное программирование" -> 40

Turbo Pascal и объектно-ориентированное программирование - Мизрохи С.В.

Мизрохи С.В. Turbo Pascal и объектно-ориентированное программирование — М.: Финансы и статистика , 1992. — 192 c.
ISBN 5-279-00903-2
Скачать (прямая ссылка): efektispolzc2000.djvu
Предыдущая << 1 .. 34 35 36 37 38 39 < 40 > 41 42 43 44 45 46 .. 105 >> Следующая

class AccessLevels { public:
int getReadOnly() const{ return readonly; } void setReadWrite(int value) { readWrite = value; } int getReadWrite() const { return readWrite; } void setWriteOnly(int value) { writeOnly = value; }
int readWrite; // Доступ для чтения-записи, int writeOnly; Il Доступ только для записи.
};
Все еще сомневаетесь? Тогда настало время привести самый весомый аргумент - функциональную абстракцию. Если вы реализуете доступ посредством Функции, то позднее можете заменить член класса вычислением, и никто из Пользователей вашего класса об этом не догадается.
Правило 20. Избегайте данных в открытом интерфейсе
Private:
int noAccess; int readonly;
Il Доступа к этому целому нет.
//А здесь доступ только для чтения.
90
Классы и функции
Например, предположим, что вы пишете приложение, в котором некоторое автоматическое оборудование отслеживает скорость проходящих мимо машин. Когда мимо проезжает машина, тут же вычисляется ее скорость, а затем эта величина добавляется к данным о скорости, собранным до этого момента:
class SpeedDataCollection { public:
void addValue(int speed) ; Il Добавляем новые данные, double averageSoFar () const; Il Возвращаем среднюю скорость. .
};
Теперь давайте рассмотрим возможные варианты реализации функции-члена averageSoFar. Один из способов - добавить член класса, который будет содержать среднюю величину всех собранных данных о скорости. При вызове функции averageSoFar она просто вернет значение этого члена класса. Другой подход -вычислять значение каждый раз при вызове функции, что можно сделать, располагая значениями всех элементов множества.
Первый подход - получение текущего среднего - увеличивает каждый объект SpeedDataCollection, поскольку вы должны выделить место для элемента данных, хранящего текущую среднюю величину. Зато можно очень эффективно реализовать averageSoFar: это просто встраиваемая функция (см. правило 33), которая возвращает значение члена класса. И наоборот, вычисление среднего при каждом вызове замедляет исполнение averageSoFar, но каждый объект SpeedDataCollection будет меньше.
Кто возьмется решить, что лучше? Что касается машин с ограниченным объемом памяти, если средние величины необходимы лишь изредка, то их вычисление при каждом вызове - наилучшее решение. В приложении, где средние значения нужны достаточно часто, где важна скорость, а не память, предпочтительно сохранение текущего среднего. Существенно то, что посредством доступа к среднему при помощи функции-члена вы можете использовать любую реализацию -а значит, получаете простор для действий, которого лишитесь, если решите включить текущее среднее в открытый интерфейс.
Подведем итог: включая данные в открытый интерфейс класса, вы сами напрашиваетесь на неприятности, поэтому обезопасьте себя, пряча все элементы данных за стеной функциональной абстракции. Сделайте это, и получите в награду последовательный подход и регулируемое управление доступом!
Правило 21. Везде, где только можно, используйте const
Замечательное свойство модификатора const состоит в том, что он накладывает определенное семантическое ограничение: данный объект не должен модифицироваться, - и компилятор будет проводить это ограничение в жизнь, const позволяет указать компилятору и программистам, что определенная величина должна оставаться инвариантной. Во всех подобных случаях вы должны обозначить это явным образом, призывая себе на помощь компилятор и гарантируя, что ограничение не будет нарушено.
равило 21
91
Ключевое слово const удивительно разносторонне. Вне классов вы може--е использовать его для глобальных констант или констант пространств имен ¦сМ. правила 1 и 47), а также для статических объектов (внутри файла или блока)- Внутри классов допустимо применять его для статических либо нестатических данных (см. также правило 12).
Для указателей вы можете об7>явить, является ли сам указатель const, одно-менно являются ли данные, на которые он указывает, const, или и то, и другое:
char *р = "Hello"; // Неконстантный указатель, неконстантные данные1, const char *р = "Hello"; // Неконстантный указатель, константные данные, char * const р = "Hello"; Il Константный указатель, неконстантные данные, const char * const р = "Hello"; Il Константный указатель, константные данные.
Этот синтаксис не так страшен, как кажется. Вы проводите в воображении вертикальную линию через звездочку объявления первого указателя, и если слово const располагается слева от линии, то, на что указывается, - константа; если const располагается справа от линии, сам указатель - константа; если const располагается по обе стороны, константа - и то, и другое.
Когда то, на что указывается, - константа, некоторые программисты ставят const перед идентификатором типа. Другие ставят const после идентификатора типа, но до звездочки. В результате следующие функции требуют аргументов одинакового типа:
class Widget {... } ;
void fl(const Widget *pw); Il fl требует указателя
11 на константный объект Widget, void f2(Widget const *pw); Il Аналогично ведет себя и f2 .
Предыдущая << 1 .. 34 35 36 37 38 39 < 40 > 41 42 43 44 45 46 .. 105 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100