246071-Либерти-Освой-самостоятельно-С-за-21-день (852741), страница 89
Текст из файла (страница 89)
Однако не забывайте, что приобращении к членам внутреннего пространства имен необходимо явно указывать именавнешнегоивнутреннегопространств.Для открытия доступа ко всем членам пространства имен в текущей области видимостииспользуетсяоператорusing.Однаковрезультатеэтогослишкоммногоидентификаторовмогутполучить глобальную видимость, что чревато конфликтами имен. Поэтому использованиеданного оператора не относится к правилам хорошего тона, особенно при работе состандартными библиотеками. Вместо этого воспользуйтесь ключевым словом using приобъявлениивпрограммеидентификаторовизпространстваимен.Ключевое слово using в объявлении идентификатора используется для открытия доступа втекущей области видимости только к отдельному идентификатору из пространства имен, чтосущественноснижаетвероятностьвозникновенияконфликтовимен.Псевдонимы пространств имен аналогичны оператору typedef.
С их помощью можносоздавать дополнительные имена для именованных пространств, что оказывается весьмаполезным,еслиисходноеимядлинноеинеудобное.Неименованноепространствоможетсодержатьсявкаждомфайле.Какследуетизназвания,этопространствобезимени.Описавнеименованноепространствоименспомощьюключевогослова namespace, можно использовать одноименные идентификаторы в разных файлахпрограммы. Благодаря неименованному пространству имена переменных становятсялокальными для текущего файла. Неименованные пространства имен рекомендуетсяиспользоватьвместоключевогословаstatic.В стандартной библиотеке C++ используется пространство имен std. Однако избегайтеиспользования оператора using, открывающего доступ ко всем идентификаторам стандартнойбиблиотеки.Воспользуйтесьлучшеобъявлениямисключевымсловомusing.ВопросыиответыОбязательнолииспользоватьпространстваимен?Нет, вы можете писать простые программы и без помощи пространств имен.
Простоубедитесь,чтовыиспользуетестарыестандартныебиблиотеки(например,#include<string.h>),аненовые(например,#include<cstring.h>).Каковыотличиямеждудвумяспособамииспользованияключевогословаusing?Ключевое слово using можно использовать как оператор и как спецификатор описания. Впервомслучаеоткрываетсядоступковсемидентификаторампространстваимен.Вовтором—доступможнооткрытьтолькодляотдельныхидентификаторов.Чтотакоенеименованныепространстваименизачемонинужны?Неименованныминазываютсяпространстваимен,длякоторыхнезаданособственноеимя.Онииспользуютсядлязащитынаборовидентификатороввразныхфайлаходнойпрограммыотвозможных конфликтов имен. Идентификаторы неименованных пространств не могутиспользоватьсязапределамиобластивидимостиихпространстваимен.КоллоквиумКонтрольныевопросы1. Можно ли использовать идентификаторы, объявленные в пространстве имен, безпримененияключевогословаusing?2.
Назовите основные отличия между именованными и неименованными пространствамиимен.3.Чтотакоестандартноепространствоименstd?Упражнения1.Жучки:найдитеошибкувследующемкоде:#include<iostream>intmain(){cout<<"Helloworld!"<<end;return0;}2.Перечислитетриспособаустраненияошибки,найденнойвкодеупражнения1.День18-й.Анализипроектированиеобъектно-ориентированныхпрограммУглубившисьвсинтаксисC++,легкоупуститьизвиду,какизачемиспользуютсяразличныеподходыисредствапрограммирования.Сегоднявыузнаете:• Как проводить анализ проблем и поиск решений, основываясь на подходах объектноориентированногопрограммирования• Как проектировать эффективные объектно-ориентированные программы для нахожденияоптимальныхрешенийпоставленныхзадач• Как использовать унифицированный язык моделирования (UML) для документированияанализаипроектированияЯвляетьсялиC++объектно-ориентированнымязыкомпрограммированияЯзык C++ был создан как связующее звено между новыми принципами объектноориентированного программирования и одним из самых популярных в мире языкомпрограммированияСдляразработкикоммерческихпрограмм.Дляреализацииназревшихидейобъектного программирования требовалась разработка надежной и эффективной средыпрограммирования.Язык С был разработан как нечто среднее между языками высокого уровня для бизнесприложений, такими как COBOL, и работающим на уровне "железа", высокоэффективным, нотрудным в использовании языком ассемблер.
Язык С разрабатывался для реализацииструктурного программирования, при котором решение задачи разбивается на более мелкиерутинныеединицыповторяющихсядействий,называемыхпроцедурами.Программы, которые создавались в конце девяностых, принципиально отличаются отнаписанных в начале десятилетия. Программами, основанными на процедурных подходах,обычно трудно управлять, их тяжело поддерживать и модернизировать. Графическиеинтерфейсы пользователя, Intemet, выход на телефонные линии по цифровым каналам и массановых технологий резко увеличили сложность проектов, при этом ожидания потребителейотносительнокачестваинтерфейсапользователятакжепостоянноросли.Поднатискомтакогостремительногоусложненияпрограммразработчикивынужденыбылизаняться поиском новых подходов программирования. Старые процедурные подходы все болееотставали от требований сегодняшнего дня.
Программы быстро устаревали, а модернизацияпроцедурной программы проходила не проще, чем разработка новой. По мере увеличенияразмеровпрограммзначительноусложняласьихотладка.Проектычастоустаревалиещедотого,как попадали на рынок. Расходы на поддержку и модернизацию этих проектов превышалидоходыотихреализации.Таким образом, внедрение в жизнь новых подходов объектно-ориентированногопрограммирования было не прихотью программистов, а единственным спасением.
Объектноориентированныеязыкипрограммированиясоздаютпрочнуюсвязьмеждуструктурамиданныхиметодами,обрабатывающимиэтиданные.Болееважното,чтопритакомпрограммированиинетнеобходимостидуматьотом,какхранятсяиобрабатываютсяданныевотдельныхмодулях.Программистпростоузнаетизинтерфейсаобъекта,какиеданныеемунужнопередатьичтоонвозвращает,послечегоиспользуетготовыймодульвсвоейпрограмме.Чтожепредставляютсобойвиртуальныеобъекты?Сравнимихспредметамииобъектамиокружающего мира: автомобилями, собаками, деревьями, облаками, цветами. Каждый из нихимеет свои характеристики: быстрый, дружелюбный, коричневый, густой, красивый. Крометого, множеству объектов свойственно определенное поведение: они движутся, лают, растут,проливаются дождем, увядают.
Под словом "собака" большинство из нас понимают несовокупность пищеварительной, нервной и прочих систем, что может заинтересовать лишьузких специалистов, а мохнатого друга с четырьмя лапами, приветливо машущего хвостом изаливающегося звонким лаем. Для нас важны внешние признаки и поведение собаки, а не еевнутреннее"устройство".ПостроениемоделейЧтобы отследить все признаки и связи объекта окружающего мира, нам пришлось бысоздаватьмодельвселенной,настольковэтоммиревсевзаимосвязано.Цельюмоделиявляетсясоздание осмысленной абстракции реального мира. Такая абстракция должна быть прощесамого мира, но при этом отображать его достаточно точно, чтобы модель можно былоиспользоватьдляпредсказанияповеденияпредметоввреальноммире.Классическоймодельюявляетсядетскийглобус.Модель—этонесампредмет;мыникогдане спутаем детский глобус с планетой Земля, но первое настолько хорошо отображает второе,чтомыможемпознаватьЗемлю,изучаяглобус.Конечно, здесь имеются существенные упрощения.
На глобусе моей дочери никогда небываетдождей,наводнений,"глобусотрясений"ит.п.,ноямогуегоиспользовать,например,длятого,чтобырассчитать,сколькопонадобитсявременидляполетаотдомадоМосквы.Этоможетпотребоваться,скажем,припланированиивремениирасходовнакомандировку.Модель,котораянебудетпрощемоделируемогопредмета,бесполезна.СтивенРайт(StevenWright)пошутилнаэтутему:"Уменяестькарта,гдеодиндюймравендюйму.ЯживунаE5".Создание хорошей объектно-ориентированной программы по сути своей являетсямоделированием реальных объектов средствами программирования.
Для создания такойвиртуальной модели важно хорошо знать, во-первых, средства программирования и, во-вторых,последовательностьпостроенияпрограммыспомощьюэтихсредств.Проектированиепрограмм:языкмоделированияЯзык моделирования — это, по сути, фикция, набор соглашений по поводу принциповпредварительного моделирования программы на бумаге. Тем не менее без этого этапаневозможно создать эффективный профессиональный программный продукт. Давайтедоговоримся изображать классы на бумаге в виде треугольников, а отношения наследованиямежду ними — в виде пунктирных стрелок от базового класса к производному. Для примерасмоделируем класс Geranium (Герань), произведенный от класса Flower (Цветок), как показанонарис.18.1.Рис.18.1.СхематическоеизображениенаследованияклассаНа рисунке видно, что Geranium — особый вид Flower, и это вполне соответствуетдействительности.
Если мы с вами договоримся графически изображать таким способомнаследования классов, то будем прекрасно понимать друг друга. Со временем мы, вероятно,захотим моделировать многие сложные отношения и разработаем свой набор соглашений иправилпосозданиюдиаграмм,отображающихвзаимосвязиобъектовпрограммы.Конечно, нам также придется довести эти соглашения до сведения других сотрудников,которыеработаютилибудутработатьвместеснаминадобщимпроектом.Возможно,мыбудемвзаимодействовать с другими фирмами, имеющими свои соглашения, и надо будет потратитьвремя,чтобывыработатьобщиепринципы,позволяющиеизбежатьвозможныхнедоразумений.Втакомслучаебылобыполезнымсуществованиеединогоязыкамоделирования,понятногодлявсех.(Вдействительностиэтупрекраснуюидеюреализоватьничутьнепроще,чемзаставитьвсехжителейЗемлиговоритьнаэсперанто.)Темнеменеетакойязыкбылсоздан,иимяему—UML(UnifiedModelingLanguage—унифицированныйязыкмоделирования).Егозадачасостоитвтом, чтобы добиться единообразия в отображении взаимоотношений между объектами вдиаграммах.
В соответствии с соглашениями языка UML нашу схему, представленную на рис.18.1,следовалобыизобразитьиначе(рис.18.2).Рис.18.2.Тежеотношениянаследования,носучетомсоглашенийUMLВ соответствии с соглашениям и UML классы изображаются в виде прямоугольников, анаследование—ввидестрелки,направленнойотпроизводногоклассакбазовому.Направлениестрелкипротиворечиттому,чтоподсказываетинтуициябольшинстваизнас,ноэтонестрашно:когдамывседоговоримся,системазаработаеткакнадо.Соглашения UML совсем несложные.
Диаграммы нетрудно понимать и использовать. Мырассмотрим эти соглашения на конкретных примерах в ходе освоения этой главы, что гораздопроще изучения UML вне контекста. Хотя этой теме можно посвятить целую книгу, по правдеговоря, это будет пустая трата времени и бумаги, поскольку язык UML вполне соответствуетпринципу:лучшеодинразувидетьнапрактике,чемдесятьразпрочитать.ПроцесспроектированияпрограммПравильноевыполнениеанализаипроектированияобъектно-ориентированнойпрограммынамного важнее, чем соблюдение соглашений языка моделирования. Именно этой тематикипосвящено большинство публикаций и конференций.