Smalltalk中的必需属性

use*_*565 3 oop smalltalk visualworks pharo dolphin-smalltalk

我在Pharo Smalltalk中编写类,但我认为这个问题对其他Smalltalk实现有效.

我知道一种实现具有特定属性的实例的方法是为实例创建提供类方法,然后建议使用类创建方法.但是任何用户都知道可以随时使用new或basicNew.

我想到使new和basicNew无效引发异常,但这似乎是太过激烈的措施,有时我可能需要创建实例来调试.

是否有其他库或机制来强制执行这些特定属性?

Lea*_*lia 8

那没有.这很好.

以下是您可能会遵循的一些方法:

  1. 通过为它们提供验证来确保您的对象有效.这是一个非常广泛的主题,所以我只想说一个验证框架能够检查你的对象,并以某种方式使它明确表达他们无法遵守的任何规则.

    根据您正在执行的操作,您可以在对象生成或修改时限制对GUI的验证.但是,更复杂的方法应该允许任何对象决定它是否有效(在给定的上下文中).

  2. 从实例端协议中排除单个setter.只提供多个关键字设置器,如果缺少或不合适,将会失败.这意味着您将提供类似的方法Point >> #x:y:,但没有Poit >> #x:Point >> #y:.

    如示例所示,您会发现很难完全采用这种做法,因为基本类不遵循这种风格.另请注意,这种做法需要某种验证,因为只检查notNil通常太天真.

  3. 在需要解决这些问题之前,请放松并不做任何事.

    换句话说,直到您的软件进化到足以引起您注意其对象的创建和更改方式为止.

我声称事情的原因很好,因为Smalltalk传统上倾向于开放而不是安全,它促进甚至鼓励人们进行实验,即使是以"错误"的方式.旨在防止物体被破坏的每个功能迟早都会阻止您修复它们.更重要的是,它们会消耗大量能量,否则这些能量将被用于更高效的目标.

  • 我推荐选项#3.作为对象的作者,您可以(事实上应该)做的一件事是将您的假设添加到课堂评论中.如果你添加"我希望使用#newWith实例化的东西: - 如果你使用#new或#basicNew创建我的实例,可能会发生奇怪的事情",那么你已经完成了一些事情并且发生了任何问题来自不适当/意外的实例化是使用您的对象的人的责任.试图以某种可能的方式预测某人可能会做一些奇怪的事情意味着开始一场你最有可能失败的战斗.;-) (2认同)