|
Программирование >> Полиморфизм без виртуальных функций в с++
Вместо этого можно явно указать, что использование квалификатора является излишним для отдельного имени из конкретного пространства имен. Для этого служит 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;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |