(Mis) Понимание Smalltalk и TDD - PullRequest
       24

(Mis) Понимание Smalltalk и TDD

7 голосов
/ 22 марта 2009

Я пытаюсь выучить Smalltalk на практике, поэтому я получаю контроль над синтаксисом и стилем, создав простой класс "Matrix".

Прежде всего, я был бы признателен, если бы он был связан с хорошим учебником Smalltak (хотя это совершенно необязательно), предпочтительно с тем, который не предполагает использование графического интерфейса пользователя (я бы скорее набрал .st s, чем fish вокруг проводника иерархии, чтобы поставить методы на их место).

Затем, на TDD: для этого проекта я звоню gst-sunit -f matrix.st -f matrix-test.st BaseMatrixTests, и наверняка найдется лучший способ, чем этот. Есть?

И, наконец, об утверждениях: я пытаюсь написать метод и поместить утверждения в него, например ::

Matrix>>multiplyBy: anotherMatrix [
    [ self isNotEmpty ] assert.
    "Do Multiplication"
    [ result dimensions = (self height)@(anotherMatrix width) ] assert.
]

Как я могу делать такие утверждения?

Редактировать: Вопросы, отмеченные явно.

Ответы [ 10 ]

11 голосов
/ 22 марта 2009

Хорошо, несколько штук здесь.

Во-первых, я согласен с markusQ, хотя я полностью сочувствую: я предпочел бы написать свой код непосредственно в EMACS. Одна из особенностей Smalltalk заключается в том, что на самом деле это очень неумолимо для людей, которые не хотят делать то, что делает Smalltalk Way. В этом случае Smalltalk Way должен использовать браузеры.

Во-вторых, отчасти причина того, что это Smalltalk Way, заключается в том, что Smalltalk во многих отношениях не похож на другие языки. На самом деле, для всех практических целей, нет никакого способа сделать «отдельный» исполняемый файл Smalltalk: все, что вы можете сделать, это создать образ Smalltalk с добавлением нескольких относительно небольших фрагментов вашего собственного кода. Когда вы пишете код с использованием внешнего редактора Как и в показанном вами синтаксисе, вы буквально просто печатаете вручную формат импорта / экспорта, который легче набирать, чем XML. Но только немного.

Мораль в том, что делай это способом Smalltalk с браузерами.

Есть несколько довольно хороших уроков для Smalltalk. Я обычно использую Squeak, поэтому те, кого я видел, используют Squeak, как здесь .

На TDD вам повезло, потому что Smalltalk был первым, кто получил xUnit. Для Smalltalk он называется SUnit, и здесь есть хороший учебник .

Вы используете там утверждения, которые, по-видимому, в основном представляют собой подход «проектирование по контракту». Была проделана работа по добавлению дизайна по контракту в Smalltalk, как здесь . Для простых утверждений вы можете добавить код, как в этом вопросе .

assert: aBlock 
    "Throw an assertion error if aBlock does not evaluates to true."
    aBlock value
        ifFalse: [AssertionFailure signal: 'Assertion failed']
9 голосов
/ 22 марта 2009

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

Ключевым моментом в smalltalk является то, что это все объекты . Все пути вниз (целые и символы являются объектами) и все пути вверх (классы, методы, браузеры, сама IDE) - это все объекты . Если вы будете настаивать на борьбе с ним, вам повезет столько же, сколько кому-то, кто хочет научиться писать на С, перетаскивая объекты.

6 голосов
/ 22 марта 2009

Если вы скачали Cincom Smalltalk Non-Commercial, существует несколько онлайн-руководств. Начните здесь:

http://www.cincomsmalltalk.com/userblogs/cincom/blogView?content=tutorials

Если вы скачали Squeak, начните здесь:

http://wiki.squeak.org/squeak/792

И да, вам действительно нужно использовать IDE для эффективной работы с Smalltalk.

При тестировании загрузите SUnit. В Cincom Smalltalk это загружаемый компонент; Я рассмотрел загрузку (и использование) этого в видеоуроках, связанных выше. Я не совсем уверен, как загрузить его для Squeak, или это там часть базы, но он, безусловно, доступен для него.

3 голосов
/ 22 марта 2009

Кроме запроса учебника, я не вижу здесь вопроса. Не могли бы вы уточнить, что вы хотите знать?

Хороший список ресурсов для начинающих можно найти в этом вопросе: https://stackoverflow.com/questions/481976/is-there-a-dive-into-smalltalk-book

1 голос
/ 23 марта 2009

Выше было предложено добавить #assert: к Object, но я бы добавил #assert к BlockClosure (или к тому, что [] class в GNU Smalltalk).

assert
    this value ifFalse: [AssertionFailure signal: 'Assertion failed']

и, следовательно, использовать как в

[ value notNil ] assert.
[ value > 0 ] assert.
[ list isEmpty not ] assert.

и так далее.

1 голос
/ 23 марта 2009

По поводу утверждений, пожалуйста, посмотрите на другой вопрос, недавно опубликованный.

Что касается TDD, то да, звонить по номеру gst-sunit -f matrix.st -f matrix-test.st BaseMatrixTests - лучший способ. Все остальное просто строится на этом, например, это могут быть альтернативы:

  • заставляет все подклассы TestCase для вашего пакета наследоваться от поддельного подкласса, чтобы вы могли сказать AllMatrixTests* в командной строке gst-sunit (когда вы добавляете больше тестов).
  • файл в matrix.st из matrix-test.st, что исключает один параметр -f.
  • создайте файл Makefile и package.xml, чтобы создать файл .star для вашего пакета, как описано здесь . Тогда вы можете сделать только gst-sunit -pMatrix.
1 голос
/ 22 марта 2009

Итак, насчет утверждений, Squeak Smalltalk уже приводит Object >> assert: Итак, я полагаю, вы можете сделать:

self assert: self isNotEmpty.
self assert: result dimensions equal: (self height)@(anotherMatrix width)

Если вы используете GNU smalltalk, это может ответить на вопрос, как делать там утверждения: Smalltalk и утверждения

Niko

0 голосов
/ 16 августа 2011

Я бы лучше набрал свои .sts, чем fish вокруг проводника иерархии, чтобы поставить методы на их место).

Вы говорите это сейчас, и я чувствовал то же самое, пока не потратил некоторое время на изучение того, как использовать эти инструменты.

И я говорю это как текущий пользователь Vim и бывший пользователь Emacs. Я действительно стал довольно продуктивным, используя браузер классов и другие инструменты в Pharo, теперь, когда я выучил веревки.

При этом, если вы действительно хотите идти своим путем, GNU Smalltalk - это правильный выбор для вас.

Я хотел бы отметить, что, по крайней мере, у Pharo есть класс Matrix, который вы можете использовать для вдохновения. Писк тоже должен. Возможно, вы узнаете, насколько полезен браузер классов для изучения Matrix. ;)

0 голосов
/ 24 декабря 2009

http://stores.lulu.com/store.php?fAcctID=2748699 (Также вы найдете ссылку для скачивания в формате pdf)

0 голосов
/ 22 марта 2009

Учебник по Smalltalk - введение в Основы программирования, ориентированного на сообщения, с помощью Smalltalk

...