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)
我不认为这里有两种不同的方法是个好主意.如果对迁移有疑问,请保留旧迁移.
但是有一种方法可以通过两个步骤重构整个代码:
首先,从以下位置更改界面:
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
方法.
其次,将方法重命名newFindById
为findById
.
这样您就可以迁移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的工具.
我认为这确实是一个基于意见的问题,因为确实不可能有任何权威或正确的答案。
也就是说,我的偏好是只命名Optional
正常返回的方法,例如Optional<Foo> findById(Id id)
. 该方法实际上与返回表示“无结果”的方法没有什么不同,null
只是返回类型使其更加明确。
至于Optional
变量,我倾向于将它们命名为optionalFoo
...但总的来说,我认为如何命名局部变量(甚至字段)比如何命名方法要重要得多。
归档时间: |
|
查看次数: |
6928 次 |
最近记录: |