我正在阅读Robert C. Martins的书“清洁代码”。他撰写了关于不在类名中使用动词的约定。
我正在进行的项目我们需要验证和处理一些xml,所以我创建了这样的东西
public class XmlProcesser
{
public XmlProcesser(string filePathAndName)
{
}
public bool Validate()
{
}
}
但是叔叔Bobs建议不要在班级名称中使用“处理器”。
但是我应该怎么称呼它? Xml并不好,因为我在代码中经常使用.net类xml。我想过XmlHandler,但我想这比处理器更糟,因为“处理程序”对于程序员来说是另一回事。
你好,怎么办?你在班级名字中使用动词吗?答案 0 :(得分:29)
命名很重要。哎呀,T.S。艾略特和安德鲁劳埃德韦伯从 The Caming 中获得了财富。但马丁斯的观点并不是关于不使用动词 - 而是关于面向对象的思考。类是用于实例化对象的模式。物体是物。他们的行为或名字是否更好地描述了类似的事物?
我是食肉动物吗?对。但我也写程序。我是程序员吗?对。但我也投票支持奥巴马。我是奥巴马的支持者吗?对。但是......最后,我是一个人。更准确地说,我是班级[1] HomoSapiensSapiens
的一个实例。 HomoSapiensSapiens
有很多很多很多方法,所有这些方法都有类似动词的名字。像HomoSapiensSapiens.EatBacon()
一样。像HomoSapiensSapiens.WriteGoodCode()
一样。像HomoSapiensSapiens.VoteDemocratic()
一样。 等
Martin最重要的一点是如果你的课程最好像动词一样命名,你就会认为你的课程都错了。
[1]“OO”中的“类”意义,而不是王国/门/类的生物意义。
答案 1 :(得分:9)
如评论中所述:处理器源自动词,而不是动词。因此,处理器是一个好的名字。
XmlProcessor并没有真正告诉你关于这个类的更多信息。好吧,它正在处理xml,但它做了什么?验证它?转发它?解析它?所以很可能在角落里有一个更好的名字
认真对待SOLID原则,你最终会得到类似的课程 XmlProcessor { public void process(){...} }
或
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)