寻找推断选择器分类的方法
Looking for ways to deduce selector classifications
我正在研究一个 SelectorClassifierAssistant
对象,该对象建议可能的 class 方法。
到目前为止,我已经实施了以下策略:
- 本地class同一选择器的化身(即在同一层级上下)
- 其他 class其他 class 中相同选择器的化(按频率排序)
- 存取器检测(方法是setter还是getter?
ifTrue: [^#accessing]
)
- 已知的选择器前缀(#is...、#print...、#as...等)
并且,如果上述所有方法均失败(即建议为空):
- 在该方法中发送的其他消息的类别(仅在该方法的 class 和 superclasses 中理解的消息)
我可以使用其他已知的启发式方法吗?
---编辑---
选择器仅从同一个 class -> #private (@Carlos E. Ferro)
已知选择器(#= #hash 等 -> #comparing 等)
空类别(如果类别为空,则可能是用户刚刚添加它以 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 之外没有发件人的方法通常是私有服务。
我正在研究一个 SelectorClassifierAssistant
对象,该对象建议可能的 class 方法。
到目前为止,我已经实施了以下策略:
- 本地class同一选择器的化身(即在同一层级上下)
- 其他 class其他 class 中相同选择器的化(按频率排序)
- 存取器检测(方法是setter还是getter?
ifTrue: [^#accessing]
) - 已知的选择器前缀(#is...、#print...、#as...等)
并且,如果上述所有方法均失败(即建议为空):
- 在该方法中发送的其他消息的类别(仅在该方法的 class 和 superclasses 中理解的消息)
我可以使用其他已知的启发式方法吗?
---编辑---
选择器仅从同一个 class -> #private (@Carlos E. Ferro)
已知选择器(#= #hash 等 -> #comparing 等)
空类别(如果类别为空,则可能是用户刚刚添加它以 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 之外没有发件人的方法通常是私有服务。