您多久会看到这样的代码,特别是在使用依赖注入,单一职责原则和其他“良好实践”时?
class FriendsTimelineReader(userFinder: UserFinder,
userStatusReader: UserStatusReader,
statusSecurityFilter: StatusSecurityFilter) {
...
}
请注意,参数名称是类名称的精确副本 。 那当然不是干的 !
在Java中,编写此类代码比在Scala中要容易一些,因为您首先编写类型,然后可以自动完成变量名(IDE中存在自动完成的事实表明这是一种常见的模式)。 在Scala中,有更多的类型输入,但是围绕声明字段/定义构造函数/分配给字段的样板更少。
如何避免呢? 我们总是可以使用晦涩的变量名,如“ ssf
”,而不是“的statusSecurityFilter
“。 但是,拥有一个很好命名的类以使代码可读的整个工作(这是一项艰巨的任务)变得浪费了。
当然,变量名非常有用,例如,当我们必须区分我们的方法采用的10个String
参数,创建一个Int
计数器等时。但是,我们使用专用包装类型的次数越来越多(现在可能更多,使用Scala 2.10引入了值类 ),以使我们的代码更加类型安全,我们的服务越细腻–变量/参数名称越经常反映类名称。
即使有几个类的实例,参数名称也经常包含一些限定符 +类名称(例如给定的Person
类, personAssociator.createFriends( firstPerson , secondPerson )
)。 有趣的是,可以看到一些有关变量名多长时间是类名或后缀的镜像的统计信息-我怀疑它可能占很大的百分比。
也许下一步安全性是在命名参数时限制完全自由吗? 甚至在某些情况下甚至完全不需要参数名称。
例如。 从一开始的片段中,我们只想获取UserFinder
“实例”。 在系统中,最有可能只有该类的一个实例,并且肯定会一次被其他类使用。 那么,为什么不让类表达它想要一个类的实例而不必命名呢? 让我们使用不定冠词 “ a”作为关键字(我们实际上并不关心传递哪个实例):
class FriendsTimelineReader(a UserFinder,
a UserStatusReader,
a StatusSecurityFilter)
现在,您将如何在类中使用此类变量? 让我们使用定冠词“ the”-赋予该类的实例,例如:
val user10 = (the UserFinder).findById(10)
也许这看起来有点像科幻小说,但是不方便吗? 也许这个问题已经通过其他语言的某些机制解决了?
亚当
编辑27/01/2013 :将以上内容扩展为处理预选赛:
class Friends(a 'first Person, a 'second Person) {
...
(the 'first Person).getName()
...
}
参考: Adam Warski博客的Blog中来自我们的JCG合作伙伴 Adam Warski的干燥参数名称 。
翻译自: https://www.javacodegeeks.com/2013/01/dry-parameter-names.html