Объектно-ориентированное программирование.Язык Смолток

Условные конструкции и булевские величины



Условные конструкции и булевские величины

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

а) Без сравнения объектов в Смолтоке, конечно, не обойтись. Конструкции вида

3 > 4

#(1 2 3 )= #(1 2 3)

'привет' >'пока'

5=2+3

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

б) Условные выражения служат для обработки результатов сравнения.

Условная конструкция имеет вид:

< условие >

если условие истинно: [ <блок выражений> ]

если условие ложно: [ <блок выражений> ]



На языке ООП эта конструкция записывается таким образом:

<объект-адресат класса True (Истина) или False (Ложь)>

ifTrue: <объект-параметр>

ifFalse: <объект-параметр>

В данном случае <объект-параметр> представляет собой блок сообщений (напомним, что блок сообщений - это группа сообщений, заключенная в квадратные скобки).

Естественно, возможны и следующие конструкции:

< условие > ifTrue: [ <группа сообщений> ].

< условие > ifFalse: [ <группа сообщений> ].

Для реализации этих конструкций существует класс булевских величин Boolean. Класс Boolean реализует значения истинности. Он имеет два подкласса: класс True и класс False. Значение true является единственным экземпляром класса True, а false – единственным экземпляром класса False. Эти конструкции введены для обеспечения возможности описания условных операторов и условных конструкций:

Классы Boolean, True и False являются надстраиваемыми (или конструированными) классами. Поэтому весьма полезно продемонстрировать их внутреннее устройство, которое столь просто, что далее можно обойтись без комментариев (еще один пример того, что хорошие объектно-ориентированные программы должны быть легко читаемыми).


Класс Boolean (Логический)

class name Boolean

superclass Object

class methods

" Оба следующих метода выдают ошибку: создание новых логических значений невозможно, так как значения 'истина' и 'ложь' уникальны"

new

^self неправильноеСообщение

new: intVal

^self неправильноеСообщение

instance methods

занестиВ: экзПоток

"Добавить последовательность символов приемника к

заданному потоку, из которого приемник может быть создан заново"

self печататьНа: экзПоток

малаяКопия

            "Выдает копию приемника, разделяющую с ним переменные экземпляра. Так как есть только одно значение 'истина' и одно значение 'ложь', выдается приемник"

^self

печататьНа: экзПоток

"Добавить представление приемника в символьном виде к заданному потоку"

экзПоток поместитьВсеПоследующие:

            (self ifTrue: ['истина'] ifFalse:['ложь'])

полнаяКопия

"Выдает копию приемника с малыми копиями каждой переменной экземпляра. Так как есть только одно значение 'истина' и одно значение 'ложь', выдается приемник"

^self

Класс True (Истина)

class name True

superclass Boolean

-- class methods отсутствуют

instance methods

& boolInstance

^boolInstance

| boolInstance

^true

ifTrue: Block

^Block value

ifTrue: Block1 ifFalse: Block2

^Block1 value

ifFalse: Block

^nil

ifFalse: Block1 ifTrue: Block2

^Block2 value

and: Block – И с блоком

^Block value

or: Block -- ИЛИ с блоком

^true

xor: boolInstance -- исключающее или

^boolInstance not

not

^false

equal: boolInstance -- эквивалентность приемника и аргумента

^boolInstance

Класс False (Ложь)

class name False

superclass Boolean

-- class methods отсутствуют

instance methods

& boolInstance

^false

| boolInstance

^boolInstance

ifTrue: Block

^nil

ifTrue: Block1 ifFalse: Block2

^Block2 value

ifFalse: Block

^Block value

ifFalse: Block1 ifTrue: Block2

^Block1 value

and: Block -- И с блоком



^false

or: Block -- ИЛИ с блоком

^Block value

xor: boolInstance -- исключающее ИЛИ

^boolInstance

not

^true

equal: boolInstance -- эквивалентность приемника и аргумента

^boolInstance not

Например:

| maximum a b |

a:= 5 Sqr.

b:= Factorial.

a>b

ifTrue: [maximum:= a]

ifFalse :[maximum:= b].

^maximum

Создадим на основе данной программы метод с именем 'max'. Для начала определимся со спецификацией.

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

2.     Объект-параметр - тоже целое число.

3.     Результат - это тоже целое число.

Значит, сообщение будет выглядеть следующим образом:

<экзЦелоеЧислоМакс> := <экзЦелоеЧислоA> maximum: <экзЦелоеЧислоB>

В Смолтоке любой метод имеет следующий вид:

имяСообщения

" комментарии "

| временные переменные |

выражения

В нашем случае:

max: arg -- имя метода с параметром

"вычисление максимума( a^2, b!)"

| a b maximum |

a:= self Sqr.          -- псевдопеременная 'self' -

-- значение объекта-адресата

b:= arg Factorial.

a>b

ifTrue: [maximum:= a]

ifFalse: [maximum:= b].

^maximum

Теперь можно добавить данный метод в класс Integer (суперкласс Number - Величина). Примеры использования метода:

5 max: 4

10 max: 7

и т.п.


Содержание раздела