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

 

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

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

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

Глава 4. Классы и функции: проектирование и объявление
Объявление в программе нового класса создает новый тип: создание класса эквивалентно созданию типа. Весьма вероятно, что у вас нет большого опыта создания типов, поскольку большинство языков не предоставляет нам возможности поупражняться в этом. В С++ создание типов имеет фундаментальное значение, и не только потому, что эта операция в принципе возможна, но и потому, что независимо от вашего желания вы производите ее всякий раз при объявлении классов.
Создание хороших классов - это сложная задача, поскольку создание типов требует усилий. Хороший тип имеет естественный синтаксис, интуитивную семантику и одну или несколько эффективных реализаций. В С++ плохо продуманное определение класса означает, что вы не добьетесь таких характеристик. Даже производительность зависит как от определения, так и от объявления функций-членов.
Как в таком случае решить задачу проектирования эффективных классов? Прежде всего вы должны разобраться с ограничениями, которые возникают при создании практически любого класса:
? как следует создавать и удалять объекты? От этого сильно зависит вид ваших конструкторов и деструкторов, равно как и ваших версий operator new, operator new [ ], operator delete и operator delete [ ], если вы их реализуете;
? отличается ли инициализация объекта от его присваивания? Ответ на этот вопрос определяет поведение конструкторов и операторов присваивания, а также различия между ними;
? что означает передача объекта нового типа по значению? Помните, именно конструктором копирования определяется, что означает передача по значению;
? каковы ограничения на значения нового типа? Эти ограничения определяют тип контроля ошибок, который необходимо осуществлять внутри функций-членов, особенно конструкторов и операторов присваивания. Это также может повлиять на генерируемые функциями исключения, и, при их использовании, на спецификацию исключений;
? каково место нового типа в иерархии классов? Если вы наследуете от существующих классов, неизбежно возникают определенные ограничения; от них зависит, например, виртуальны ли наследуемые вами функции. Если вы хотите, чтобы класс использовался как базовый, ваше решение повлияет на то, будут ли объявляемые функции виртуальными.
80
¦¦¦¦її
Классы и функции
? каковы допустимые преобразования типов? Если вы хотите разрешить неявное преобразование объектов типа А в объекты типа В, необходимо либо написать функцию преобразования типов в классе А, либо конструктор в классе В, который не объявлен как explicit и может вызываться с одним аргументом. Если вы хотите разрешить только явные преобразования типов, необходимо написать функции, выполняющие преобразования, избегая при этом операторов преобразования типов или не объявленных explicit конструкторов с одним аргументом;
? какие операторы и функции имеют смысл для нового типа? От ответа на этот вопрос зависит, какие функции вы определите для интерфейса класса;
? какие стандартные операторы и функции явно следует сделать недоступными? Их необходимо объявить закрытыми;
? кто должен иметь доступ к членам создаваемого типа? Этот вопрос поможет вам определить, какие члены должны быть открытыми, какие защищенными, а какие - закрытыми. Это также поможет вам установить, какие классы и/или функции должны быть дружественными, а также есть ли смысл вкладывать один класс в другой;
? насколько новый тип будет общим? Возможно, вы в действительности создаете не новый тип, а определяете целое семейство типов. Если это действительно так, вам нужно определить не новый класс, а шаблон класса.
Ответить на перечисленные вопросы нелегко, и поэтому создание эффективных классов - далеко не простое дело. Однако если взяться за него должным образом, определяемые пользователем классы С++ дают типы, которые почти неотличимы от встроенных, и это оправдывает все затраченные усилия.
Обсуждению деталей каждого из приведенных вопросов можно было бы посвятить отдельную книгу, поэтому нижеизложенные руководящие принципы не претендуют на всесторонность. Тем не менее они высвечивают наиболее важные вопросы проектирования, предостерегают против самых распространенных ошибок и предлагают решение проблем, часто встречающихся при проектировании классов. Многие из советов также применимы и для функций, не являющихся членами классов, так что в этом разделе помимо всего прочего рассматривается и проектирование, и объявления глобальных функций, и объявления функций в пространствах имен.
Правило 18. Стремитесь к таким
интерфейсам классов,
которые будут полными и минимальными
Пользовательский интерфейс класса - это интерфейс, доступный программистам, использующим данный класс. Обычно в таком интерфейсе присутствуют только функции, поскольку наличие в нем элементов данных имеет целый ряд недостатков (см. правило 20).
Попытки понять, какие функции должны присутствовать в пользовательском интерфейсе, могут просто свести с ума. Вы разрываетесь между двумя совершенно
равило 18 і
4
противоположными направлениями. С одной стороны, вам бы хотелось создать классы, которые будут просты для понимания, использования и реализации. Обычно это означает, что требуется достаточно небольшое количество функций, каждая из которых будет выполнять весьма узкую задачу. С другой стороны, хотелось бы, чтобы класс был разносторонним и удобным в применении, что обычно требует добавления функций для поддержки часто выполняемых задач. Как определить, какие функции должны войти в класс, а какие нет?
Предыдущая << 1 .. 29 30 31 32 33 34 < 35 > 36 37 38 39 40 41 .. 105 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100