
- •Оглавление
- •Об авторе
- •Посвящение
- •Благодарности
- •Ждем ваших отзывов!
- •Что такое .NET
- •Создание исходной программы
- •Тестовая поездка
- •Каркас программы
- •Комментарии
- •Введение в хитрости панели элементов
- •Повторное использование кода из панели элементов
- •Правила объявления переменных
- •Вариации на тему int
- •Объявление переменной с плавающей точкой
- •Ограничения переменных с плавающей точкой
- •Объявление переменных типа decimal
- •Сравнение десятичных и целых чисел, а также чисел с плавающей точкой
- •Логичен ли логический тип
- •Символьные типы
- •Что такое тип-значение
- •Неизменяемость строк
- •Основные операции над строками
- •Сравнение строк
- •Сравнение без учета регистра
- •Отличие строк в разных регистрах
- •Преобразование символов строки в символы верхнего или нижнего регистра
- •Поиск в строках
- •Как искать
- •Пуста ли строка
- •Удаление пробельных символов
- •Анализ числового ввода
- •Обработка последовательности чисел
- •Объединение массива строк в одну строку
- •Арифметика
- •Простейшие операторы
- •Порядок выполнения операторов
- •Оператор инкремента
- •Сравнение чисел с плавающей точкой
- •Составные логические операторы
- •Вычисление типа операции
- •Типы при присваивании
- •Перегрузка операторов
- •Ветвление с использованием if и switch
- •Инструкция if
- •Инструкция else
- •Как избежать else
- •Вложенные инструкции if
- •Конструкция switch
- •Циклы
- •Цикл без счетчика
- •Правила области видимости
- •Пример
- •Зачем нужны разные циклы
- •Зачем нужны массивы
- •Массив фиксированного размера
- •Массив переменного размера
- •Свойство Length
- •Инициализация массивов
- •Понятие <т>
- •Обобщенные коллекции
- •Инстанцирование пустого списка
- •Создание списка целых чисел
- •Преобразования списков в массивы и обратно
- •Подсчет количества элементов в списке
- •Поиск в списках
- •Инициализаторы массивов и коллекций
- •Выполнение специфичных для множеств задач
- •Создание множества
- •Добавление элемента в множество
- •Выполнение объединения
- •Пересечение множеств
- •Получение разности
- •Не используйте старые коллекции
- •Обход каталога файлов
- •Начало программы
- •Получение начальных входных данных
- •Создание списка файлов
- •Форматирование вывода
- •Вывод в шестнадцатеричном формате
- •Обход коллекций: итераторы
- •Доступ к коллекции: общая задача
- •Использование foreach
- •Формат индексатора
- •Блок итератора
- •Создание каркаса блока итератора
- •Итерирование дней в месяцах
- •Что же такое коллекция
- •Синтаксис итератора
- •Блоки итераторов произвольного вида и размера
- •Обобщенные классы безопасны
- •Обобщенные классы эффективны
- •Очередь с приоритетами
- •Распаковка пакета
- •Написание обобщенного кода
- •Использование простого необобщенного класса фабрики
- •Незавершенные дела
- •Ковариантность
- •Использование механизма исключений для сообщения об ошибках
- •Что происходит при генерации исключения
- •Исключительный пример
- •Что делает этот пример "исключительным"
- •Трассировка стека
- •Советы по написанию кода с хорошей обработкой ошибок
- •Анализ возможных исключений метода
- •Как выяснить, какие исключения генерируются теми или иными методами
- •Генерирующие исключения выражения
- •Работа с перечислениями
- •Создание перечислений с инициализаторами
- •Указание типа данных перечисления
- •Применение перечислений в конструкции switch
- •Процедурные поездки
- •Объектно-ориентированные поездки
- •Определение класса и объекта
- •Определение класса
- •Что такое объект
- •Различие между объектами
- •Работа со ссылками
- •Классы, содержащие классы
- •Определение константных членов-данных и членов-данных только для чтения
- •Передача аргументов методу
- •Передача методу нескольких аргументов
- •Соответствие определений аргументов их использованию
- •Перегрузка методов
- •Реализация аргументов по умолчанию
- •Возврат значения оператором return
- •Кортеж с двумя элементами
- •Создание кортежей более чем с двумя элементами
- •Глава 14 Поговорим об этом
- •Определение методов
- •Определение статического метода
- •Определение метода экземпляра
- •Полное имя метода
- •Ключевое слово this
- •Когда this используется явно
- •Что делать при отсутствии this
- •Использование локальных функций
- •Прочие уровни безопасности
- •Методы доступа
- •Пример управления доступом
- •Выводы
- •Статические свойства
- •Побочные действия свойств
- •Дайте компилятору написать свойства для вас
- •Методы и уровни доступа
- •Замена конструктора по умолчанию
- •Конструирование объектов
- •Непосредственная инициализация объекта
- •Конструирование с инициализаторами
- •Инициализация объекта без конструктора
- •Определение свойств с кодом
- •Определение конструкторов и деструкторов с кодом
- •Определение методов доступа к свойствам с кодом
- •Определение методов доступа к событиям с кодом
- •Наследование класса
- •Более сложный пример наследования
- •ЯВЛЯЕТСЯ или СОДЕРЖИТ
- •Доступ к BankAccount через содержание
- •Отношение СОДЕРЖИТ
- •Заменяемость классов
- •Неверное преобразование времени выполнения
- •Указание конкретного конструктора базового класса
- •Обновленный класс BankAccount
- •Перегрузка унаследованного метода
- •Простейший случай перегрузки метода
- •Различные классы, различные методы
- •Сокрытие метода базового класса
- •Вызов методов базового класса
- •Что неверно в стратегии использования объявленного типа
- •Использование is для полиморфного доступа к скрытому методу
- •Объявление метода виртуальным и перекрытие
- •Получение максимальной выгоды от полиморфизма
- •Разложение классов
- •Абстрактный класс: ничего, кроме идеи
- •Как использовать абстрактные классы
- •Создание абстрактных объектов невозможно
- •Опечатывание класса
- •Реализация интерфейса
- •Именование интерфейсов
- •Наследование и реализация интерфейса
- •Преимущества интерфейсов
- •Тип, возвращаемый методом
- •Что скрыто за интерфейсом
- •Гибкие зависимости через интерфейсы
- •Реализация отношения СОДЕРЖИТ с помощью интерфейсов
- •Определение делегата
- •Пример передачи кода
- •Делегирование задания
- •Очень простой первый пример
- •Более реальный пример
- •Создание приложения
- •Жизненный цикл делегата
- •Анонимные методы
- •Проектный шаблон Observer
- •Что такое событие. Публикация и подписка
- •Как издатель оповещает о своих событиях
- •Как подписаться на событие
- •Как опубликовать событие
- •Как наблюдатели "обрабатывают" событие
- •Сборки
- •Выполнимые файлы
- •Библиотеки классов
- •Создание проекта библиотеки классов
- •Создание автономной библиотеки классов
- •Создание классов для библиотеки
- •Использование тестового приложения
- •Дополнительные ключевые слова для управления доступом
- •protected: поделимся с подклассами
- •protected internal: более изощренная защита
- •Размещение классов в пространствах имен
- •Объявление пространств имен
- •Пространства имен и доступ
- •Использование полностью квалифицированных имен
- •Ссылочные типы
- •Выходные параметры
- •Альтернативные методы возврата значений
- •Работа с переменными out
- •Возврат значений по ссылке
- •Различия типов-значений
- •Когда следует использовать структуры
- •Добавление распространенных элементов структур
- •Управление отдельной записью
- •Добавление структур в массивы
- •Перекрытие методов
- •Определение того, что следует защищать
- •Документирование компонентов программы
- •Разложение компонентов на функции
- •Оценка рисков
- •Аутентификация с использованием входа в Windows
- •Безопасность развертывания
- •Уязвимости сценариев
- •Наилучшие методы защиты приложений Web Forms
- •Получение данных
- •Настройка образца схемы базы данных
- •Подключение к источнику данных
- •Работа с визуальными инструментами
- •Написание кода для работы с данными
- •Использование Entity Framework
- •Где водится рыба: файловые потоки
- •Потоки
- •Читатели и писатели
- •Пример использования потока
- •Как это работает
- •Наконец-то мы пишем!
- •Использование конструкции using
- •Загрузка файла из Интернета
- •Регистрация сетевой активности
- •Графика
- •Перья
- •Кисти
- •Текст
- •Классы рисования и каркас .NET
- •Приступая к работе
- •Настройка проекта
- •Обработка счета
- •Создание подключения к событию
- •Рисование доски
- •Запуск новой игры

Определение константных членов-данных и членов-данных только для чтения
|
_,"D$#,:>'1,(,1 |
)$ ,!(,1 |
)(#($.").$_ |
.,"'1!) |
-),-"()- |
.,"'1 |
,J1",)(#),-.с$. |
|
||
)!.!. |
.!'1)(#'1(- |
'1#."'1$" (#.!. |
.!'1)(#'1('1!. |
,"J1"W"'1'1!. |
,!,.'1! |
.,(:> |
-.# |
|||
.#'1! |
) !.р-),"'1$$ |
$ '1" W!."( $.W"'1-(:>)- |
'1$6," ) ,J1!6J1#WW" .#. |
,!.# |
#'1! ) |
|||||
),",-.O"(,1 |
SJ1#6W"'1(" |
$)_!,'1!6! |
(".)(# |
|
|
|
|
|
||
р |
|
|
|
Д |
|
з |
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
r |
ф |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
=
=
()5+()+= l |
Sln(=)( |
)5=(=h=(-(+h-(==(--(i(= =i(ai(n-( -n( |
||
5+( A)5=( |
()5+()+)=(n =(i(n())=( |
(A()h =(=(=)= +(==(==(=-(===+ |
||
=(n())+h n(a)A(5=)( A)5=( |
=())(n- |
5==A(( |
(=E5(+(=h)=n)-()(n |
l{ SlA+(=(-=i((+ ==(=(A)+((n(5+h=i(ai(-n=) (==(aA((+(( 5(=i(
-(==())(n t |
=i(=(5+(-==(+) =i=a(=5=(5(=(= |
=-=())==()5+()+ |
-(=)( |
|||||||
=i(=-(i)+h(= |
=-=())(=(i(-())(= |
n(=)m)=(+(i(- |
Sl |
s{ |
|
|
||||
|
|
|
= |
|
|
|
|
|
|
|
+(a( |
(=) =i) =i)-()())) |
n(=)m)=(+(i( {s |
=)(A())( |
+(=( |
(A=()( |
=(5=( |
||||
=(=-==i)5-()+( |
(-= )))i)( |
)=)i== |
(( =)(A())( |
)( |
n(=(+ ==+h)=o |
|||||
n()()( |
))a=( - =i(ai(nn( (+==i)A))= |
+(a(5(-(+( )(5=+ 5=Ei=(n+(u |
||||||||
))A(5=)= u(i(=+(i A+(==(=)5=-(+h)u -)(5+(= |
(==))a( |
=i) (= |
=-=())) |
|||||||
=()5+()+ =i(==(A+)+(=h)()5=(=h=(-(+h-(=)m)=(+(i |
Sl |
s{ |
|
278 |
4-- |
-014- 10-87--- |
4 0- 078810 -87-1 4 - 7 |

Немного о классах 279


М етод ь1
В ЭТОЙ ГЛ А В Е . . .
р o , |
ог л , St,ф, n, |
|
)) Опреде:Пение-метqда |
||
ч,- .ц |
||
)). Передача ар'гум нtо методу |
мби у б |
|
|
)) Получение·результатов из метода
ет)) М од WriteLine ( )
рограммисты должны иметь возможность разбивать большие програм мы на части, с которыми легко рабо:ать. Например, программы, содер жащиеся в предыдущих главах этои мини-книги, достигают предела
количества информации, которую человек может усвоить за один раз.
С# позволяет разделить код класса на фрагменты, известные как Рil ьтох ,ыМетод эквивалентен функции, процедуре или подпрограмме в других языках. Разница в том, что метод всегда является частью
аушмлргоВ класса. Правильно спроектированные и реализованные методы могут значительно упростить работу по написанию сложных про грамм.

On,p
eAe '12 " #..2
_n,:t:t'1,f! '12 $( . . (,12
-" .)2
r11с
u -)2
_ |
n |
о |
|
ьзование
,2м
етода
#))(,1!('1$(,1 |
),"N:. $. |
,'1$(,1"'1 |
n з
|
|
|
|
|
|
|
|
n,,2 |
|
|
|
|
,, |
!2-2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
n з |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
n. |
|
|
|
|
- з |
|
|
|
|
|
|
|
|
|
|
|
|
о,"(,1".( |
|
"E |
'1E -.,-"()- |
.,".!(,1 |
N#..,(,1$С |
) |
,!(! |
, |
(,1$ |
., |
,! |
. #,!(,1$,$)У, . |
|||||||||||
.#)($ |
|
КЛС |
|
a).!., |
|
9 |
!6'1#(,1(,1$'1!.#.$- |
|
.# _w |
aN.#,! |
|
T,"(,1".( |
|
|
11! |
!,11 |
!(1$(,1 |
. , |
||||||
N,- |
.#) |
.!. |
|
a. |
$ |
.")(". ,#, |
|
|
Нp |
|
|
$,$ |
|
кл |
|
|
|
|
,'1"N)(#.клС,- |
|||||
. |
#- |
)!р!. |
|
.#р!'1 ,!N# |
,!( |
!'1 |
. |
(,1!."( |
р,(У, |
.,9!,.". |
|
) |
,!(,1!OУ,. |
)),,,$ |
|
|||||||||
.# |
$(,1- |
T(!6! |
(,1"(!N# |
")(.! |
6!.!'1-Е |
|
(#, " !,'1"N",".$" |
|
)(,1: |
#"( |
|
N#." |
(,1".-_ |
(#, |
||||||||||
.(! |
|
,:.E" |
|
'1#))(,1!('1"(:>С |
.(! |
(#,!" |
(,1"(!NЕ .# |
,'1$(,1"'1# |
0 м. "'1E . , |
$ |
Oг |
(! |
'1E! . , |
|||||||||||
$),!,У, |
:.()- |
|
|
,!.($ . |
,#.N! |
(,1 |
,'1$(,1"'1" ,.$1$ |
$ |
-.,-.()- |
|
|
(,1"(!N#(,1$ |
|
o |
|
|
||||||||
|
,1t1 |
|
...: |
|
,0..'1E |
#s,$.$" (,1".N: |
)(#($."),$(,1$ |
$ .")(#($."),$(,1$ |
|
(,1"(!N#(,1$ |
||||||||||||||
,'1#.." |
.#..p |
|
|
)(0#..! |
N#..#- |
( |
(,1#р: N"( '1#),'1,(# . |
.#)(!- |
". |
|
6,#." |
.! |
р! |
|||||||||||
,"" ,!N'1!р.! |
|
!р |
T(!(,1 |
'1".:> |
,!.N" |
. к,#." КЛt1 |
!к!.!'1$(,1 |
!р |
|
T(!(,1 |
. |
,!(!'1!. |
|
|||||||||||
р:N:( |
р! ,"" N"(#,У,.! |
'1#))(,1!('1"., |
|
.")(#($."),$" |
(,1"(!N,З |
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
FSТS!!aБ О!НПИЗАНАМКИИЗПОЕИАОХНПИОcТОХМЕ.П |
ИЕС!БНП! НЗЗН FSТS!Б |
|||||||||||||||||||
|
|
|
|
!a |
О!НЗАНАМКИИЗПОeОЕИАОХНАНИc ИАЗБМЕБ П!НЗЗН Н ПИ .П |
|
ИЕЕ!БН |
|||||||||||||||||
ЗАПОМНИ! |
! |
З!ИХМАР |
ИЕ!ННeЕИПАИ СНМЗ!НМ!НРАЗБ |
ПНКИИПМБ!ИПМАОc)ИПАН |
||||||||||||||||||||
ИТ |
ТАМКИ!ИПМА!НЗЗН |
ЗВНАМКИИЗПОЕМАКИ!ИПМАСАИАИК!1 |
pТАo |
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
= |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
= |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
== |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
= |
|
|
|
=+ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
== |
|
|
|
|
|
|
|
|
|
|
|
|
|
=+==<н+==<+=+ <н===<=+ +==+=+=++=+ |
=+==+<= + +<==+ |
|||||||||||||||||||||
|
+=<+ = =+=== +=+=+=+ |
+= |
+== =+ +=<== |
+= +==<= |
|
|
=
ЧАСТЬ 2 тaфюuее ошоааюетааотрееодижао Сар яя ааотреади на С#

-Н!!СЗ .ПКДЕС!БН П!НЕЕН МЕДДОЕОЗЕОПДИИМАРКНПНСОМАРПОСМР!Рe ЗСБ М!ДИОП.ПКДЕС!БННТЕХHО ПЕД.ПКДЕС!БНС О!ИОЧОМООЧО!Д П!НЕЕН МЕДРОО!ИМ МОД!Д М!ДИС П!НЕЕН ПНПМ!ДИСo!НИИСДiОНПМЕДОО!С!1
ЗАПОМНИ! ММБКИНМДИМБd
!СНН!ДИМД t !cp |
t c,e!clttt |
g.l |
СДНД!НДОМАСННП!ДИМДПО!МАaЕО!ДН!Нe |
ЧДЕМАЕБПИМАОНМЕДОО!Н НОкиДЕЕПСКОПН |
p!c t !,0 ,tte Kg. СННПОММДЕПМn |
||
ОНПОЗ!ДТЕХ! НДКМА!ВОН |
ДПССО!ИДИМБСНМПД!ДИИОeПСТДО !ННeЕДИОН !Н СОЕ!Д |
ООeОПНПЗМА!МАОКНПОЕЕДИОМНОПНИСИДПОЕСМ!МНМАРЧМДЕБЕОНОПМИН!1 .ПННИ ПСe ПО!МОЕБЕ!Д!МАРЧДД
РООЕ!ДООeОПНПЕДОО! КНПДНТНДОЕПОР ННЗООМАОИСДНД!НДОМАСННП!ДП ИМДП ООМПМАМКПОООНОЗС! ПСКПНИТЕХPНПМЕ ОЗННКОЕМАСННП!ДИМДСe
ЗАПОМНИ! НД!НДОЕБМИЕОНМАПкиММ!Д!МАРЧДЗ. КНМИЕОНМАПкиМДЗПСКОПН
! СНМПД!ДИОЕ СНМЕДНДПО! ЕДОО!ОПИД!Д!НДОИММДeОЕОЗДИИОЧОПНОЕДi ПСПО!Н ИН.ПННИ Д!МИЕОПДИИОЗЕОНОПМИОi П ОЗЧДЕ Е!МАМНДЕДОО!С ПССО!ИБРО ННК!ММИСДЕ!О!ИСД ОСДННкиММОНПМД. ПНППСММЕ!ДИМДЕНОДЕНОММДЕПМБ!МАИП киМЗi ОЗ)Д!МИДИМДЕОНОПiЕОНОМНОППНЕНЕЕМПОПМ!М ООСННППН.!ДПОНОИИСБ СМЕДЕТЕХА!ОПОЕ Е!О!ИОЕОВ НДТНДЕСБ ЕДОО!НЕМКН!НМИММДЕИДОeННИММДИН nДОО!С ЕОeМАОЗСОВ !РЗОeО ННКЕДННМ !РЗОЗ ЕОДСДИМ!О!ИОЕОМ• ИОПЕД!Д !МАМТДМООЗС· ОИМЗС!М ИДЗО!ВТМЕМСОННКЕДНМА!!Б МА!ОЗЕОПНННЗООСЕ ИМЕММ МАЕДИВТДИМБПДНОБОИОЕОМОТМЗОПТЕХ
|
eit eig.t nsg dng.tigg tridadS S ire.ir m ete S ..eetr |
e |
||
СОВЕТ |
SDoe.eiiiDI} a ug |
.darsugi ntse ., sde a r eidsea |
se.d .r.er |
st." |
ndaitii.,.eid srei gari d tridaroS nsdigSidt ..eetr |
egitir.i tduri |
|||
|
atneitii.s1 nei ts.i |
stadsstii.s S ire.iro |
|
|
Использование меrодов в ваших программах
n |
T,!(,1 |
'1..,,,, |
|
,,- ,,(,1!'1-,'1# |
$$ |
,!1! |
,#, |
'1#.:(,1'1!, |
|
!,'1,,,,,'1$, |
(,1,,!,!) |
||||
(,1!.,, |
-,,,#,. |
,'1!1'1#(,1(,1: |
,'1!O, |
,,- |
'1#,$-#'1$- |
$ |
,!'1$(,1#'1$-е |
,.: |
,, ).-,# |
(,1!_ |
|||||
'1!,$,'1#- |
,'1!6'1#(,1(,1# |
QНdwНQ_ |
х_ |
u |
t:t_Q |
$. |
1,# ), |
|
У |
|
,'1#),,'1$, |
,!,!em |
|||
,!(,1 |
),,!,'1,'1 |
$- |
$ '1#.,,,,'1# |
'1# '1,-,!,.,! |
|
(,1,,!,!)П |
|
.,! |
,,,#,, |
|
,'1!6'1#(,1(,1: |
ГЛАВА 1 3 Методы 283

ИСПОЛ ЬЗОВАНИЕ КОММЕНТА Р И Е В
Чтение комментариев при опущенном программном коде должно способство вать пониманию намерений программиста. Если это не так, значит, вы плохо комментируете свои программы. И наоборот: если вы не можете, опустив большинство комментариев, понять, что делает программа, на основании имен методов, значит, вы недостаточно ясно именуете методы и/или делаете их слишком большими. Меньшие методы предпочтительнее, а хорошие имена методов предпочтительнее комментариев. (Вот почему реальный код имеет гораздо меньше комментариев, чем примеры кода в этой книге. В коде книги комментарии используются для более подробного объяснения.)
|
PВ ИЕРМИ!ВНoeСМР ВЗ В |
ИН!ИЕТИИМKМБПСКВПeБoИАВ!ВП ПС ИeЗ!ИП |
|
|
|
АИП СВ\ЕТИ!ЕР!МБ |
НeК!ИЕТeБ.АВЗ eЕТeПСFSТSeИИСНМЗoИН ИИЗВЕТИИ |
ТЕ |
|
ЗАПОМНИ! |
ИoСНВ\АВВЗКВН |
АПИЕТИА НВЧНeooАm!·l ,0! ЧТЕХЧТЕХc fТЕХ, ПС! |
||
eЕТK!МА\ЕТИ!ЕР! МoВЗНeКВop |
|
|||
|
|
|||
|
|
) |
I |
|
З
Е
! I
\АВ СНМ НВЧНeoЕo
oИНБВНВТИeВ АВЕПМ!МАИB
oИАВ АВИe
!e \В
СНВИПАМНВПeИМKoИАВ!ВПТЕХ\\ЕТМПС |
|
\АВМАМК\ЕТИ!ЕР!МБ АНИБ |
e\АИЗp |
МКЕ
МАИ
"1 , АЗАe-! " КВД!ТЕХРИОoОМА!И ААМОВИИИО! ЧМОТМИББ АМОВИИА! ИИ bИ

>>часть начального ввода данных, в которой пользователи вводят вклад, процентную ставку и срок;
»раздел, выводящий введенную информацию на экран, чтобы поль зователь мог убедиться в корректности ввода;
»последняя часть кода, создающая и выводящая таблицу на экран.
сa
a |
i |
»вклада,
»процентной ставки и
»срока
|
|
|
|
|
|
P |
|
|
P |
a |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
э |
|
|
p. г |
m |
жdн.н жСч а |
|
} P |
о |
} |
nо |
Оt |
.dT С. гжПaСнT pг |
||||
|
о |
l -L l.» 'l i |
О |
||||||||
|
|
|
|
e |
SL |
b |
L |
lо |
l |
||
|
w , |
l |
б |
|
|
|
|
|
л |
|
|
uu |
|
|
|
|
|
|
|
|
|
|
|
uu |
|
|
|
|
|
|
|
|
|
л |
|
uu |
|
э |
|
|
|
|
|
|
|
|
|
uu |
l |
b |
ЗK |
l |
l K |
- |
l. 'l |
i |
|
||
K |
GKKbl |
|
|||||||||
|
|
b |
K |
, |
w |
K |
|
|
|
|
|
|
|
|
b |
Kb |
i'K |
S |
|
w. : |
K wа |
|
ИИ6 1
ilb |
K |
|
b |
K |
б |
ilb |
K |
l |
a |
б |
|
ilb |
K |
i |
K |
a |
б |
В |
З ll |
Ka K с lr |
|
Kb |
э |
lr |
ll л |
||
|
|
|
|
lri |
K |
|
бs |
|
|
ИИ |
|
P |
1 |
а |
Я |
|
|
|
|
ИИ |
".l |
|
lщl S дб |
uu |
|
|
|
|
|
G |
|
|
|
|
н t |
||||
G |
б. |
l щl l iн |
b· |
K s б |
|
|
|||
G |
б. l |
lщl i н |
K |
|
н t |
||||
ll |
l |
|
|
||||||
H |
эl. |
|
А |
t |
н eн sб |
|
н t |
||
щl сl нG |
K |
t |
н |
|
s бн |
||||
|
|
|
i |
|
|
ГЛАВА 1 3 Методы 285


=<=
=
Раздел иев з ссостоит из трех очевидных частей, каждая из которых снаб жена комментарием, выделенным полужирным шрифтом. Кроме того, раз дел 1 , в свою очередь, поделен на три подраздела - 1 а, 1 б и 1 в.
Вам не следует пытаться выделять в своих исходных текстах комментарии полужирным шрифтом или указывать номера разделов. Исходный текст ре альной программы - и без того сложная и запутанная штука, чтобы вносить в него искусственные усложнения. На практике для понимания достаточно яс ных и информативных имен методов, указывающих их назначение.
В разделе 1 |
для ввода значений трех переменных, необходимых для рабо |
ты программы |
oпевыепи еврoнрннoим ры ди5лоi. вызывается метод 1в пыo |
1в oнoннoNиoио бВКразделе 2 полученные значения выводятся на экран так же, как и в предыдущих версиях программы. В разделе 3 строится и выводится на экран таблица вкладов с помощью метода дыoптo:тд7а74oйийн7и б 1
ГЛАВА 1 3 Методы 287

OutputinterestTaЫe ( ) . А вем ко.есrаткз фатдy
ттотосомтеродвзеткзтеспкдевпевисакдеввеe рсофевтотйтосвотитйтит
трсоасиммеCalculateinterestTaЫe бечмето.отS'сеамраектто .иввоь тескаа читдтсиеткз т томйсто рса сичсиботтестоьсикта то.и ве врrво ко. ксе.отосатитнкзви .етидзe тто.и а теспnати-па .иввеeо 'са виракиваа стоаомето.и кде.рет рсокто.рмитн о томйтит тесакдатн а тетекта тибдай фр.дз рrе родрсеввеeчвисевпьо'окде теродвевазмето.и ррситдеваетес)
веткз т ктсотрhкде.ртарт чи течотом мето.и Output i nterestTaЬle ( ) . Output interestTaЬle ( ) - eосоипь рото. .дз тоаоhстобе токроднчотитнкз мевт сеnиттоспвiиRefactor т uэocСoЭщcRбоэ,дз схоаотеродватекде.ртаае
.еькттпзе
ы мВоспои nьзуйтесь в качестве стартовой точки примером Calculateinte restTaЬleМoreForgiving из гnавы 5, "Управnение потоком выпоnне ния' выбрав исходный текст от обьявnения переменной year до конца цикnа while:
д |
-- |
р |
е -- |
ннЭ, а й и |
|
ееаВыберите команду меню Editc>Refactorr::>Extract Method.
иоаВ диаnоговом окне Rename: New Method введите Outputinterestтaыe.
Обратите внимание, что каждое местоположение в коде, где есть ссылка на новый метод, при вводе автоматически изменяется. Предложенная сигнатура нового метода начинается с ключевых слов private static и включает в себя principal, interest и duration в скобках. (В части 1 , "Основы программи рования на С#'; книги в качестве альтернативы ключевому слову puЫic вво дится private. Пока что, если захотите, вы сможете сделать метод открытым (puЫic) после рефакторинга.)
l |
щ |
n |
щ |
|
|
4. Щеnкните на кнопке Apply дnя завершения рефакторинга. |
|
Выбранный вами в п. 1 код располагается после M ain ( ) и именуется OutputinterestTaЫe ( ) . На месте, где он находился ранее, вы увидите вы зов этого метода:
_ |
( |
щ |
( |
n ; |
288 |
4 |
-014- 10 80-- 4 0 00 88 10 80-14 -0 |

Могут применяться и другие виды рефакторинrа - например, изменение порядка параметров метода, но дальнейшее углубление в эту тему выходит за рамки данной книги.
Поскольку С# поддерживает именованные параметры, вы можете указывать параметры метода в любом порядке, предваряя значение
параметра его именем при вызове метода. Подробнее об этом вы уз охлюк наете немного позже, а пока просто знайте, что в С# 4.0 и более позд-
них версиях переупорядочение параметров проблемой не является.
В методе InputinterestData ( ) вы сосредоточиваетесь только на вводе трех значений типа decimal . В дан ном случае, несмотря на три различные пере менные, действия по их вводу идентич ны и могут быть размещены в методе InputPositiveDecimal ( ) , который одинаково применим как для ввода вклада, так и для ввода процентной ставки и срока, для которого выполняется расчет. Заметьте, что три цикла while в исходной программе превратились в один в теле метода I nputPosit iveDecimal ( ) . Тем самым устранено дублирование кода, которое всегда нежелательно.
Метод I nputPosit iveDecimal ( ) выводит приглашение и ожидает ввода пользователя . Если в веденное пользователем значение неотрицательно, он возвращает его вызвавшему его методу. Если же введенное значение отрица тельно, метод выводит сообщение об ошибке и повторяет цикл ввода. С точки зрения пользователя, программа работает точ но так же, как и раньше:
т UOO
т ,UO
у UO
Uт O
UOO
UOo
UO
U,UlO, O ,r U , OO ПVrПП) UO
а , Uа к ,а U
г,UкU, Oг к, Uлл, r кo
л , U па , нн н, U а, Пл
п,Пг + нU
UO,гп , Пп
, ) )
лхлвл Бr Методы чьби

ЗАЧ ЕМ БЕС П ОКОИТЬС Я О М ЕТОДАХ?
Когда в 1 950-е годы в Фортране появилась концепция функции, ее единствен ной целью было избежать дублирования кода. Предположим, вы пишете программу, которая должна вычислять отношение двух чисел во многих ме стах. В этом случае программа может просто вызывать в этих местах метод CalculateRatio ( ) , позволяющий избежать дублирования кода. Такая эко номия может показаться не слишком большой, если метод состоит всего из пары строк, но методы бывают разными; они могут быть очень сложными и большими. Кроме того, распространенные методы наподобие WriteLine ( ) могут использоваться в сотнях различных мест.
Второе преимущество применения методов также очевидно: проще коррек тно написать и отладить один метод, чем десяток фрагментов кода, и вдвойне проще сделать это, если метод невелик. Метод CalculateRatio ( ) включает проверку того, что знаменатель в отношении не равен нулю. Если у вас имеется множество фрагментов кода, а не один метод, то, скорее всего, в некоторых местах программы вы просто забудете вставить эту проверку.
Менее очевидно третье преимущество: хорошо спроектированные методы снижают сложность программы. Каждый метод должен соответствовать не которой концепции. Вы должны быть способны указать назначение каждого метода без использования слов u и или. Вы должны следовать принципу"один метод - одна задача':
Метод наподобие calculateSin ( ) служит идеальным примером. Програм мист, реализуя сложные вычисления, совершенно не должен беспокоиться, как именно будут применены их результаты. Прикладной программист может использовать метод calculateSin ( ) , не интересуясь, как именно он устроен и работает. Этот подход существенно снижает количество вещей, о которых должен помнить прикладной программист. Большую работу гораздо проще сделать, если разделить ее на части.
Большиепрограммы,как,например,текстовый редактор,строятся измножества методов разного уровня абстракции. Например, метод RedisplayDocument ( ) должен вызывать метод Reparagraph ( ) для вывода абзацев документа. Этот метод, в свою очередь, должен вызывать метод CalculateWordWrap ( ) для вы числения длин отдельных строк абзаца. Метод CalculateWordWrap ( ) может вызывать метод LookUpWordBreak ( ) , определяющий, какдолжно быть разби тодля переноса слово, стоящее в концестроки. Каждый из перечисленных ме тодов решает одну задачу, которую можно сформулировать простым предло жением (кстати, обратите внимание и на информативность названий методов).
Без возможности абстрагирования сложных концепций написание програм мы даже средней сложности становится практически нереализуемым, не го воря уже о создании операционных систем, игр, офисного программного обе спечения и тому подобных больших и сложных программ.
290 ЧАСТЬ 2 Объектно-ориентированное программирование на С#