-
Notifications
You must be signed in to change notification settings - Fork 4
オブジェクト指向エクササイズを実施する上で困った点
例外処理を行う場合,以下のようなコードとなる.この場合,5行であり,オブジェクト指向エクササイズでの 1メソッド3行以内というルールに違反する.
try{
return someMethodCall(value);
} catch(SomeException e){
}
return null;
ただ,例外が起こった場合,例外によって何かすることは少ないと考えた.
すなわち,上記の例であれば,SomeException
を受けた時に何らかの処理を行い,その結果,さらに処理を行うことは少ない.
特に,IOException
の場合,成功したか,失敗したかを示すのみで良いというか,成功した場合のみ処理を進めるようにした.
ExceptionHandler
というクラスを用意した.
ExceptionHandler.perform(T argumentToFunction, R returnValueIfExceptionThrows, ExceptionThrowableFunction<T, R, E> function);
ExceptionThrowableFunction
が例外を投げられる Function
インターフェースであり,ここに try-catch
間の処理を渡す.
argumentToFunction
が ExceptionThrowableFunction
に渡す引数であり,
returnValueIfExceptionThrows
は,Function
処理中に例外が起こった時に返す値である.
すなわち,最初の例の場合,次のようなコードで置き換えられる.
return ExceptionHandler.perform(value, null, item -> someMethodCall(item));
条件に合致した場合,とある値を返し,そうでない場合,別の処理を行うことはよくある.
典型的には,以下のような処理である.
ただし,この場合も,オブジェクト指向エクササイズでの1メソッド3行以内というルールに違反する.
if文の Curly brace({
と }
)を書かなければ良いのかもしれないが,一方で,省略せず書く方が良いという意見もある.
ここでは,省略せずに実現できないかを考える.
if(somePredication()){
return trueOperation();
}
return falseOperation();
if(value == null){
return trueOperation(value);
}
return falseOperation();
の場合,Optional
を利用し,以下のような処理に変更することで,オブジェクト指向エクササイズのルールに則ってプログラミングできる.
Optional<ClassNameOfValue> optional = Optional.ofNullable(value);
return optional.ifPresent(trueOperation(value))
.orElse(falseOperation());
if(Objects.equals(string, "")){
return someOperation(string);
}
return falseOperation();
上記のようなプログラムの場合,Optional
は使えない.Optional
は null
かそうでないかのみで判定するためである.
Optional<T> StringUtils.ifNotEmpty(String string, Function<String, T> function)
というメソッドを用意した.
string
が空文字でなければ,function
を実施するものである.
これを利用すると,上記の空文字チェックが以下のようなコードに置き換えられる.
Optional<T> optional = StringUtils.ifNotEmpty(string,
(stringValue) -> someOperation(stringValue));
return optional.orElse(falseOperation());