"Мюррэй Хилл, Бьярн Страустрап. Язык С++" - читать интересную книгу авторанемного подумать над задачей и предлагаемым решением вместо того,
чтобы сразу начинать "программировать вокруг" сложностей. Проще всего иметь дело с такими понятиями, которые имеют традиционную математическую форму: числа всех видов, множества, геометрические фигуры и т.п. На самом деле, следовало бы иметь стандартные библиотеки классов, представляющих такие понятия, но к моменту написания это не имело места. C++ еще молод, и его библиотеки не развились еще до той же степени, что и сам язык. Понятие не существует в пустоте, всегда есть группы связанных между собой понятий. Организовать в программе взаимоотношения между классами, то есть определить точную взаимосвязь между различными понятиями, часто труднее, чем сначала спланировать отдельные классы. Лучше, чтобы не получилось неразберихи, когда каждый класс (понятие) зависит от всех остальных. Рассмотрим два класса, A и B. Взаимосвязи вроде "A вызывает функции из B", "A создает объекты B" и "A имеет члены B" редко вызывают большие сложности, а взаимосвязь вроде "A использует данные из B" обычно можно исключить (просто не используйте открытые данные-члены). Неприятными, как правило, являются взаимосвязи, которые по своей природе имеют вид "A есть B и ...". Одним из наиболее мощных интеллектуальных средств, позволяющих справляться со сложностью, является иерархическое упорядочение, то есть организация связанных между собой понятий в древовидную структуру с самым общим понятием в корне. В C++ такие структуры представляются производными классами. Часто можно организавать задает набор базовых классов, каждый из которых имеет свое собственное множество производных классов. Для определения набора действий для самой общей интерпретации понятия (базового класса) часто можно использовать виртуальные функции (#7.2.8). Интерпретацию этих действий можно, в случае необходимости, - стр 17 - усовершенствовать для отдельных специальных классов (производных классов). Естественно, такая организация имеет свои ограничения. В частности, множество понятий иногда лучше организуется в виде ациклического графа, в котором понятие может непосредственно зависеть от более чем одного другого понятия; например, "A есть B и C и ...". В C++ нет непосредственной поддержки этого, но подобные связи можно представить, немного потеряв в элегантности и сделав малость дополнительной работы (#7.2.5). Иногда для организации понятий некоторой программы оказывается непригоден даже ациклический граф; некоторые понятия оказываются взаимозависимыми по своей природе. Если множество взаимозависимых классов настолько мало, что его легко себе представить, то циклические зависимости не должны вызвать сложностей. Для представления множеств взаимозависимых классов с C++ можно использовать идею friend классов (#5.4.1). |
|
|