Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

C# для чайников

.pdf
Скачиваний:
198
Добавлен:
27.03.2015
Размер:
15.52 Mб
Скачать

/ /

с л о в а в н у т р и и м е н и п е р е м е н н о й н а ч и н а ю т с я с п р о п и с н ы х

/ /

б у к в

p r i v a t e

s t r i n g

s S t u d e n t N a m e ;

 

 

p r i v a t e

i n t

n I D ;

 

 

 

# e n d r e g i o n

P r i v a t e D a t a

F i e l d s

 

 

# r e g i o n C o n s t r u c t o r s

 

 

 

/ / S t u d e n t - к о н с т р у к т о р и и м я к л а с с а н а ч и н а ю т с я с

/ / п р о п и с н о й б у к в ы , к а к и в с е с л о в а в н у т р и и м е н и

 

p u b l i c S t u d e n t ( s t r i n g s S t u d e n t N a m e ,

i n t n I D )

 

{

 

 

 

 

 

 

t h i s . s S t u d e n t N a m e = s S t u d e n t N a m e ;

 

 

t h i s . n I D = n I D ;

 

 

 

}

 

 

 

 

 

 

# e n d r e g i o n

C o n s t r u c t o r s

 

 

 

# r e g i o n P u b l i c M e t h o d s

a n d P r o p e r t i e s

 

/ / / < s u m m a r y >

 

 

 

 

/ / / N a m e - и м я у ч а щ е г о с я

 

 

/ / / < / s u m m a r y >

 

 

 

 

p u b l i c s t r i n g N a m e { g e t { r e t u r n s S t u d e n t N a m e ; }

}

/ / / < s u m m a r y >

 

 

 

 

/ / / T o S t r i n g - в о з в р а щ а е т и м я и и д е н т и ф и к а т о р

 

/ / / < / s u m m a r y >

 

 

 

 

p u b l i c

o v e r r i d e

s t r i n g

T o S t r i n g ( )

 

 

{

 

 

 

 

 

 

r e t u r n S t r i n g . F o r m a t ( " { o } ( { l } ) " ,

s S t u d e n t N a m e ,

n I D ) ;

}

 

 

 

 

 

 

# e n d r e g i o n P u b l i c M e t h o d s a n d P r o p e r t i e s

 

}

}

Используйте директивы Visual Studio # r e g i o n и ttendregion для отделения разделов вашего кода. Это позволит сворачивать и скрывать разделы при работе над другими частями кода. Нажмите <Ctrl+M>, а затем <Ctrl+0>, чтобы переклю­ читься между свернутым и развернутым состоянием. Давайте вашим разделам описательные имена, такие как показаны в приведенном листинге.

Используйте XML-комментарии, начинающиеся с / / / . Данные символы по­ зволяют Visual Studio применять их в механизме автозавершения, выводя коммен­ тарии как документацию по данному методу прямо в окне кода при вызове одного из ваших собственных методов. Механизм автозавершения рассматривался в гла­ ве 8, "Методы класса", и является одним из простейших способов получить спра­ вочную информацию о методе или классе — в том числе и по вашим собствен­ ным, если вы используете XML-комментарии.

Глава 21. Использование интерфейса Visual Studio

503

Вы можете также воспользоваться инструментом N D o c с открытым кодом ( h t t p : / / n d o c . s o u r c e f o r g e . n e t ) и автоматически сгенерировать привлекательную документацию в стиле Visual Studio на основании ваших XML-комментариев.

Комментируйте код, но делайте комментарии значимыми. Хороший комментарий рассказывает о ваших намерениях и назначении кода, а не о механике их реализации. Например, не пишите так:

/ /

Ц и к л п о м а с с и в у с т у д е н т о в с в ы з о в о м м е т о д а D i s p l a y для

/ / к а ж д о г о о б ъ е к т а т и п а S t u d e n t .

Вместо этого достаточно написать:

/ /

В ы в о д и н ф о р м а ц и и о с т у д е н т а х .

Посмотрите на имена методов или классов, которые собираетесь комментировать, и подумайте, нельзя ли их переименовать так, что­ бы комментарии стали излишни. Метод D i s p l a y A l l S t u d e n t s () не требует никаких комментариев.

Используйте хорошие описывающие имена для переменных, методов, классов и прочих объектов. Начинайте имена методов с глаголов ( D i s p l a y A l l S t u d e n t s ()), логические переменные или методы со слов наподобие is или has ( i s V a l i d , h a s l t e m s , c a n P a s t e ) , и делайте все име­ на понятными и значащими. Не используйте слишком длинных имен. Избе­ гайте применения в именах аббревиатур, в особенности нестандартных.

Хотя в этой книге и используется венгерская нотация (см. главу 3, "Объявление переменных-значений"), существуют и другие соглаше­ ния по именованию. Большинство программистов не используют венгер­ скую нотацию, в которой в качестве префикса применяется указание типа (наподобие s для s t r i n g , d для d o u b l e и так далее). В предыдущем примере использован другой стиль именования, который вы встречаете в большей части документации и примеров.

Пишите короткие методы, которые проще для понимания, менее подвер­ жены ошибкам и легче тестируются. Везде, где это возможно, работа метода должна использовать вызовы других методов. Это называется разложением вашего кода. Если категорически не требуется иного, делайте ваши методы за­ крытыми. Даже однострочный код стоит выделить в отдельный метод, если это делает код исходного метода понятнее. Предположим, например, что у вас есть сложное составное логическое выражение, наподобие

i f ( ( y p o s = = - 1 ) & ( v o w e l P o s = = - 1 ) ) . . .

Его достаточно сложно понять с первого взгляда. Можно использовать комментарии для пояснения сути дела, но маленький метод с хорошим именем ничуть не хуже:

p u b l i c b o o l H a s N o V o w e l s ( i n t

i n d e x O f L e t t e r Y ,

i n t

i n d e x O f F i r s t V o w e l )

{

r e t u r n ( i n d e x O f L e t t e r Y = = - 1 ) &

( i n d e x O f F i r s t V o w e l = = - 1 ) ;

}

504

Часть VII. Дополнительные главы

Этот код (из небольшого переводчика на Pig Latin10, который я как-то писал) сле­ дует за кодом, который пытается найти первую гласную в целевом слове, если та­ ковая существует. Если ее нет, i n d e x O f F i r s t V o w e l принимает значение -1. Однако буква у также может рассматриваться как гласная в некоторых ситуациях, так что этот метод должен принимать во внимание и ее.

В методе, вызывающем Н а s N o V o w e l s ( ) , следующая строка гораздо проще для понимания, чем исходное логическое выражение:

i f ( H a s N o V o w e l s ( y p o s , v o w e l P o s ) ) { r e t u r n 'USE_WHOLE_WORD; }

Данный пример иллюстрируетрефакторинг (реорганизацию кода).

Пишите код, который открывает его предназначение. Например, следующий метод, реализующий алгоритм преобразования английских слов на "поросячью ла­ тынь" ("убрать буквы перед первой гласной, перенести их в конец слова и добавить 'ау'"), автоматически рассказывает о решаемой задаче даже без комментариев:

p u b l i c s t r i n g C o n v e r t T o P i g L a t i n ( s t r i n g w o r d )

r e t u r n G e t B a c k P a r t ( w o r d ) + G e t F r o n t P a r t ( w o r d ) + " a y " ;

Код написан на высоком уровне, с использованием имен методов, которые ясно указывают их предназначение, не детализируя, как именно они работают — с применением циклов, ветвлений и т.д. Легко увидеть, как минимум в общем, что делает каждый вызов метода. Исходная версия этого метода была полна конст­ рукций i f , циклов, сложных логических выражений и локальных переменных.

Алгоритм "поросячьей латыни" прост, но некоторые его составные части несколь­ ко запутанны — как, например, поиск первой гласной для разбивки слова. Ис­ пользование описанного стиля работает сверху вниз (от общего к частному), от­ кладывая детали. Как можно предположить, методы G e t B a c k P a r t () и G e t ­ F r o n t P a r t () написаны одинаково, с явным указанием намерений на каждом шагу и переносом деталей в подчиненные методы. Многие программы в этой кни­ ге можно улучшить посредством этого стиля, либо используя его изначально, либо прибегая к рефакторингу.

Можно снизить сложность еще больше, если создать вспомогательные клас­ сы, инкапсулирующие часть работы, вместо одного или двух классов, тяну­ щих все на себе. Всегда старайтесь инкапсулировать мелкие детали в классах или наборах методов. В частности, посмотрите, нет ли кода, который может изменить­ ся в будущем, и инкапсулируйте его в собственном классе. Моя любимая книга на эту тему — Head First Design Patterns Фриманов (Freeman) (O'Reilly, 2004).

Эти и подобные методы помогут вам справиться с величайшей проблемой програм­ мирования: управлением сложностью. Плотный, закрученный код трудно понимаем, а это — прямой путь к ошибкам.

10"Поросячья латынь" — искажение слов английского языка по определенным правилам;

вчем-то аналог знакомого с детства "языка" в стиле -чи-то-чи дет-чи-ский-чи я-чи-зык-чи". —

Примеч. ред.

Глава 21. Использование интерфейса Visual Studio

505

Вряд ли вы обладаете настолько феноменальной памятью, чтобы помнить все классы и методы даже из одного пространства имен, скажем, System. Конечно, можно запомнить синтаксис С# и несколько других деталей, но все же лучше не забывать о том, как пользовать­ ся справочной системой, поиск нужной информации в которой имеет несколько видов.

Окно справочной системы Visual Studio называется Document Explorer. Зна­ ние этого факта может помочь избежать определенной неразберихи.

F1

Помощь по клавише <F1> предоставляет быстрый доступ к информации о полях или конструкциях в существующем коде, которые вы плохо помните или не вполне понимаете.

Например предположим, что вам не понятна разница между оператором new и одно­ именным модификатором метода. Вы можете щелкнуть на слове new в любом месте в окне редактирования и нажать <F1>. Visual Studio откроет окно помощи, как показано на рис. 21.10. (Если вы не понимаете разницу между терминами new, см. в главеб, "Объединение данных — классы и массивы", описание оператора new, а^ в главе 12, "Наследование", — наследования new. Или, как видно из приведенной копии экрана,

имеется еще ограничение

new () у обобщенных классов, так что можно заглянуть

и в главу 15, "Обобщенное

программирование".)

Рис. 21.10. Справочная система Visual Studio поможет разо­ браться с разными значениями ключевого слова new

Если справка содержит несколько статей, соответствующих вашему термину, вы уви­ дите маленькое плавающее окошко с перечислением доступных тем. Дважды щелкните на нужной теме, чтобы увидеть ее.

506

Часть VII. Дополнительные главы

- ж

Visual Studio пытается обеспечить доступ к справочным файлам, инсталлиро­ ванным на вашем компьютере, и к дополнительным ресурсам Web. Если вы не подключены к Интернету, то можете получить сообщение о том, что справоч­ ной системе не предоставляется доступ в Web.

Вы можете выбрать, где будет выводиться окно справочной системы. В Visual Studio выберите команду меню T o o l s ^ O p t i o n s . В разделе Environment слева

щелкните на пункте Help, General. Выберите External Help Viewer или Inte­

grated Help Viewer из

Show Help Using и щелкните на кнопке ОК . Лично

я предпочитаю External

Help Viewer, когда справочная система запускается

в виде отдельной программы и не мешает самому Visual Studio. Integrated Help Viewer помещает справку в свернутое окно вместе с вашими исходными файла­ ми. Но попробуйте оба варианта и решите сами, что вам больше нравится.

Предметный указатель

Если справка < F 1 > — не то, что вам нужно, пбскольку у вас нет соответствующего ключевого слова или идентификатора, вы можете продолжить поиск в предметном ука­ зателе (Index Help). Предметный указатель наиболее полезен, когда вы знаете тему, ко­ торая может вам помочь, но не уверены в деталях.

Например, вам может потребоваться коллекция некоторого вида, и при этом из­ вестно, что большинство классов коллекций находятся в пространстве имен S y s t e m . C o l l e c t i o n s . Для поиска следует выбрать команду меню Help^lndex, а за­ тем в окне Index ввести collections в поле ввода Look For, что предоставит список тем, связанных со словом collections. (Этот список находится в левой части окна Help. В правой части выводится текст найденной вами темы.) Двойной щелчок на элементе

. N E T Framework в списке тем дает вам окно, показанное на рис. 21.11.

Рис. 21.11. Окно предметного указателя особенно полезно, если известна часть ответа на задаваемый вопрос

Затем следует щелкнуть на S y s t e m . C o l l e c t i o n s , и эта тема открывает список членов пространства имен C o l l e c t i o n s . При прокрутке списка в нем можно найти класс S o r t e d L i s t . В соответствии с кратким описанием справа это именно то, что нужно. Итак, результаты поиска выглядят так, как показано на рис. 21.12.

Рис. 21.12. Найдена информация по определенному классу

Каждый член слева в окне тем представляет собой гиперссылку. Щелчок на S o r t e d - L i s t открывает информацию об этом классе, включая гиперссылки на члены класса, так что вы можете легко получить более детальную информацию.

Текстовое поле Filtered By в окне Index Help позволяет ограничить список тем, в которых выполняется поиск. На рис. 21.11 и 21.12 поиск велся в рамках "Visual С#". Без этого ограничения поиск мог бы вернуть информацию о кол­ лекциях, не имеющих ничего общего с С#. Справочная система Microsoft De­ veloper Network (MSDN) существенно больше, чем справка по С#. Фильтрация работает для предметного указателя, поиска и содержания.

Когда тема показана в окне Help, можно щелкнуть на кнопке Sync with Table of Contents на панели инструментов (книга с белым кругом, на котором изо­ бражены левая и правая стрелки). Это выделит тему на вкладке содержания Contents. Вы можете выполнить прокрутку, чтобы увидеть, что тема, посвя­ щенная классу S o r t e d L i s t , находится в Class Library Reference для .NET Framework Software Development Kit (SDK). Вкладка Contents полезна для по­ лучения обзора информации.

Обратите внимание на опцию Help Favorites в меню Help. Эта вкладка позволяет со­ хранить тему как "избранную". Позже вы сможете быстро к ней вернуться. На рис. 21.10 показано окно Help Favorites с некоторыми из избранных тем. Чтобы добавить текущую тему из предметного указателя в список избранного, щелкните на окне темы правой кнопкой мыши и выберите команду Add to Help Favorites.

508

Часть VII. Дополнительные главы

Поиск

Опция Search в меню Help наиболее полезна, когда вы в точности не знаете, что именно вам нужно. Это полнотекстовый поиск по всем темам справочной системы.

Например, требуется коллекция, отсортированная в алфавитном порядке. Для поиска следует выбрать H e l p O Search для того, чтобы открыть вкладку Search. Но при вводе sorted в поле Search For полученные результаты оказываются не слишком полезны­ ми, так что лучше ввести collection classes.

На рис. 21.13 показаны результаты поиска для "collection classes". Если вы максими­ зируете окно Help, то увидите несколько закладок справа от окна: Local Help, M S D N

Online, Codezone Community и Questions. По умолчанию вы получаете результаты

поиска в локальных файлах.

Puc. 21.13. Используйте полнотекстовый поиск, если вам не помогли ни контекст­ ный поиск по <F1 >, ни предметный указатель

Если вы подключены к Интернету, справочная система вернет также темы, располо­ женные в других областях (если вы подключаетесь по телефонной линии, это будет очень медленный поиск). Щелкните на закладке справа для вывода этих тем. Local Help обращается к файлам, хранящимся на вашем компьютере. M S D N Online обращается к справочным ресурсам на сайте Microsoft Developer Network (MSDN). Codezone C o m ­ munity обращается к множеству независимых сайтов, где вы часто можете найти допол­ нительную информацию и пообщаться с другими программистами на С# в форумах. За­ кладка Questions позволяет выполнить поиск в группах новостей, посвященных Х# и вопросам, связанным с .NET.

(Чтобы получить советы о том, как составлять хорошие запросы, откройте справку,

выберите H e l p ^ H e l p on Help, щелкните на Techniques for Locating Help, а затем на Full-Text Searches.)

Глава 21. Использование интерфейса Visual Studio

509

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

Такой широкий поиск, как "collection class", возвращает сотни возможных тем (максимальное количество выводимых в окне — 500), так что вы получаете их так же, как страницы с результатами поиска в Web. Для перехода к следующей или предыдущей странице результатов поиска щелкните на стрелке в правом верхнем углу Local Help на вкладке Search. Большинство этих тем будут для вас бесполезны.

Как и в случае предметного указателя, можно улучшить полнотекстовый поиск с по­ мощью фильтра. Можно фильтровать поиск по языку, технологии (такой как .NET Win­ dows Forms или Office Applications) и типу темы. На рис. 21.13 установлен весьма широ­ кий тип тем: Articles and Overviews (статьи и обзоры), Contains Code (с содержанием ис­ ходных текстов), How-Tos (краткие инструкции), Knowledge Base (базы знаний), Other Documentation (прочая документация) и Syntax/API Reference (справка по синтакси- ] су/API). Указывая конкретный тип темы, вы можете существенно снизить количество мусора. Кроме того, вы можете выполнить поиск локально на вашем компьютере идя глобально, в Web. (Чтобы получить дополнительную информацию о справке в Интерне­ те, найдите в предметном указателе раздел "Help, online content".)

Дополнительные возможности

Кроме избранных тем, можно сохранить в Help Favorites и поиски. Выполните поиск, затем при активной вкладке Search щелкните на кнопке Add to Help Favorites панели ин­ струментов Help (пиктограмма в виде странички с желтым знаком "плюс"). Теперь, открыв Help Favorites, вы можете в любой момент повторить выполненный вами поиск.

Обратите внимание на кнопку How Do I на панели инструментов на рис. 21.13. Это новый справочный ресурс со ссылками на все виды тем "how-to".

В качестве расширения меню Help Visual Studio 2005 предлагает новое меню Com­ munity, которое связывает ряд сетевых ресурсов и обеспечивает доступ к сообществу программистов на С# во всем мире. Слушайте профессионалов, задавайте вопросы и на­ бирайтесь опыта...

Попробуйте поиграться с окном Dynamic Help. Оно предназначено для отра­ жения контекста того, с чем вы работаете в данный момент — класс библиоте­ ки .NET Framework, ключевое слово С# и так далее. Честно говоря, данное усо­ вершенствование не такое уж и важное, хотя идея, конечно, привлекательная.

Лично я считаю наиболее важными и полезными возможностями справочной системы контекстную справку <F1> и предметный указатель. Старайтесь начи­ нать с контекстной справки <F1>. Затем переходите к предметному указателю. Он напоминает предметный указатель книги. Если же и здесь вы не получили помощь, переходите к полнотекстовому поиску. Поиск похож... ну, на прогул­ ку в Web, но не такую эффективную. И наконец, обратитесь к карте: вкладке содержания. Содержание похоже на оглавление книги. Это неплохое место, ес­ ли вы хотите получить не напоминание, а обзор на какую-то тему.

510

Часть VII. Дополнительные главы

Автоперечисление членов

"Автоперечисление членов" в Visual Studio часто делает излишним обращение к ме­ ню Help. При вводе имени класса или метода Visual Studio пытается предоставить вам справку на основании введенного во всплывающем окне.

Автоперечисление можно отключить. Выберите команду меню Tools^Options . В окне Options щелкните на пункте Tex t Editor в левой панели и выберите ко­ манду All Languages^General . И наконец, проверьте установку флага Auto List

Members.

Чтобы увидеть, чем может помочь указанная возможность, рассмотрим знакомую ситуа­ цию: я знаю, что класс коллекции некоторого типа хранит элементы в отсортированном по­ рядке. Поскольку я знаю, что этот класс находится где-то в пространстве имен S y s ­ t e m . C o l l e c t i o n s , следует поместить курсор на начало пустой строки в редакторе исход­ ного текста и ввести n e w S y s t e m . C o l l e c t i o n s . Как только будет введена точка в конце " C o l l e c t i o n s " , Visual Studio откроет меню, в котором перечислены все классы, состав­ ляющие пространство имен C o l l e c t i o n s . Это самый быстрый и простой вид помощи.

Visual Studio перечисляет в данной ситуации только неабстрактные классы, по­ скольку только они могут быть инстанцированы с использованием ключевого слова n e w . Подробнее об абстрактных и конкретных классах можно прочесть

вглаве 13, "Полиморфизм".

Впрокручиваемом списке возможных классов находится и класс S o r t e d L i s t . По­ сле выбора класса Visual Studio открывает его описание, как показано на рис. 21.14. По­ хоже, этот класс — именно то, что нужно.

Рис. 21.14. Автоперечисление —мощное подспорье в работе программиста

Глава 21. Использование интерфейса Visual Studio

511

После того как вы нашли то, что искали, можно удалить временный теки n e w S y s t e m . C o l l e c t i o n s . S o r t e d L i s t .

При нормальном течении событий при вводе реального кода автоперечисление явля­ ется частью автозавершения, о котором подробно рассказывалось в главе 8, "Методы класса".

Программы в этой книге, не боясь этого слова, можно смело назвать безупречными Но это результат определенного труда — нетривиальные программы никогда не работа ют с первого раза (наверняка это следствие определения тривиальной программы как та ковой, которая корректно работает сразу же после создания).

Строгий синтаксис С# позволяет отловить массу ошибок. Например, пропущенная инициализация переменной перед ее использованием всегда была бичом для более ран них языков программирования. Теперь в С# невозможно допустить такую ошибку, та как он отслеживает, когда и где переменной впервые присваивается значение, и где эта переменная применяется. Если ее использование предшествует инициализации, С# бьет колокола. (Говорю честно — я пытался, но никак не могу придумать трюк, как создать программу, использующую неинициализированную переменную.)

Однако компилятор не в состоянии обнаружить все ошибки программиста (если бы это было так, программисты бы быстро удалили его со своих жестких дисков, чтобы не оставаться безработными). Всегда существует необходимость поиска и исправления ошибок времени выполнения.

В коммерческом программном обеспечении ошибки времени выполнения час­ то именуют особенностями программы.

Вэтом разделе содержится программа с массой "особенностей". Моя задача состоит

вее отладке с использованием инструментария, предоставляемого Visual Studio.

Жучки в программе: а дустом не пробовали?

В приведенной далее программе имеется ошибка (а может, и имеются).

/ /

V S D e b u g - э т а п р о г р а м м а и с п о л ь з у е т с я в к а ч е с т в е

/ / д е м о н с т р а ц и о н н о й д л я о т л а д к и ; п р о г р а м м а н е р а б о т о с п о с о б н а

/ /

( и с п р а в л е н н а я в е р с и я п р о г р а м м ы — V S D e b u g F i x e d )

u s i n g

S y s t e m ;

 

u s i n g

S y s t e m . C o l l e c t i o n s ;

 

u s i n g

S y s t e m . 1 0 ;

 

n a m e s p a c e V S D e b u g

 

{

 

 

c l a s s

P r o g r a m

 

{

 

 

s t a t i c v o i d M a i n ( s t r i n g [ ]

a r g s )

{

/ / Я д о л ж е н в с т а в и т ь э т о п р е д у п р е ж д е н и е , ч т о б ы

512

Часть VII. Дополнительные главы

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]