Smalltalk в примерах/Управляющие структуры: различия между версиями

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

Версия от 02:30, 6 апреля 2007

Современные языки программирования предоставляют способы для выполнения кода условно и для повторения блоков кода. В C, есть \verb|if () {},| \verb|if () {} else {},| \verb|do {} while (),| \verb|while () {},| и \verb|for (;;) {}|. Конструкцыи такого типа обычно являются частью языка.


Однако в Смолток сам не содержыт эти конструкцыи. Вместо этого они создаются путём посылки сообщений объектам. В результатом чего появляется возможность изменять работу управляющих сообщений если тебя не устраивает способ их работы (не рекомендуется!). Если тебе нужна новая управляющая структура, ты можэш написать её. Например, в Смолтоке нет сообщения переключатель/случай, таким образом если ты думаеш что оно тебе нужно, ты можэш написать его (опять жэ этого не рекомендуется делать по причинам изложэнным в Главе ---, ---). Фактически, ты вероятно не нуждаешся в управляющих структурах отличных от присутствующих в стандартной библиотеке Смолтока. Давай рассмотрим эти структуры.


Условное выполнение

Простейшэй из условных структур является выполнение блока кода если некоторое условие истинно (или ложно). В Смолток есть два сообщения, одно когда условие истинно и одно когда оно ложно. Оба сообщения посылаются экзэмпляру класса \emph{Логический} (т.е. \emph{истина} или \emph{лож}). Есть два основных подхода---

логическоеЗначение истина?: [некоторый код].
логическоеЗначение лож?: [некоторый код].
3 < 4 истина?: [Транскрипт пс; показать: 'Истина']

Ты можэш расшырить эти примеры некоторым кодом если условие истинно и другим кодом если условие ложно. В Смолтоке ты пишэш следующее. Блоки \verb|истина?:| и \verb|лож?:| могут идти в произвольном порядке. Например, если блок \verb|истина?:| достаточно длинный, помести блок \verb|лож?:| первым.

логическоеЗначение
  истина?: [некоторый код]
  лож?: [некоторый код].
логическоеЗначение
  лож?: [некоторый код]
  истина?: [некоторый код].

Например,

3 < 4
  истина?: [Транскрипт пс; показать: 'Истина']
  лож?: [Транскрипт пс; показать: 'Лож'].

Смолток не предоставляет простова способа для конструкцыи C \verb|if () {}| \verb|else if () {}| \verb|else {}|. Ты можэш сделать это при помощи вложэния как здесь:

логическоЗначение
  истина?: [некоторый код]
  лож?: [ логическоеЗначение2
           истина?: [некоторый код]
           лож?: [ логическоеЗначение3
                    истина?: [некоторый код]
                    лож?: [некоторый код]
                 ]
        ]

Однако, такой тип кода скорее очень поцэдурный чем объектно ориентированный. Если ты увидиш что ты пишэш код подобный этому, возможно настало время подумать о том как ты пишэш программы. Смотри ---.


Цыклы

В Смолтоке нет цыклов. Вместо этова он предоставляет эту возможность путём посылки сообщений БлокамКода. Наиболее общий тип цыкла это когда цыкл продолжается пока некоторое условие истинно. Так долго как значение блока (т.е. последнее предложэние в блоке) \emph{истинно}, цыкл будет продолжаться. Этот тип цыкла подобен цыклу \verb|do {} while ();| в C. Далее показан синтаксис такова цыкла и пример.

[некоторый код] покаИстинен.
щётчик := 0.
[Транскрипт пс; показать: щётчик строкаДляПечати.
щётчик := щётчик +1.
щётчик < 10 ] покаИстинен.

Условие можэт быть противоположным так что блок будет выполняться пока его значение \emph{ложно}.

[некоторый код] покаЛож.

Следующий цыкл подобен предыдущему, но если первый блок истинен второй блок выполняется. Этот тип цыкла отчасти похож на цыкл \verb|while () {}| языка C но он более универсальный потому что он допускает много предложэний в первом блоке. Опять рассмотрим синтаксис такова цыкла и пример.

[некоторый код]
  покаИстинен:
   [следующий код]
[Dialog confirm: 'Continue']
  покаИстинен:
    [Транскрипт: пс; показать: 'Продолжаю']

Как и в предыдущем цыкле ты можэш обратить условие при котором цыкл продолжается.

[некоторый код]
  покаЛожэн:
     [следующй код]

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

[некоторый код] повторять.
[(Диалог подтвердить: 'Продолжэние') лож?: [^сам].
Транскрипт пс; показать: 'Продолжаю'] повторять.

Повторения

В Смолтоке есть три способа повторить блок заданное количество раз. Два из них используют индэкс, а в оставшэмся принимается что ты не беспокоишся о номере итерацыи. Если в цыкле не имеет значения значение индэкса, простейшым способом будет послать сообщение \verb|разПовторить:| с блоком в виде параметра. Например:

5 разПовторить: [Транскрипт: пс; показать: 'привет'].

Если в цыкле надо знать номер итерацыи, ты должэн послать одно из следующих двух сообщений. Если тебе нужэн цыкл от однаво числа до другова, с единичным шагом, пошли сообщение \verb|до:делать:| с параметром в виде блока. Блок ожидает получения одного параметра --- индэкса. Например,

1 до: 5 делать:
  [ :индэкс | Транскрипт пс; показать: индэкс строкаДляПечати ].

Если тебе нужэн цыкл подобный данному но тебе надо изменять индэкс на единицу, ты можэш определить значение шага с помощью сообщения \verb|до:шаг:делать:|. Опять это сообщение ожыдает блок и он должэн ожыдать получения индэкса. Например,

15 до: 1 шаг: -2 делать:
  [ :индэкс | Транскрипт пс; показать: индэкс строкаДляПечати ].

Вопреки существованию этих сообщений, они менее полезны чем ты можэш предположыть. Наиболее часто используемые цыклы выполняются для совокупности объектов, и совокупности имеют мощные механизмы для выполнения цыклов. Мы поговорим подробнее о цыклах для совокупностей в Главе \potom, \potom.


Оптимизированные сообщения

БлокиКода используются в вышэперечисленных управляющих структурах как параметры, и иногда как получатели сообщений. БлокКода можэт быть помещён в переменную или можэт быть записан как литерал --- т.е. как код заключённый в квадратные скобки.


Если все БлокиКода участвующие в сообщениях это литеральные блоки, сообщение компилируется как подстановка т.е. посылка сообщения не используется. С другой стороны, если любой БлокКода участвующий в сообщении как переменная а не литерал, код не будет скомпилирован как подстановка и будет производиться посылка сообщения. Обычно эти сообщения компилируются как подстановка ибо большынство блоков являются литеральными.