Testing (Mis)理解Smalltalk和TDD

Testing (Mis)理解Smalltalk和TDD,testing,syntax,tdd,smalltalk,Testing,Syntax,Tdd,Smalltalk,我试图通过实践来学习Smalltalk,因此我通过构建一个简单的“Matrix”类来掌握语法和样式 首先,如果能链接到一个好的Smalltak教程(尽管这是完全可选的),我将不胜感激,最好是一个不涉及使用GUI的教程(我宁愿键入我的.sts,而不是在层次结构资源管理器中查找方法来代替它们) 然后,在TDD上:对于这个项目,我要调用gst sunit-f matrix.st-f matrix-test.st BaseMatrixTests,肯定有更好的方法有吗? 最后,关于断言:我试图编写一个方法

我试图通过实践来学习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.
]
我如何做这种断言?


编辑:明确标记问题。

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

在这个问题中可以找到一个适合初学者的资源列表:

我不想这么说('因为你明确表示你不想听到它),但是进入IDE。试图在不使用IDE的情况下了解smalltalk就像去巴黎和麦当劳吃饭一样。当然,你现在在巴黎,但你并没有真正了解这一切


smalltalk的关键在于它都是对象。从头到尾(整数和字符都是对象),从头到尾(类、方法、浏览器、IDE本身)都是对象。如果你坚持与之抗争,你的运气将与那些想通过拖放东西来学习如何编写C语言的人一样好。

好的,这里有几段

首先,我同意markusQ,尽管我完全赞同:我宁愿能够直接用EMACS编写代码。Smalltalk的一个特点是,对于那些不想用Smalltalk的方式做事的人来说,它真的是非常不可原谅的。在这种情况下,Smalltalk的方式是使用浏览器

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

其寓意是,用Smalltalk的方式使用浏览器

Smalltalk有一些相当不错的教程。我通常使用Squeak,所以我见过的人都使用Squeak,如图所示

在TDD上,你很幸运,因为Smalltalk是第一个得到xUnit的地方。对于Smalltalk,它被称为SUnit,并且有一个很好的教程

您使用的断言基本上是一种“契约式设计”方法。在Smalltalk中增加合同设计的工作已经完成,如下所示。对于简单的断言,可以添加代码,如中所示


如果您下载了Cincom Smalltalk非商业版,则有许多在线教程。从这里开始:

如果您下载了Squeak,请从这里开始:

是的,您确实需要使用IDE来有效地处理Smalltalk

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

测试时,加载SUnit。在Cincom Smalltalk中,它是一个可加载组件;我已经在上面链接的视频教程中介绍了加载(和使用)它。我不完全确定如何为Squeak加载它,或者它是否是那里的基础的一部分,但它肯定是可用的。

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

self assert: self isNotEmpty.
self assert: result dimensions equal: (self height)@(anotherMatrix width)
如果您正在使用GNU smalltalk,这可能会回答如何在那里进行断言:


Niko

介绍了Smalltalk面向消息编程的要点

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

关于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文件,如所述。然后您就可以执行gst sunit-pMatrix

上面有人建议将
#断言:
添加到
对象
,但我更愿意将
#断言
添加到
块闭包
(或者GNU Smalltalk中的任何
[]类

并因此在中使用

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

(您还可以找到下载pdf的链接)

我宁愿键入我的.sts,也不愿在层次结构资源管理器中搜索以将方法放在适当的位置)

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

我作为Vim的当前用户和Emacs的前用户这样说。现在我已经学会了诀窍,在Pharo中使用类浏览器和其他工具真的变得非常高效

话虽如此,如果你真的想走自己的路,GNU Smalltalk是你的正确选择

我想在这一点上指出,虽然至少Pharo有一个矩阵类,您可以使用它来获得灵感。Squeak也应该这样。也许您将了解到类浏览器在检查矩阵时是多么有用。;)

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