Программирование >>  Полиморфизм без виртуальных функций в с++ 

1 ... 129 130 131 [ 132 ] 133 134 135 ... 144


Вместо этого можно явно указать, что использование квалификатора является излишним для отдельного имени из конкретного пространства имен. Для этого служит using-объявление:

using А::String;

String s2 = Nicholas ; то же, что A::String

void g2()

using A::f; вводим локальный синоним для f из А f(2); то же, что А::f

Using-объявление вводит синоним для некоторого имени в локальную область действия.

В.место этого мы можем сделать доступными без квалификации все имена из некоторой библиотеки с помощью using-директивы:

using namespace А; сделать доступными все имена из А

String s3 = Marian ; то же, что A::s3

void дЗ() {

f (3) ; / / то же, что А: : f

Using-директива не вводит имена из указанного пространства имен в локальную область действия, а просто делает их доступными.

В мое.м первоначальном проекте у using-директив был более простой и лаконичный синтаксис:

using А; означает using namespace А;

Это привело к путанице: вместо using-директив использовали using-объявле-ния и наоборот. С введением более явного синтаксиса неразбериха исчезла. Также упростился синтаксический анализатор.

Я предвидел, что пользователи захотят избегать длинных имен. Поэтому в первоначальном проекте в одном using-объявлении было разрешено указывать имена нескольких членов:

using X::(f,g,h);

Однако это неудачно, равно как и все рассмотренные нами альтернативы. Точнее, каждая из обсуждавшихся альтернатив хоть кем-то была признана неудачной. Получив некоторый опыт работы с пространствами имен, я понял, что потребность в таких списках возникает куда реже, чем ожидалось. Кроме того, при чтении кода я обычно не обращал внимания на такие списки, так как они слишком похожи на объявления функций. Поэтому вместо них я стал употреблять повторные using-объявления:

using X::f; using X::g using X::h



Вот почему в окончательном варианте для задания списка имен в using-объяв-лении не осталось специального синтаксиса.

Пространства имен - это пример средства, которое после экспериментирования значительно упростилось. Реализовать его также оказалось легко, поскольку пространства имен прекрасно укладываются в общую концепцию классов и областей действия С++.

17.4.1. Мнения по поводу пространств имен

После неоднократных попыток согласовать противоречивые взгляды на то, что именно требуется от пространств имен в больших программах, выкристаллизовались три способа доступа к именам. Одни пользователи настаивали, что надежную и поддающуюся сопровождению программу можно построить только в том случае, если каждое применение нелокального имени будет явно квалифицировано. Естественно, что сторонники данной точки зрения весьма сомневались в полезности using-объявлений и уж тем более using-директив.

Другие осуждают явную квалификацию за излишнюю многословность, которая якобы затрудняет изменение кода, ограничивает гибкость и лишает практического смысла переход к использованию пространств имен. Разумеется, такие люди выступают за using-директивы и иные механизмы, позволяющие заменять длинные квалифицированные имена короткими синонимами.

Я с сочувствием отношусь к смягченным вариантам той и другой точек зрения, поэтому при работе с пространствами имен допустим любой стиль. Как обычно, ничто не мешает конкретной организации составить руководство по стилю программирования, в котором будут описаны корпоративные требования. Но заставлять всех программистов им следовать, вводя некоторое языковое правило, было бы неразумно.

Многие не без оснований опасаются исчезновения обычных неквалифицированных имен. Речь идет о привязке имени не к тому объекту или функции, которые имел в виду программист. Каждый программист на С хотя бы однажды сталкивался с данным явлением. Явная квалификация практически снимает эту проблему. К тому же ряду относится опасение, что будет трудно найти объявление имени и догадаться о смысле содержащего его выражения. Явная квалификация содержит столь очевидные указания, что часто и искать-то объявление не нужно: сочетания имени библиотеки с именем функции бывает вполне достаточным для понимания смысла выражения. Поэтому необычные или нечасто используемые нелокальные имена лучше квалифицировать явно; код от этого только станет яснее.

С другой стороны, явная квалификация имен, о которых все знают (или должны знать), и тех, которые часто используются, может быстро надоесть. Например, запись stdio: :printf, math: :sqrt, iostream: :cout вряд ли хоть чем-то поможет человеку, знакомому с С++, а никому не нужная громоздкость становится источником ошибок. Это сильный аргумент в пользу using-объявлений и using-директив. При этом using-объявления - более избирательный и потому гораздо менее опасный механизм. Using-директива

using namespace X;



делает видимым неизвестное множество имен. В частности, сегодня это множество может быть одним, а завтра, после внесения изменений в X, - совершенно другим. Те, кому такой подход не нравится, могут явно указать нужные им имена из X в using-объявлениях:

using X::f using X::g using X::h

Ho иногда возможность ползп1ить доступ к каждому имени из пространства имен, не перечисляя их все, с автоматическим изменением множества доступных имен после модификации определения X - как раз то, что нужно.

17.4.2. Внедрение пространств имен

Принимая во внимание наличие миллионов строк кода на C-i-f-, зависяших от использования глобальных имен и сушествуюших библиотек, я полагал, что самый важный вопрос о пространствах имен - как их внедрить? Неважно, насколько изяшно выглядит код, в котором применяются пространства имен, если ни у пользователей, ни у поставшиков библиотек нет пути для перехода к применению нового механизма. Требовать масштабного переписывания кода - это, конечно, не вариант.

Рассмотрим каноническую программу на С, с которой всегда начинают обучение этому языку:

#include <stdio.h>

int main О {

printf( Hello, worldNn );

Эта программа не должна переставать работать. Не нравится мне и предложение считать стандартные библиотеки особым случаем. Я признаю очень важной возможность применения механизма пространств имен к стандартным библиотекам на обших основаниях. Но комитет по стандартизации не вправе требовать для своих библиотек привилегий, которые не в состоянии предоставить поставшикам других библиотек.

Ключом к решению этой задачи являются using-директивы. Например, файл stdio. h помешается в пространство имен:

stdio.h;

namespace std { ...

int printf(const char* ... ); ...

using namespace std;



1 ... 129 130 131 [ 132 ] 133 134 135 ... 144

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика