0

所以我现在正在编写一个程序,并且对我应该如何编程感到矛盾。我有两个选择:

public class Translator {

private Translator(){}; //prevents instantation
/****
  ***Stuff
  ***/

public static String translate(String oldLanguage, String newLanguage, String text){
         //METHOD Code
}

}

或者

public class Translator {

private String oldLanguage;
private String newLanguage;

public Translator(String oldLanguage, String newLanguage){
            this.oldLanguage = oldLanguage;
            this.newLanguage = newLanguage;
}; 
/****
  ***Stuff
  ***/

public String translate(String text){
         //METHOD Code
}

}

我应该使用哪个,为什么?这将是我程序的 API 端。

另外,作为程序员,您在处理 API 时觉得哪个更方便,为什么?

4

5 回答 5

1

这是一个非常有趣的问题,没有一个最佳答案。我想到的选择标准主要是:

  • 您是否打算实例化一个翻译器并使用相同的新旧语言多次重复使用它?
  • 您的翻译器是否需要在内存中保留一些状态才能进行翻译,而不必在每次需要翻译时都重新加载该状态?
  • 您的翻译人员是否有其他方法同时使用新旧语言?
  • 应用程序中是否存在必须调用翻译器的地方,甚至不关心/不知道新旧语言是什么,将预先配置的翻译器作为参数?
  • 您是否需要能够模拟翻译器并将其注入代码的各种其他组件中以对它们进行单元测试?

如果这些问题的答案是肯定的,那么应该使用有状态的翻译器(即您的第二个选项)。如果答案是否定的,那么您可以选择第一个选项。

于 2013-11-10T17:42:21.227 回答
1

我更喜欢使用无状态版本的翻译器,但我更喜欢有状态的翻译版本。原因是,如果您摆脱了状态,那么您通常可以摆脱一整类同步错误,同时将一些重要信息移到更接近实际使用的位置。例如,想象一下,如果两个语言变量是 1000 行类的一部分。您想在每次使用时查看它们的设置方式吗?

我喜欢已翻译状态的原因是,一般翻译器可以在不知道它将用于什么语言的情况下存在,如果你失去了翻译中使用的语言,你就不知道该怎么处理它了(类似于在数学问题中丢失单位)。

对于有状态选项,我更喜欢的版本是,而不是:

   ...
   private String oldLanguage;
   private String newLanguage;

采用:

   ...
   private final String oldLanguage;
   private final String newLanguage;

...而不是类似的东西:

   myTranslator.setLanguages("spanish", "english")
   Translated myTranslated = myTranslator.translate(original)

您可以使用:

   Translator spanishEnglish = new Translator("spanish", "english")
   Translated myTranslated = spanishEnglish.translate(original)
于 2013-11-10T19:57:38.300 回答
0

根据面向对象的编程标准,类是实体的表示。因此,只有当这些是由类表示的实体的属性时,您才应该将某些东西定义为类的属性。话虽如此,仅当 Translator 实体具有这些属性时,才将oldLanguage和添加newLanguage到您的类中。Translator

于 2013-11-10T17:36:12.440 回答
0

我更喜欢使用第一个

public class Translator {

    private Translator(){}; //prevents instantation
        /****
        ***Stuff
        ***/

    public static String translate(String oldLanguage, String newLanguage, String text){
             //METHOD Code
    }

}

为什么 ?答案为什么我应该实例化一个对象来翻译一些东西,如果我可以直接做的话。

Translator.translate(S,S,S);
于 2013-11-10T17:44:18.973 回答
0

当一个类的方法不访问该类的任何非静态成员或方法时,它可以(应该?)是静态的。

现在这将我们引向一个问题,一个类的成员(字段)何时应该是静态的:

如果一个类的成员(字段)与定义该类的实例(= 对象)的状态相关,则它必须是非静态的。

所以总而言之,如果某事与对象的状态相关,则将其设为实例数据,如果不相关(仅与计算相关),则将其作为参数传递给方法。

除此之外,现在很清楚,如果您希望表示一个状态,那么创建一个类的实例才有意义。如果存在零个非静态成员,那么您不需要能够创建类的实例。

于 2013-11-10T17:48:30.243 回答