вторник, 15 сентября 2009 г.

Самое начало: только объекты --- а что такое объект?

Весь Smalltalk базируется на нескольких простых принципах. Сейчас рассмотрим пару, и один --- подробно.


1. Все в Smalltalk-е является объектом.

Подробнее этот принцип обсудим в другой раз. Сейчас займемся другим пунктом... Ведь это первое утверждение, по сути, является "апофатическим": говорит о том, чего нет в Smalltalk-е --- "не-объектов". А вот что такое объект?


На самом деле, в этом вопросе содержится сразу два:
  1. Что такое объект "извне" --- как ими пользоваться?
  2. Что такое объект "изнутри" --- как он устроены и как создать "свой" объект?
(Объект как, соответственно, ноумен и феномен?)

Сейчас рассмотрим только первую часть.

"Извне" объект весьма прост (и в этом, наверное, и заложена вся сила ООП): объект это то, что может что-то сделать (для нас). Нужно всего лишь попросить его. Просьба --- это сообщение. В сообщении мы должны изложить суть нашей просьбы (ее "название") и указать необходимые для ее выполнения "материалы" --- другие объекты, с использованием которых просьба может быть выполнена.
Примерно так же мы пользуемся объектами в жизни (правда не всегда сообщения вербальны)?
Сообственно, мы уже "расписали" второй принцип:

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

В обычном, англоязычном Smalltalk-е указанный пример будет выглядеть так:
postman deliver:  letter to: address.

Получили (почти) обычное предложение. Подлежащее в нем --- объект почтальон --- в терминах Smalltalk называется получателем (сообщения). Само сообщение включает в себя 
  • "имя" (в терминах Smalltalk --- селектор; почему селектор --- будет ясно позже, при рассмотрении внутреннего устройства объектов) --- в данном случае именем является доставь:по: --- (почти) сказуемое
  • аргументы (дополнения) --- объекты письмо и адрес
 
Продолжение следует...

понедельник, 14 сентября 2009 г.

Неделя 3: Коллекции

Обзор: Collection, Set, Bag, Array, OrderedCollection, Dictionary c примерами.
Смотрим (в Workspace), как работает очередной метод, разбираем его устройство (параллельно осваивая Debugger и Browser)...
За лекцию и практическое занятие можно успеть, не очень торопясь:
1. Collection: базовый класс
2. Set: добавление, удаление элементов; проверка вхождения; nil не работает; size
3. Bag: то же самое, но с количеством вхождений
4. Array: не изменяет размер; создание через #new:, #new:withAll; литерально; first
5. OrderedCollection: можно добавлять/удалять элементы
6. Печать элементов коллекции в Transcript: "С"-подобный вариант; через #do:
7. #select:, #collect:, #detect:, #detect:ifNone: --- с реализацией
8. #inject:into: --- принцип, пример использования (вычисление суммы); устройство и другие примеры --- на самостоятельное изучение

суббота, 12 сентября 2009 г.

Пример сайта на Seaside

Беззастенчиво пиарю сайт Дословно.Инфо. Сделан на Pharo Smalltalk + Seaside + Pier. Упоминается здесь и здесь.

четверг, 10 сентября 2009 г.

Web Development Using WebVelocity

... пока без комментариев

среда, 9 сентября 2009 г.

Классы и метаклассы --- часть 1

"Мета" = "о"
"Метакласс"= "класс о классе"


Smalltalk построен на нескольких базовых принципах. Два из них: (*) все является объектом и (**) каждый объект является экземпляром некоторого класса, описывающего поведение всех своих экземпляров.

Из этих принципов следует, что (*)=> каждый класс является объектом, и (**)=> является экземпляром некоторого класса --- назовем его метаклассом данного класса.

Рассмотрим некоторый класс C. Экземпляром какого класса он является?

Существует два способа ответить на этот вопрос: (А) все классы являются экземплярами некоторого единственного метакласса, и (Б) каждый класс (в общем случае) является экземпляром некоторого "своего собственного" метакласса.

Поскольку различные классы в Smalltalk обладают различным поведением (см. примечание 1), вариант (А) не подходит, т.к. поведение всех классов будет одинаковым --- оно описано в единственном метаклассе.

Таким образом, класс C является экземпляром своего некоторого собственного, "личного" метакласса.

Чтобы определить, экземпляром какого класса является некоторый объект, ему можно послать сообщение #class. Например:

(Point x: 1 y: 2) class "printIt -> Point"
Point class "printIt -> Point class"


"Личные" метаклассы в Smalltalk не имеют собственного имени (так как ими очень редко пользуются люди) и их текстовое представление совпадает с текстом посылки сообщения на получение метакласса.

Поскольку поведение у всех "личных" метаклассов одинаково, они имеют общий метакласс:

Point class class "printIt -> Metaclass"

Класс Metaclass имеет свое собственное поведение и, соответственно, собственный метакласс:

Metaclass class "printIt -> Metaclass class"

Метакласс класса Metaclass является обычным метаклассом и, соответственно, его метаклассом является Metaclass. "Метаклассом класса Metaclass class является класс Metaclass" :)

--- Примечание 1.
Например, класс Point должен иметь метод #x:y: для создания точки сзаданными координатами:

Point x: 1 y: 2.

Для большинства других классов (String, Integer, Boolean,...) этот метод смысла не имеет.
---

... продолжение следует...

вторник, 8 сентября 2009 г.

UI + Metadescriptions

Исследование возможностей использования мета-описаний для создания "универсального" UI Framework

Smalltalk + Java

Возможности использования Java-кода из Smalltalk (VW). JavaConnect и JNIPort

пятница, 3 апреля 2009 г.

Пример работы с mock-ами

Контекст


Сайт. Пользователь может задавать вопросы, заполняя и отправляя соответствующую форму. Вопросы представлены экземплярами класса Question. Когда вопрос изменяется (в результате редактирования пользователем) он получает сообщение #changed.

Задача


Когда изменяется вопрос, нужно отослать соответствующее оповещение администратору сайта.

Решение



(1) QuestionTests >> testNotifiesAdminOnChange
(2) | question |
(3) question := Question new.
(4) [ :notifier |
(5) question notifier: notifier.
(6) [ question changed ]
(7) should strictly satisfy:
(8) [ notifier notifyAdminAbout: question ]
(9) ] runScenario


Пояснение


В строках (4) -- (9) создается сценарий.
Параметры сценария (строка (4)) инициализируются mock-объектами.
В блоке (6) описываются действия, определяющие тестируемую ситуацию: question получает сообщение #changed.
В строке (7) задается условие: в результате этих (заданных выше в строке (6) действий должно происходить строго в заданной последовательности то, что записано в блоке строки (8).
В этом блоке записано, что объект notifier должен получить сообщение #notifyAdminAbout: с аргументом, идентичным question.

Обратите внимание! Не указывается, к какому классу будут принадлежать нотификаторы, с которыми будут работать вопросы.
Далее разработка будет включать шаги по созданию и описанию поведения такого класса.

Замечание


Также, возможно, потребуется рефакторинг по вынесению адресата оповещения в параметр и (в дальнейшем, возможно) изменению системы отсылки сообщения. На это указывает наличие указания на адресата (admin) в селекторе сообщения #notifyAdminAbout:.