Initialization Smalltalk:定制构建的正确方式

Initialization Smalltalk:定制构建的正确方式,initialization,smalltalk,pharo,metaclass,Initialization,Smalltalk,Pharo,Metaclass,哪本书最能描述定制构造函数的正确方法 例如,我希望在RDBMS存储中模拟特殊的文件系统 Object subclass: #C1_Object C1_Object subclass: #C1_File instanceVariableNames: 'stream name' 用例: C1_文件新增:“blabla” 或 C1_文件创建:“blabla” 1看起来是本地人,但是 我看到过建议不要覆盖系统分配机制 下一步:什么更好 C1_File class>>create:

哪本书最能描述定制构造函数的正确方法

例如,我希望在RDBMS存储中模拟特殊的文件系统

Object subclass: #C1_Object
C1_Object subclass: #C1_File
    instanceVariableNames: 'stream name'
用例:

C1_文件新增:“blabla” 或

C1_文件创建:“blabla” 1看起来是本地人,但是 我看到过建议不要覆盖系统分配机制

下一步:什么更好

C1_File class>>create: aFileName
    ^ self new initialize: aFileName
C1_File>>initialize: aFileName
    name := aFileName.
    stream := C1_FileStream forceNewFileNamed: aFileName.


谁告诉你不要超越系统分配机制

在任何情况下,在这种情况下都不建议使用override new:,因为对于CONNECTION new:而言,带参数的new:接收的是一个大小,而不是字符串,因此会造成混淆

现在,我会使用:named:,newWithName:,等等,但这取决于您的偏好

有一件事:在Pharo中,如果您执行instance:=self new and later instance initialize,您将调用initialize两次,因为new的默认实现是self basicNew initialize,因此您的方法需要如下定义:

C1_File class>>create: aFileName
    | instance |
    instance := self basicNew.
    instance name: aFileName.
    instance stream: ( C1_FileStream forceNewFileNamed: aFileName ).
    ^ instance initialize
但我也不建议这样做,在creator方法中初始化流感觉不好。相反,我会:

C1_File class>>create: aFileName
    ^ self basicNew
        initializeName: aFileName;
        yourself.

C1_File>>initializeName: aFileName
   self name: aFileName.
   self stream: ( C1_FileStream forceNewFileNamed: aFileName ).
   self initialize.

除了我在Sqeuak和第三方软件包中看到的Smalltalk代码之外,我没有任何参考。自定义构造函数,如Read-/WriteStream class>>on:aCollection,Text class>>fromString:以一种方式通信它们的参数将在创建的实例中用于什么。另一种风格是在构造函数初始化的实例变量之后直接命名构造函数。类似点类>>x:y:。带有:和withAll:的集合构造函数使代码能够流畅地阅读

我将始终努力命名构造函数,以便让send的读者清楚地知道,您将得到的答案是:在该集合上运行的流、具有这些坐标的点、具有给定名称/路径的打开文件?。我不会重写new:,并创建听起来相当通用的文件,但在讨论为编写或创建而打开的文件(如果不存在)时可能会很有用,尽管据我所知,这与FileStream API不同

否则,仍有可能不定义构造函数,而是直接在新的

哪本书最能描述定制构造函数的正确方法

Kent Beck的Smalltalk最佳实践模式(我强烈建议将其保存在手边以供参考)包含大约100个Smalltalk模式,其中

构造方法 构造函数参数法 快捷构造函数方法 它们都讨论了对象创建和参数传递的各个方面,但共同的主题是提高理解、清晰度和意图揭示选择器,这是另一种模式

当你有

C1_File create: 'blablabla'
现在还不清楚到底会发生什么;C1_文件将创建blabla吗?那是什么意思?正如埃斯特班所指出的,最好将论点命名为。。。C1_文件名为:“blabla”;现在我知道会发生什么了

1看起来是本地的,但我看到过不重写系统分配机制的建议

你必须搞乱basicNew才能搞乱分配机制。若你们看一看新技术的实现,它实际上并没有多大作用

Behavior>>new
    ^ self basicNew initialize
系统中还有大量示例:

OrderedCollection与:anItem 颜色来自字符串:“AC13D9”或颜色r:0.2 g:0.5 b:0.1 点x:10 y:17 读者/作者经常使用:。。STONReader打开:区域流 请注意,开头提到的这本书不仅展示了如何创建一个基本构造函数,还讨论了实例创建本身的其他问题和挑战,例如,当您有多个不同的构造函数以避免破坏您的方法协议时,等等

类端与实例端-更多的是Esteban答案的附录:


将课堂上的常规行为控制在最低限度;类端主要用于管理类本身的元行为,而不是实际工作。

关于文档问题,我通常参考Seaside编码约定。这里描述的策略适用于不同的方言,也适用于复杂的对象层次结构:
C1_File create: 'blablabla'
Behavior>>new
    ^ self basicNew initialize