考虑到下面的代码,我很想知道您是否对类型有更好的命名建议:
VegetablePresentersFactoryVegetablePresenterFactory让我有点困扰的是,他们的名字只有一个字符(“S”),而且这个角色位于名字的中间。
class VegetablesApp {
private final VegetablePresentersFactory vegetablePresentersFactory; // gets injected
public void displayVegetablePresenters(AllVegetables all) {
List<VegetablePresenter> presenters = vegatablePresentersFactory.create(all);
displayPresenters(presenters);
}
}
class VegetablePresentersFactory {
private final VegetablePresenterFactory vegetablePresenterFactory;
public List<VegetablePresenter> create(AllVegetables all) {
List<VegetablePresenter> presenters = new ArrayList<>();
list.add(vegetablePresenterFactory.create(all.getTomato()));
list.add(vegetablePresenterFactory.create(all.getLettuce()));
list.add(vegetablePresenterFactory.create(all.getBacon()));
return presenters;
}
}
interface VegetablePresenterFactory {
VegetablePresenter create(Vegetable vegetable);
}发布于 2014-11-07 21:36:39
把复数的"s“改为”列表“如何:
interface VegetablePresenterListFactory {
List<VegetablePresenter> create(AllVegetables allVegetables);
}正如您所说,中间的s确实是一个问题。差别太小:它可能导致错误,并损害可读性。
这个代码片段中的name和names也是如此:
printNames(List名称){ for (字符串名称:名称){ // .}}
虽然错误听起来不太可能,因为name和names是完全不同的类型,但是当有相同名称的方法在这两个对象(例如isEmpty )上工作时,仍然会发生错误。
在这种情况下,我使用后缀List来消除歧义,所以nameList。的确,“列表”这个词有点多余。但与其说是模棱两可,倒不如说是冗余,所以通过改进的可读性来证明少量的冗余是合理的。
您在注释中提到,如果将来更改接口以使用集合而不是列表," List“就有点不幸了。我觉得这是没有意义的。更改界面是一件大事,必须小心进行。如果您更改方法以返回一个集合而不是一个列表,我认为您应该注意到接口名称也应该更改。在迁移API用户方面,这不应该是一个很大的额外负担。
尽管如此,我确实有一个替代方案,使用“项目”一词而不是“列表”:
interface VegetablePresenterItemsFactory {
List<VegetablePresenter> create(AllVegetables allVegetables);
}“物品”的好处是它不那么技术性。它是足够模糊的灵活,但不是太模糊,没有意义。也许还有更好的同义词,你明白了。
发布于 2015-01-24 19:48:42
“计算中最困难的两件事是缓存失效、命名事物和错误对错。”
正确命名事物有一种特殊的艺术,但就像任何一种艺术一样,欣赏是主观的。在这种情况下,我非常希望VegetablePresenterFactory能够匹配这样一个事实,即它是一个用于生成VegetablePresenter对象的工厂。它一次为您提供一个多个列表的事实并不重要,不足以成为类的名称;一个工厂可能有多个工厂方法,无论它们生成一个还是多个VegetablePresenters。
可能会有理由不将列表行为嵌入到工厂中。它可能使您当前的用例更简单,但是在将来,如果您希望一次只生成一个对象,那么工厂将很难使用。在调用工厂创建多个对象时,使用一个简单的循环仍然会产生相当干净、简洁和易于理解的代码。它还避免了与您是否应该接受和/或返回一个列表、集合或仅仅一个集合相关的问题。
void printNames(List<String> names) {
for (String name : names) {
// ...
}
}在这里,我不同意@janos使用非常相似的变量名。当然,它们非常相似,但是只有List<String> names作为方法签名的一部分在函数之外可见,这是非常有效和描述性的。String name在for..each循环中是非常本地的,它使用的地方很小,混淆的机会也很小。在这样的集合上使用集合的复数和for..each循环范围内的单数可以提供非常自然的语言,并使代码易于阅读。
https://codereview.stackexchange.com/questions/69189
复制相似问题