在类名中使用动词

时间:2011-12-23 09:37:11

标签: language-agnostic

我正在阅读Robert C. Martins的书“清洁代码”。他撰写了关于不在类名中使用动词的约定。

我正在进行的项目我们需要验证和处理一些xml,所以我创建了这样的东西

public class XmlProcesser
{
public XmlProcesser(string filePathAndName)
{
}

public bool Validate()
{
}
}

但是叔叔Bobs建议不要在班级名称中使用“处理器”。

但是我应该怎么称呼它? Xml并不好,因为我在代码中经常使用.net类xml。我想过XmlHandler,但我想这比处理器更糟,因为“处理程序”对于程序员来说是另一回事。

你好,怎么办?你在班级名字中使用动词吗?

2 个答案:

答案 0 :(得分:29)

命名很重要。哎呀,T.S。艾略特和安德鲁劳埃德韦伯从 The Caming 中获得了财富。但马丁斯的观点并不是关于不使用动词 - 而是关于面向对象的思考。类是用于实例化对象的模式。物体是物。他们的行为或名字是否更好地描述了类似的事物?

我是食肉动物吗?对。但我也写程序。我是程序员吗?对。但我也投票支持奥巴马。我是奥巴马的支持者吗?对。但是......最后,我是一个人。更准确地说,我是班级[1] HomoSapiensSapiens的一个实例。 HomoSapiensSapiens有很多很多很多方法,所有这些方法都有类似动词的名字。像HomoSapiensSapiens.EatBacon()一样。像HomoSapiensSapiens.WriteGoodCode()一样。像HomoSapiensSapiens.VoteDemocratic()一样。

Martin最重要的一点是如果你的课程最好像动词一样命名,你就会认为你的课程都错了。

[1]“OO”中的“类”意义,而不是王国/门/类的生物意义。

答案 1 :(得分:9)

  1. 如评论中所述:处理器源自动词,而不是动词。因此,处理器是一个好的名字。

  2. XmlProcessor并没有真正告诉你关于这个类的更多信息。好吧,它正在处理xml,但它做了什么?验证它?转发它?解析它?所以很可能在角落里有一个更好的名字

  3. 认真对待SOLID原则,你最终会得到类似的课程 XmlProcessor {     public void process(){...} }

  4. CalvinTransmogrifier{
        public Calvin transmogrify(Calvin c){ ...}
    }
    

    那时你已经达到了OOP和功能编程之间的界限。人们可以提出一个论证

    Transmogrify{
        public Calvin do(Calvin c){ ... }
    }
    

    是一种可接受的命名方式。如果这实际情况取决于您选择的语言。例如。在Scala,如果你可以使用'apply'而不是'do',并且实际上像这样调用apply mothed

    Transmogrify(new Calvin)
    

    至少我认为更好

    Transmogrifier.do(new Calvin)