测试一个类的例子

lit*_*way 2 boolean smalltalk class squeak

我有一个吱吱声的问题,我是全新的,所以我问的是基础知识.我创建了一个类

Object subclass: #Course
instanceVariableNames: 'id name day time isTwoHoursLong'
classVariableNames: ''
poolDictionaries: ''
category: 'Kernel-Objects'
Run Code Online (Sandbox Code Playgroud)

它实现了以下方法:

isTwoHoursLong: aBoolean
(aBoolean isMemberOf: Boolean) 
    ifFalse: [self error: 'invalid input value']
    ifTrue: [isTwoHoursLong:=aBoolean.].
Run Code Online (Sandbox Code Playgroud)

aBoolean必须为true或false(布尔值的实例).现在我尝试使用该方法:

|c1|
c1:=Course new.
c1 isTwoHoursLong:true.
Run Code Online (Sandbox Code Playgroud)

但由于某种原因,我陷入了发送错误的ifFalse选项.有人可以帮忙清理一下吗?

Mar*_*inW 6

尝试isKindOf:而不是isMemberOf:.
True并且False是子类BooleanisKindOf:测试参数是接收器的类还是超类.

但我可能会完全忽略这个手动类型检查.

  • 不,你不应该.这是防御性编程,在Smalltalk中我们不这样做.消息通常由人,编程人员编写,他们阅读您的代码并理解它.如果您的消息开头是......我们都认为它应该是一个布尔值.如果出现问题,我们会仔细阅读.无论如何,为实例变量设置这么长的名称是很奇怪的.而且,使用是......:设置它,你可以做两个要设置为真,#dontBeTwoHoursLong为假.另外..考虑使用langth而不是boolean.否则,3或4小时的课程是相同的 (5认同)
  • 这个.对于smalltalk来说,进行类型检查以分配变量是完全奇怪的. (2认同)
  • 我同意@ CarlosE.Ferro(除了关于长实例变量的一点 - 不要害怕明确,_t special_在Smalltalk中).如果您习惯使用强类型语言(例如Java),那么您已经习惯了为您处理此类事情的编译器.Smalltalk是不同的(有人说"动态类型") - 程序员更加信任a)向方法发送正确的类型,或b)如果发生意外情况就能调试它(以"实时"语言调试Smalltalk比在write-compile-run-cycle-type语言中容易得多,一旦你掌握它的话. (2认同)