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

Test-Driven Development --- некоторые тезисы

0. "Предпосылка": программирование в стиле "сначала использование, потом реализация" в Smalltalk.
1. TDD = Test-First + Test Automation + Refactoring.
2.  По сути, TDD является научным открытием: написание тестов и анализ (+ частично проектирование) --- очень близкие виды деятельности.
3. TDD --- agile-методология для разработчиков (кстати, до сих пор единственная мне известная).
4. ... А "менеджерские" методологии не будут работать, если разработчики не будут agile-ными.
5. Итерации внутри итераций.
6. (Неформальная постановка задачи->) Создание теста (Формальная постановка задачи) -> Реализация -> Рефакторинг
7. В Smalltalk-е TDD в значительной степени реализуется как "программирование в отладчике"

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

Xerox PARC --- опередившая время

(взято с The Spirit of PARC)
Изобретено в Xerox Palo Alto Research Center:
- лазерный принтер
- современный графический интерфейс пользователя
- первый текстовый редактор "что видишь, то и получаешь" :) (WYSIWYG)
- предок языка PostScript
- Ethernet
- объектно-ориентированное программирование
- интегрированная среда разработки (и выполнения!)

Два последний пункта --- это Smalltalk.


вторник, 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