(Mis)了解Smalltalk和TDD

时间:2009-03-22 00:46:09

标签: testing syntax tdd smalltalk

我正在努力学习Smalltalk,所以我通过建立一个简单的“Matrix”类来掌握语法和风格。

首先,如果链接到一个好的Smalltak教程(尽管这完全是可选的),我将不胜感激,最好不要使用GUI(我宁愿输入我的.st s而不是层次结构探索器周围的鱼将方法放在他们的位置)。

然后,在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 个答案:

答案 0 :(得分:11)

好的,这里有几件。

首先,我同意markusQ,虽然我完全同情:我宁愿能够直接在EMACS中编写我的代码。关于Smalltalk的一个问题是,对于那些不想做Smalltalk Way事情的人来说真的是非常无情。在这种情况下,Smalltalk方式是使用浏览器。

其次,这就是Smalltalk方式的部分原因是,Smalltalk在很多方面都不像其他语言 。实际上,实际上没有办法制作一个“单独的”Smalltalk可执行文件:你所能做的只是创建一个Smalltalk的图像,并添加一些相对较小的自己代码片段。当你使用外部编辑器编写代码时就像你展示的语法一样,你只需要手工输入一种导入/导出格式,这种格式比XML更容易手动输入。但只是有点。

道德是,用浏览器做Smalltalk方式。

有一些关于Smalltalk的相当不错的教程。我经常使用Squeak,所以我看到的是使用Squeak,here

在TDD上,你很幸运,因为Smalltalk是第一个获得xUnit的地方。对于Smalltalk,它叫做SUnit,有一个很好的教程here

你在那里使用断言似乎基本上是“按合同设计”的方法。已经完成了通过合同向Smalltalk添加设计的工作,here。对于简单断言,您可以像this SO question中一样添加代码。

assert: aBlock 
    "Throw an assertion error if aBlock does not evaluates to true."
    aBlock value
        ifFalse: [AssertionFailure signal: 'Assertion failed']

答案 1 :(得分:9)

我讨厌说(因为你明确表示你不想听),但进入IDE。试图在不使用IDE的情况下让你的头脑转向smalltalk,就像去巴黎吃麦当劳一样。当然,你在巴黎,但你并没有真正让自己暴露于它的全部。

关于smalltalk的关键是它是所有对象。一直向下(整数和字符是对象)和一直向上(类,方法,浏览器,IDE本身)是所有对象。如果你坚持打击它,你将获得与想要学习如何通过拖放来写C的运气一样多的运气。

答案 2 :(得分:6)

如果您下载了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 :(得分:3)

除了教程请求之外,我在这里没有看到任何问题。你能澄清一下你想知道的是什么吗?

在这个问题中可以找到一个很好的初学者资源列表:https://stackoverflow.com/questions/481976/is-there-a-dive-into-smalltalk-book

答案 4 :(得分:1)

所以,关于断言,Squeak Smalltalk已经带来了对象>>断言: 所以,我想你可以做到:

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

如果您正在使用GNU smalltalk,这可能会回答如何在那里进行断言:Smalltalk and Assertions

尼科

答案 5 :(得分:1)

关于断言,请查看最近发布的另一个问题。

关于TDD,是的,调用gst-sunit -f matrix.st -f matrix-test.st BaseMatrixTests是最好的方法。其他所有东西都建立在这一点上,例如,这些可能是替代方案:

  • 让你的包的所有TestCase子类继承一个假的子类,这样你就可以在gst-sunit的命令行上说AllMatrixTests*(当你添加更多的测试时)。
  • 来自matrix-test.st的matrix.st中的文件,从而消除了一个-f选项。
  • 创建一个Makefile和package.xml文件,为您的包创建一个.star文件,如here所述。然后你可以做gst-sunit -pMatrix

答案 6 :(得分:1)

上面已建议将#assert:添加到Object,而是将#assert添加到BlockClosure(或GNU中[] class的任何内容Smalltalk中)。

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

因此在

中使用
[ value notNil ] assert.
[ value > 0 ] assert.
[ list isEmpty not ] assert.

等等。

答案 7 :(得分:0)

Smalltalk Primer介绍使用Smalltalk进行面向消息的编程要点

答案 8 :(得分:0)

http://stores.lulu.com/store.php?fAcctID=2748699(您还可以找到下载pdf的链接)

答案 9 :(得分:0)

  

我宁愿输入我的.sts而不是在层次结构浏览器周围钓鱼,以便将方法放在适当的位置。)

你现在这么说,直到我花了一些时间学习如何使用这些工具,我才有同感。

我说这是Vim的当前用户和Emacs的前用户。我现在已经学习了绳索,现在我已经非常有效地使用Pharo中的类浏览器和其他工具了。

话虽如此,如果您真的想按照自己的方式行事,GNU Smalltalk是您的正确选择。

我想在这一点上指出,至少Pharo有一个Matrix类,你可以用它作为灵感。吱吱也应该。也许您将了解类浏览器检查Matrix的有用程度。 ;)