寻找推断选择器分类的方法

时间:2015-01-14 20:18:49

标签: smalltalk

我正在研究一个SelectorClassifierAssistant对象,该对象建议对方法进行可能的分类。

到目前为止,我已实施以下策略:

  1. 相同选择器的本地分类(即,在相同的层次结构中上下)
  2. 其他类中相同选择器的其他分类(按频率排序)
  3. 访问者检测(是设置者或获取者的方法吗?ifTrue: [^#accessing]
  4. 已知选择器前缀(#is ...,#print ...,#as ...等)
  5. 并且,如果以上所有都失败(即建议为空):

    1. 方法中发送的其他消息的类别(仅在方法的类和超类中理解的类别)
    2. 我可以使用其他已知的启发式方法吗?

      --- --- EDIT

      1. 仅从同一类发送的选择器 - > #private(@Carlos E. Ferro)

      2. 已知选择器(#=#hash等 - > #comparing等)

      3. 空类别(如果类别为空,则可能是用户刚添加它以对下一个选择器进行分类。)

2 个答案:

答案 0 :(得分:1)

不确定。以下是一些其他众所周知的模式:

实例创建

newStringBrick
    ^ GLMStringBrick new

默认值

defaultDotsText
    ^ '...'

延迟初始化

items
    ^items ifNil: [ items := OrderedCollection new ]

当然,还有很多框架/应用程序特定的模式。 Sunit单元测试,海边应用,magritte描述都有特定的模式。一个非常简单的是magritte-description

descriptionArticle
    <magritteDescription>
    ^QCToOneOptionRelationDescription new
        accessor: #article;
        label: 'Article';
        options: self possibleArticles;
        priority: 40;
        classes: QCArticle allSubclasses;
        yourself.

[编辑]然后是启发式:另一个可能很好的建议是我最后使用的那个,或者如果你看到一个短暂的重复周期,那个适合的那个。

是否可以直接为扩展方法找到一个好的类别?

答案 1 :(得分:1)

我认为在您的上一个选项中,不是查看方法中发送的消息类别进行分类,而是最好查找此消息的发件人类别。

这是我经常使用的启发式方法。

我找到的原因是,从这个调用的方法最有可能是一般服务,但是这个方法的发件人将其视为服务并定义了一个使用此消息的“感兴趣区域”。

----编辑----

另一个相关的启发式,非常简单:如果所有发件人都是本地的(这个类或子类),那么“私有”是一个很好的候选者来对它进行分类。没有发件人的方法通常是私人服务。