Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[4]

(number \\ 2) = 0

ifTrue: [parity - 0] ifFalse: [parity - 1]

Предыдущий пример можно записать и по другому:

parity - (number \\ 2) = 0 ifTrue: [0] ifFalse: [1]

Для того, чтобы некоторые непоследовательные управляющие структуры, было легче реализовать, блоки могут иметь один или более аргументов. Аргументы определяются включением в начало блока идентификаторов, каждому из которых прошествует двоеточие. Аргументы блока отделяются от выражений, составляющих блок, вертикальной чертой. Следующий пример описывает блок с одним аргументом:

[:array total - total + array size]

Типичное использование блоков с аргументами - реализация функций, применяемых ко всем элементам некоторой структуры данных. Например, многие объекты, представляющие собой различные виды структур данных отвечают на сообщение do: (выполнить:), которое имеет аргументом блок с одной переменной. Объект-получатель, получив сообщение do: , выполняет блок-аргумент один раз для каждого своего элемента. Каждый элемент из получателя становится значением аргумента блока в течении одного выполнения блока. Следующий пример вычисляет сумму квадратов первых пяти простых чисел. Результатом будет значением переменной sum.

sum sum - 0.

#(2 3 5 7 11) do: [:prime sum - sum + (prime * prime)]

Объекты, которые реализуют подобные управляющие структуры, поставляют значения аргументам блока, посылая блоку сообщение value: anObject, с аргументом anObject, значение которого присваивается параметру блока. Например, выполнение следующих выражений приведет к тому, что переменная total будет иметь значение 7:

sizeAdder total

sizeAdder - [:array total - total + array size].

total - 0.

sizeAdder value: #(a b c). sizeAdder value: #(1 2). sizeAdder value: #(e f)

Блоки могут иметь и более одного аргумента. Все аргументы блока локальны по отношению к блоку и его выполнению. Например,

[:x :y (x * x) + (y * y)]

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


О том, что еще интересного есть в Голубой Книге

"Есть три рода невежества: не знать ничего, знать дурно то, что знаешь, и знать не то, что следовало бы знать."

Пьер Эмиль Дюкло

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

В системе Smalltalk-80 восемь важнейших категорий классов: ядро системы и его поддержка, линейные величины, числа, наборы, потоки, классы, независимые процессы и графика (см. приведенную выше часть иерархии классов). Детальные описания протокола каждого системного класса рассматриваются в двенадцати главах второй части книги. Здесь содержится энциклопедическая информация о протоколе класса: определяются категории сообщений, каждое сообщение комментируется, приводятся примеры. В представляемом протоколе класса описываются только те сообщения, которые вводятся самим классом. Полный протокол сообщений определяется просмотром протокола класса и всех его суперклассов.

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

Но знать - это еще не все, главное - научиться думать о решаемой задаче в терминах объектов, классов, методов, уметь выделить их и "запрограммировать"! Именно этому и посвящена последняя часть книги, описывающая примеры построения компьютерных моделей для дискретных, управляемых событиями процессов.

Моделирование здесь - это представление множества объектов из реального или воображаемого мира в виде объектов некоторых классов. А цель создания компьютерной модели - предоставление рабочей среды для изучения моделируемой ситуации. Прежде чем создавать модели, в книге описывается иерархия классов, представляющих распределения вероятностей. Для определения, например, времени прибытия в модель объектов (клиентов в банк!) применяются различные виды распределения вероятностей. Они же используются и при случайном выборе времени ответа или времени обслуживания клиентов в модели. Класс SimulationObject (ОбъектМодели) представляет любой вид объекта, который вводится в модель для того, чтобы выполнить в ней одну или более задач; класс Simulation (Модель) представляет саму модель и обеспечивает управляющие структуры для ввода и формулировки задач каждому новому объекту модели.

Объекты, которые участвуют в управляемой событиями модели, действуют более или менее независимо друг от друга, используя имеющиеся в модели ресурсы. Поэтому необходимо решать проблему координации и синхронизации их действий. В системе Smalltalk-80 существуют средства синхронизации независимых событий, которые обеспечиваются классами Process (Процесс), Semaphore (Семафор) и SharedQueue (РазделяемаяОчередь). Классы, поддерживающие создание моделей, описывают использование объектами модели расходуемых, не расходуемых и/или возобновляемых ресурсов и предоставляют несколько способов сбора статистической информации о действующих моделях.


Для особенно любопытных, в первой главе третьей части описываются особенности системы с точки зрения разработчика, и объясняется как работает виртуальная машина Smalltalk.

Простой пример нового класса

"Не довольствуйся поверхностным взглядом!"

Марк Аврелий

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

Сначала, ничего не объясняя, приведем полное определение нового класса.

class nameFinancialHistory

superclassObject

instance variable namesalllncomes

incomes

allExpenditures

expenditures class variable namesTaxRate

class methods initialize

initialize

TaxRate - 0.12 instance creation

initialBalance: amount

tsuper new setlnitialBalance: amount new

tsuper new setlnitialBalance: 0 instance methods transaction recording

receive: amount from: source

incomes at: source

put: (self totalReceivedFrom: source) + amount. alllncomes - alllncomes + amount spend: amount for: reason

expenditures at: reason

put: (self totalReceivedFrom: source) + amount. allExpenditures - allExpenditures - amount inquiries

cashOnHand t alllncomes - allExpenditures



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5]