【发布时间】:2021-12-14 12:13:48
【问题描述】:
我有一个带有创建方法的 AccountCreator 类,该方法采用 DTO 和创建帐户所需的数据。一开始尝试创建 2 个值对象(用户名和密码),然后验证用户名的唯一性,在构造函数中创建使用这 2 个值对象的 Account 实体并将其保存在 repo 中。当然,可能会返回密码长度错误等错误。我为此使用了 Eithers,现在的问题是这段代码是否可以,或者它可以以某种方式更好地编写?
public Either<Error, AccountDto> create(AccountCreateDto accountCreateDto) {
var errorType = ErrorType.ACCOUNT_PERSISTENCE_ERROR;
var errorMessage = "Not unique user name: " + accountCreateDto.userName;
var error = new Error(errorType, errorMessage);
return UserName
.create(accountCreateDto.userName)
.flatMap(userName ->
userNameUniquenessChecker.isUnique(userName.text) ?
Password
.create(accountCreateDto.password)
.flatMap(password -> {
var createdAccount = new Account(
userName,
password,
AccountStatus.OPEN,
LocalDateTime.now(),
new ArrayList<>()
);
var addedAccount = accountRepository.add(createdAccount);
var accountDto = new AccountDto(
addedAccount.userName.text,
addedAccount.password.text,
addedAccount.status,
addedAccount.creationDate,
(long) addedAccount.tasks.size()
);
return Either.right(accountDto);
}) : Either.left(error));
}
【问题讨论】:
标签: java functional-programming either vavr