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

Looking for ways to deduce selector classifications

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

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

  1. 本地class同一选择器的化身(即在同一层级上下)
  2. 其他 class其他 class 中相同选择器的化(按频率排序)
  3. 存取器检测(方法是setter还是getter?ifTrue: [^#accessing]
  4. 已知的选择器前缀(#is...、#print...、#as...等)

并且,如果上述所有方法均失败(即建议为空):

  1. 在该方法中发送的其他消息的类别(仅在该方法的 class 和 superclasses 中理解的消息)

我可以使用其他已知的启发式方法吗?

---编辑---

  1. 选择器仅从同一个 class -> #private (@Carlos E. Ferro)

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

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

当然可以。以下是一些其他著名的模式:

实例创建

newStringBrick
    ^ GLMStringBrick new

默认值

defaultDotsText
    ^ '...'

延迟初始化

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

当然还有很多 framework/application 具体模式。 Sunit 单元测试、海边应用、magritte 描述都有特定的模式。一个非常简单的是 magritte-description

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

[edit] 然后是启发式方法:另一个可能不错的建议是我最后使用的那个,或者如果你看到一个短的重复周期,那就是合适的。

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

我认为在你的最后一个选项中,与其查看发送到 classify 的方法中的消息类别,不如查找此消息的发件人类别会更好。

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

我发现的原因是从这个调用的方法很可能是一般服务,但是这个发送者将其视为服务并定义使用此消息的“感兴趣区域”。

---- 编辑 ----

另一个相关的启发式算法,非常简单:如果所有发件人都是本地的(这个 class 或 subclasses),那么 "private" 是 [=21 的一个很好的候选者=] 化它。 class 之外没有发件人的方法通常是私有服务。