Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Совершенный код. Мастер-класс - Макконнелл С.

Макконнелл С. Совершенный код. Мастер-класс — М.: Русская редакция, 2005. — 896 c.
ISBN: 5-469-00822-3
Скачать (прямая ссылка): soversheniykodmasterklass2005.djvu
Предыдущая << 1 .. 73 74 75 76 77 78 < 79 > 80 81 82 83 84 85 .. 426 >> Следующая

вывести несколько общих правил:
¦ минимизируйте доступность классов и их членов;
¦ избегайте дружественных классов, потому что они связаны
жестко;
¦ делайте данные базового класса закрытыми, а не защищенными:
это ослабляет сопряжение производных классов с базовым;
¦ не включайте данные-члены в открытый интерфейс класса;
¦ остерегайтесь семантических нарушений инкапсуляции;
¦ соблюдайте "Правило Деметры" (см. раздел 6.3).
Сопряжение идет рука об руку с абстракцией и инкапсуляцией.
Жесткое сопряжение наблюдается при неудачной абстракции или
нарушениях инкапсуляции. Если класс предлагает неполный набор
услуг, другие методы могут попытаться прочитать или записать
его данные непосредственно. Это открывает класс, превращая его
из черного ящика в прозрачный, и практически устраняет
инкапсуляцию.
6.3. Вопросы проектирования и реализации
Для создания высококачественной программы недостаточно
определить удачные интерфейсы классов - не менее важно
грамотно спроектировать и реализовать внутреннее устройство
классов. В этом разделе мы обсудим вопросы, связанные с
включением, наследованием, методами/данными-членами,
сопряжением классов, конструкторами, а также объектами-
значениями и объектами-ссылками.
Включение (отношение "содержит")
Сущность включения (containment) проста: один класс содержит
примитивный элемент данных или другой класс. Наследованию в
литературе уделяют гораздо больше внимания, но это объясняется
его сложностью и подверженностью ошибкам, а не тем, что оно
лучше включения. Включение - один из главных инструментов
объектно-ориентированного программирования.
6-403
140
ЧАСТЬ II Высококачественный код
Реализуйте с помощью включения отношение"содержит" Включение
можно рассматривать как отношение "содержит". Например, объект
"сотрудник" может "содержать" фамилию, номер телефона,
идентификационный номер налогоплательщика и т. д. Это
отношение можно реализовать, сделав фамилию, номер телефона и
номер налогоплательщика данными-членами класса Employee.
В самом крайнем случае реализуйте отношение "содержит" при
помощи закрытого наследования Иногда включение не получается
реализовать, делая один объект членом другого. Некоторые
эксперты советуют при этом выполнять закрытое наследование
класса-контейнера от класса, который должен в нем содержаться
(Meyers, 1998; Sutter, 2000). Главным мотивом такого решения
является предоставление классу-контейнеру доступа к защищенным
методам/данным-чле- нам содержащегося в нем класса. На
практике этот подход устанавливает слишком близкие отношения
между дочерним и родительским классом, нарушая инкапсуляцию.
Обычно это указывает на ошибки проектирования, которые следует
решить иначе, не прибегая к закрытому наследованию.
Настороженно относитесь к классам, содержащим более семи
элементов данных-членов При выполнении других заданий человек
может удерживать в памяти 7±2 дискретных элементов (Miller,
1956). Если класс содержит более семи элементов данных-членов,
подумайте, не разделить ли его на несколько менее крупных
классов (Riel, 1996). Можете ориентироваться на верхнюю
границу диапазона "7±2", если данные-члены являются
примитивными типами, такими как целые числа и строки, и на
нижнюю, если они являются сложными объектами.
Наследование (отношение "является")
Наследование подразумевает, что один класс является более
специализированным вариантом другого класса. Цель наследования
- создать более простой код, что достигается путем определения
базового класса, идентифицирующего общие элементы двух или
более производных классов. Общими элементами могут быть
интерфейсы методов, их реализация, данные-члены или типы
данных. Наследование помогает избегать повторения кода и
данных в нескольких местах, централизуя их в базовом классе.
Планируя использовать наследование, вы должны принять
несколько решений.
¦ Будет ли конкретный метод-член доступен производным классам?
Будет ли он иметь реализацию по умолчанию? Можно ли будет
переопределить его реализацию по умолчанию?
¦ Будут ли конкретные данные-члены (в том числе переменные,
именованные константы, перечисления и т. д.) доступны
производным классам?
Ниже аспекты этих решений обсуждаются подробнее.
Реализуйте при помощи открытого наследования
Самое важное правило обшт- J г г
но-ориентированного програм- отношение "является* Если
программист решает создать
мирования на C++ такоао: от- новый класс путем наследования
его от существующего
крытое наследование означает класса, он по сути говорит, что
новый класс "является" бо-
"явяяется". Запомните m лее специализированной версией
существующего класса.
Стгт Шйерс {Scott Meyers)
ГЛАВА 6 Классы 141
Базовый класс формулирует ожидания и ограничения, которым
должен будет соответствовать производный класс (Meyers, 1998).
Если производный класс не собирается полностью придерживаться
контракта, определенного интерфейсом базового класса,
наследование выполнять не стоит. Попробуйте вместо этого
Предыдущая << 1 .. 73 74 75 76 77 78 < 79 > 80 81 82 83 84 85 .. 426 >> Следующая