/ / |
с л о в а в н у т р и и м е н и п е р е м е н н о й н а ч и н а ю т с я с п р о п и с н ы х |
/ / |
б у к в |
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. Дополнительные главы |