2015-01-14 26 views
3

我正在研究一个对象,该对象建议可能的方法分类。寻找推断选择器分类的方法

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

  1. 相同的选择的本地分类(即,在同一层次上下)
  2. 在其他类别相同的选择的其他分类(分类通过频率)
  3. 存取检测(是该方法的设置器或吸气剂?ifTrue: [^#accessing]
  4. 已知选择前缀(#IS ...,#PRINT ...,#as ...等)

,并且如果所有上述的失败(即,建议是空的):

  • 类别下的方法(仅在该方法的类理解的那些发送的其他消息,并超类)
  • 我还有其他已知的启发式吗?

    --- --- EDIT

  • 从相同类只发送选择器 - > #private(@Carlos E.铁)

  • 已知选择(#= #hash等 - > #comparing等)

  • 空类别(如果一类是空的机会是用户刚添加它用于下一个选择器进行分类。)

  • +0

    我们在哪里可以找到你的'SelectorClassifierAssistant'? – MartinW

    +0

    这是一个非常有趣的问题。你的清单看起来不错。让我们张贴您的发现。我对自动分类没有太大的兴趣,但我很乐意阅读风格指南。我也对使用gerunds作为协议名称感兴趣。 – MartinW

    +1

    @MartinW动名词的用法来自于你如何阅读协议:*方法来访问*等,在蓝皮书大汗说明。 –

    回答

    1

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

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

    我发现原因是,这一方法称为从这个最有可能是一般性的服务,但发送者认为这是一个服务,并确定在使用此消息感兴趣的领域。

    ---- ----编辑

    另一个相关的启发,很简单的是:如果所有的发件人是本地(本类或子类),然后在“私”是一个很好的候选人进行分类的。没有发件人的方法通常是私人服务。

    +0

    感谢。我已经实施了你的第二个建议,并正在考虑第一个建议。 –

    1

    当然。这里有一些其他著名的模式:

    实例创建

    newStringBrick 
        ^GLMStringBrick new 
    

    默认值

    defaultDotsText 
        ^'...' 
    

    延迟初始化

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

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

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

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

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

    +0

    谢谢Stef。这些都是经常出现的方法分类的很好的例子(和提示)。我的问题是不过有关如何建议类别名称的短暂而宝贵的列表,对指定选择,类似情报,我们有选择自动完成启发式(这是相当复杂的。) –