选项类型变量和返回它们的方法的通用命名约定

Jef*_*eff 10 java scala optional guava java-8

有哪些流行的方法可以命名选项类型变量和返回选项类型的方法,以便将它们与非选项对应物区分开来?

假设DAO当前有一个findById返回实体实例或null的方法,如果我们弃用该方法并添加一个返回选项类型的方法,我们应该如何命名它?

现在假设我们正在重构代码以使用这个新方法,我们不希望用选项类型替换对实体变量的所有引用,我们应该如何命名选项类型变量?

interface Dao<ENTITY ,ID> {
   @Deprecated
   ENTITY findById(ID id);

   //What naming convention should we use?
   Optional<ENTITY> maybeFindById(ID id);
}

public class MyService {
    PersonDao personDao;

    public void changeAge(final Long id,final int age) {

    //final Person person = personDao.findById(id);
    //if(person !=null)

    //What naming convention should we use?
    final Optional<Person> maybePerson = personDao.maybeFindById(id);

   if (maybePerson.isPresent()){
       final Person person = maybePerson.get();
       person.setAge(age);
    }
}
Run Code Online (Sandbox Code Playgroud)

Hol*_*ger 6

我不认为这里有两种不同的方法是个好主意.如果对迁移有疑问,请保留旧迁移.

但是有一种方法可以通过两个步骤重构整个代码:

首先,从以下位置更改界面:

interface Dao<ENTITY ,ID> {
   ENTITY findById(ID id);
}
Run Code Online (Sandbox Code Playgroud)

至:

interface Dao<ENTITY ,ID> {
   default ENTITY findById(ID id) { return newFindById(id).orElse(null); }
   Optional<ENTITY> newFindById(ID id);
}
Run Code Online (Sandbox Code Playgroud)

我假设您的问题是,调整接口的实现不是问题.现在,告诉你的重构工具内嵌老,现在default,findById方法.

其次,将方法重命名newFindByIdfindById.

这样您就可以迁移interface到:

interface Dao<ENTITY ,ID> {
   Optional<ENTITY> findById(ID id);
}
Run Code Online (Sandbox Code Playgroud)

而所有呼叫站点都已从以下位置更改:

Person maybePerson = personDao.findById(id); // may be null
Run Code Online (Sandbox Code Playgroud)

至:

Person maybePerson = personDao.findById(id).orElse(null);
Run Code Online (Sandbox Code Playgroud)

这样,您可以interface在第一时间获得干净,而其他代码则可以像以前一样工作.然后,您可以逐个浏览呼叫站点,并决定是否以及如何更改它们.这可能需要一些时间,但由于interface已经很干净并且命名约定问题已经解决,因此没有必要赶时间.

请注意,您的示例方法应该看起来像:

public void changeAge(final Long id,final int age) {
    personDao.findById(id).ifPresent(person -> person.setAge(age));
}
Run Code Online (Sandbox Code Playgroud)

请注意,在两种形式中,重构的旧代码和新代码都不需要命名类型的变量Optional,因此不需要命名约定.

当然,重构需要支持Java 8的工具.


Col*_*inD 5

我认为这确实是一个基于意见的问题,因为确实不可能有任何权威或正确的答案。

也就是说,我的偏好是只命名Optional正常返回的方法,例如Optional<Foo> findById(Id id). 该方法实际上与返回表示“无结果”的方法没有什么不同,null只是返回类型使其更加明确。

至于Optional变量,我倾向于将它们命名为optionalFoo...但总的来说,我认为如何命名局部变量(甚至字段)比如何命名方法要重要得多。