- представлять полное и согласованное множество понятий для
пользователя,
- быть согласованным для всех частей компонента,
- скрывать специфику реализации от пользователя,
- допускать несколько реализаций,
- иметь статическую систему типов,
- определяться с помощью типов из области приложения,
- зависеть от других интерфейсов лишь частично и вполне определенным
образом.
Отметив необходимость согласованности для всех классов, которые
образуют интерфейс компонента с остальным миром, мы можем упростить
вопрос интерфейса, рассмотрев только один класс, например:
class X { // пример плохого определения интерфейса
Y a;
Z b;
public:
void f(constchar* ...);
void g(int[],int);
void set_a(Y&);
Y& get_a();
};
В этом интерфейсе содержится ряд потенциальных проблем:
-Типы Y и Z используются так, что определения Y и Z должны быть
известны во время трансляции.
- У функции X::f может быть произвольное число параметров
неизвестного типа (возможно, они каким-то образом контролируются
"строкой формата", которая передается в качестве первого
параметра).
- Функция X::g имеет параметр типа int[]. Возможно это нормально,
но обычно это свидетельствует о том, что определение слишком
низкого уровня абстракции. Массив целых не является достаточным
определением, так как неизвестно из скольких он может
состоять элементов.
- Функции set_a() и get_a(), по всей видимости, раскрывают
представление объектов класса X, разрешая прямой доступ
к X::a.
Здесь функции-члены образуют интерфейс на слишком низком уровне
абстракции. Как правило классы с интерфейсом такого уровня относятся
к специфике реализации большого компонента, если они вообще могут
к чему-нибудь относиться. В идеале параметр функции из интерфейса
должен сопровождаться такой информацией, которой достаточно
для его понимания. Можно сформулировать такое правило: надо уметь
передавать запросы на обслуживание удаленному серверу по узкому
каналу.
Язык С++ раскрывает представление класса как часть интерфейса.
Это представление может быть скрытым (с помощью private или
protected), но обязательно доступным транслятору, чтобы он мог разместить
автоматические (локальные) переменные, сделать подстановку тела
функции и т.д. Отрицательным следствием этого является то, что
использование типов классов в представлении класса может привести к
возникновению нежелательных зависимостей. Приведет ли использование
членов типа Y и Z к проблемам, зависит от того, каковы в действительности
типы Y и Z. Если это достаточно простые типы, наподобие complex или
String, то их использование будет вполне допустимым в большинстве случаев.
Такие типы можно считать устойчивыми, и необходимость включать
определения их классов будет вполне допустимой нагрузкой для транслятора.
Если же Y и Z сами являются классами интерфейса большого
компонента (например, типа графической системы или системы обеспечения
банковских счетов), то прямую зависимость от них можно считать
неразумной. В таких случаях предпочтительнее использовать член,
являющийся указателем или ссылкой:
class X {
Y* a;
Z& b;
// ...
};
При этом способе определение X отделяется от определений Y и Z, т.е.
теперь определение X зависит только от имен Y и Z. Реализация X,
конечно, будет по-прежнему зависеть от определений Y и Z, но это
уже не будет оказывать неблагоприятного влияния на пользователей X.
Вышесказанное иллюстрирует важное утверждение: У интерфейса,
скрывающего значительный объем информации (что и должен делать полезный
интерфейс), должно быть существенно меньше зависимостей, чем
у реализации, которая их скрывает. Например, определение класса X
можно транслировать без доступа к определениям Y и Z. Однако,
в определениях функций-членов класса X, которые работают со
ссылками на объекты Y и Z, доступ к определениям Y и Z необходим.
При анализе зависимостей следует рассматривать раздельно
зависимости в интерфейсе и в реализации. В идеале для обоих видов
зависимостей граф зависимостей системы должен быть направленным
нецикличным графом, что облегчает понимание и тестирование
системы. Однако, эта цель более важна и чаще достижима для
реализаций, чем для интерфейсов.
Отметим, что класс определяет три интерфейса:
class X {
private:
// доступно только для членов и друзей
protected:
// доступно только для членов и друзей, а также
// для членов и друзей производных классов
public:
// общедоступно
};
Члены должны образовывать самый ограниченный из возможных интерфейсов.
Иными словами, член должен быть описан как private, если нет
причин для более широкого доступа к нему; если же таковые есть, то
член должен быть описан как protected, если нет дополнительных причин
задать его как public. В большинстве случаев плохо задавать все данные,
представляемые членами, как public. Функции и классы, образующие общий
интерфейс, должны быть спроектированы таким образом, чтобы представление
класса совпадало с его ролью в проекте как средства представления
понятий. Напомним, что друзья являются частью общего интерфейса.
Отметим, что абстрактные классы можно использовать для
представления понятия упрятывания более высокого уровня ($$1.4.6,
$$6.3, $$13.3).
Программирование, блок
схема, программа, информатика, алгоритм, управление, система управления, разделяй
властвуй, языки программирования, линейное программирование, сложность, книги
программирование, организация, развитие, проектирование, самосовершенствование,
развитие систем, программирование скачать, программирование c, задачи программирование,
динамическое программирование, ориентированное программирование, методы программирования,
объектно программирование, примеры программирования, задача линейного программирования,
основы программирования, объектно ориентированное программирование, программирование
учебник, технология программирования, программирование си, программирование
скачать книги, исходники, исходники на c, c, с, програмирование, книги по с,
разработка программ, государственное управление, методы управления, управление
организацией, структуры управления, управление проектами, управление рисками,
теории управления, скачать управление, процесс управления, исследование управления,
программа управления, схемы управления, информационное управление, управление
образования, стратегическое управление, исследование систем управления, социальное
управление, функции управления, технология управления, модели управления, блок
управления, организационное управление, менеджмент управления, психология управления,
управление ресурсами, управление производством, принципы управления, корпоративное
управление, управление работами, дистанционное управление, эффективность управления,
управление компьютером, пульты управления, проблемы управления, области управления,
основы управления, управление конфликтами, обеспечение управления, управление
деятельностью, анализ управления, автоматизированное управление, стили управления,
организационные структуры управления, автоматическое управление, современное
управление, подходы управления, управление службами, стратегии управления, социология
управления, управление развитием, объект управления, информационные технологии
управления, автоматизированные системы управления, совершенствование управления,
управление средствами, управление потоками, оперативное управление, механизм
управления, управление удаленным, примеры управления, управление через, понятие
управление, особенности управления, задачи управления, сфера управления, управление
культуры, право управления, управление собственностью, управление книги, концепция
управления, управление трудом, панель управления, опыт управления, информационные
системы управления, формы управления, роль управления, политика управления,
контроль управления, организация, управление организацией, организация труда,
организация производства, теория организации, организация система, организация
учета, структура организации, формы организации, анализ организации, принципы
организации, организация процессов, развитие организации, пример организации
, среда организации, организация контроля, метод организации, внутренняя организация,
стратегии организации, понятие организация, уровни организации, основы организации,
функции организации, современная организация, организация проекта, развитие,
перспективы развития, этапы развития, программа развития, тенденции развития,
развитие систем, стратегия развития, проблемы развития, концепция развития,
развитие личности, дети развитие, современное развитие, развитие ребенка, план
развития, теория развития, психология развития, особенности развития, развитие
техники, развитие человека, развитие образования, устойчивое развитие, развитие
памяти, фактор развития, развитие способностей, управление развитием, развитие
связи, развитие технологии, развитие мышления, направления развития, пути развития,
модели развития, русское развитие, развитие жизни, основные этапы развития,
развитие страны, возникновение развитие, стратегическое развитие, развитие информационного
развития, скачать развитие, развитие персонала, методы развития, творческое
развитие, развитие языка, развитие школьника, проектирование, проектирование
систем, проектирование программа, нормы проектирования, проектирование информационных,
проектирование данных, проектирование информационной системы, проектирование
базы, организационное проектирование, основы проектирования, автоматизированное
проектирование, проектирование скачать, организация проектирования, методы проектирования,
управление проектирование, технологическое проектирование, проектирование процессов,
этапы проектирования, системы автоматизированного проектирования