在Squeak Smalltalk中将参数作为类进行验证

在Squeak Smalltalk中将参数作为类进行验证,smalltalk,squeak,Smalltalk,Squeak,如何将参数验证为类对象?例如,如果我想将参数验证为字符串,我可以编写param1-isString。是否有类似于isClass的东西?您可以测试您的参数是否继承自类或元类: String isKindOf: Class orOf: Metaclass => true "If you don't want Metaclasses, simply use isKindOf: Class" String class isKindOf: Class orOf: Metaclass => tr

如何将参数验证为类对象?例如,如果我想将参数验证为字符串,我可以编写
param1-isString
。是否有类似于
isClass
的东西?

您可以测试您的参数是否继承自
元类

String isKindOf: Class orOf: Metaclass => true
"If you don't want Metaclasses, simply use isKindOf: Class"
String class isKindOf: Class orOf: Metaclass => true
'foo' isKindOf: Class orOf: Metaclass => false
但是,最好是在
(以及任何其他相关对象)本身上实现要执行的操作,这样您就可以只执行
someOp
,而无需实际验证输入


如果您的输入是字符串,并且希望获得具有相应名称的类(如果存在),则可以使用:

Smalltalk classNamed: 'String'

您可以测试参数是否继承自
元类

String isKindOf: Class orOf: Metaclass => true
"If you don't want Metaclasses, simply use isKindOf: Class"
String class isKindOf: Class orOf: Metaclass => true
'foo' isKindOf: Class orOf: Metaclass => false
但是,最好是在
(以及任何其他相关对象)本身上实现要执行的操作,这样您就可以只执行
someOp
,而无需实际验证输入


如果您的输入是字符串,并且希望获得具有相应名称的类(如果存在),则可以使用:

Smalltalk classNamed: 'String'

正如其他人所指出的,
isKindOf:
isMemberOf:
是您在尝试解决此类问题时的朋友,但调用这些方法通常是一种代码气味。几乎总有更好的方法可以做到这一点,我将其分为两类:

  • 在所有相关类上实现该方法,在每个类上执行正确的操作。例如,如果我正在编写一个视频游戏,那么,与其测试得到的对象类型并告诉它下一步要做什么,不如在所有游戏对象上实现一个
    performNext
    函数,然后把它留给每个对象来决定它应该做什么
  • 测试功能,而不是类成员。与其检查某个
    是否属于类,不如检查它是否
    响应了:aMethod
    ,如果响应了,就调用它。这也意味着,如果您使用的是Traits,那么已经获得了有效方法但不在您预期的初始层次结构中的类仍然可以被传递,这一点非常重要,因为在Traits中可能没有一个类层次结构可供测试

  • 正如其他人所指出的,
    isKindOf:
    isMemberOf:
    是您在尝试解决此类问题时的朋友,但调用这些方法通常是一种代码气味。几乎总有更好的方法可以做到这一点,我将其分为两类:

  • 在所有相关类上实现该方法,在每个类上执行正确的操作。例如,如果我正在编写一个视频游戏,那么,与其测试得到的对象类型并告诉它下一步要做什么,不如在所有游戏对象上实现一个
    performNext
    函数,然后把它留给每个对象来决定它应该做什么
  • 测试功能,而不是类成员。与其检查某个
    是否属于类,不如检查它是否
    响应了:aMethod
    ,如果响应了,就调用它。这也意味着,如果您使用的是Traits,那么已经获得了有效方法但不在您预期的初始层次结构中的类仍然可以被传递,这一点非常重要,因为在Traits中可能没有一个类层次结构可供测试

  • 如果你想涉及类、元和特性的例子,你在SeeAK中也有信息的行为。
    如果你想覆盖类、元和特性的情况,你在SeeAK中也有信息的行为。
    你可以考虑接受一个答案或者指出什么是错的,你可以考虑接受答案或者指出丢失了什么。