首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >蔬菜工厂命名

蔬菜工厂命名
EN

Code Review用户
提问于 2014-11-07 19:35:48
回答 2查看 151关注 0票数 5

考虑到下面的代码,我很想知道您是否对类型有更好的命名建议:

  • VegetablePresentersFactory
  • VegetablePresenterFactory

让我有点困扰的是,他们的名字只有一个字符(“S”),而且这个角色位于名字的中间。

代码语言:javascript
复制
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);
}
EN

回答 2

Code Review用户

发布于 2014-11-07 21:36:39

把复数的"s“改为”列表“如何:

代码语言:javascript
复制
interface VegetablePresenterListFactory {    
    List<VegetablePresenter> create(AllVegetables allVegetables);
}

正如您所说,中间的s确实是一个问题。差别太小:它可能导致错误,并损害可读性。

这个代码片段中的namenames也是如此:

printNames(List名称){ for (字符串名称:名称){ // .}}

虽然错误听起来不太可能,因为namenames是完全不同的类型,但是当有相同名称的方法在这两个对象(例如isEmpty )上工作时,仍然会发生错误。

在这种情况下,我使用后缀List来消除歧义,所以nameList。的确,“列表”这个词有点多余。但与其说是模棱两可,倒不如说是冗余,所以通过改进的可读性来证明少量的冗余是合理的。

更新

您在注释中提到,如果将来更改接口以使用集合而不是列表," List“就有点不幸了。我觉得这是没有意义的。更改界面是一件大事,必须小心进行。如果您更改方法以返回一个集合而不是一个列表,我认为您应该注意到接口名称也应该更改。在迁移API用户方面,这不应该是一个很大的额外负担。

尽管如此,我确实有一个替代方案,使用“项目”一词而不是“列表”:

代码语言:javascript
复制
interface VegetablePresenterItemsFactory {    
    List<VegetablePresenter> create(AllVegetables allVegetables);
}

“物品”的好处是它不那么技术性。它是足够模糊的灵活,但不是太模糊,没有意义。也许还有更好的同义词,你明白了。

票数 3
EN

Code Review用户

发布于 2015-01-24 19:48:42

“计算中最困难的两件事是缓存失效、命名事物和错误对错。”

正确命名事物有一种特殊的艺术,但就像任何一种艺术一样,欣赏是主观的。在这种情况下,我非常希望VegetablePresenterFactory能够匹配这样一个事实,即它是一个用于生成VegetablePresenter对象的工厂。它一次为您提供一个多个列表的事实并不重要,不足以成为类的名称;一个工厂可能有多个工厂方法,无论它们生成一个还是多个VegetablePresenters。

可能会有理由不将列表行为嵌入到工厂中。它可能使您当前的用例更简单,但是在将来,如果您希望一次只生成一个对象,那么工厂将很难使用。在调用工厂创建多个对象时,使用一个简单的循环仍然会产生相当干净、简洁和易于理解的代码。它还避免了与您是否应该接受和/或返回一个列表、集合或仅仅一个集合相关的问题。

代码语言:javascript
复制
void printNames(List<String> names) {
    for (String name : names) {
        // ...
    }
}

在这里,我不同意@janos使用非常相似的变量名。当然,它们非常相似,但是只有List<String> names作为方法签名的一部分在函数之外可见,这是非常有效和描述性的。String namefor..each循环中是非常本地的,它使用的地方很小,混淆的机会也很小。在这样的集合上使用集合的复数和for..each循环范围内的单数可以提供非常自然的语言,并使代码易于阅读。

票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/69189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档