Skip to content

オブジェクト指向エクササイズを実施する上で困った点

Haruaki Tamada edited this page Feb 16, 2018 · 4 revisions

例外処理

問題

例外処理を行う場合,以下のようなコードとなる.この場合,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 間の処理を渡す. argumentToFunctionExceptionThrowableFunction に渡す引数であり, returnValueIfExceptionThrows は,Function 処理中に例外が起こった時に返す値である.

すなわち,最初の例の場合,次のようなコードで置き換えられる.

return ExceptionHandler.perform(value, null, item -> someMethodCall(item));

if文での分岐で返り値を変更する.

問題

条件に合致した場合,とある値を返し,そうでない場合,別の処理を行うことはよくある. 典型的には,以下のような処理である. ただし,この場合も,オブジェクト指向エクササイズでの1メソッド3行以内というルールに違反する. if文の Curly brace({})を書かなければ良いのかもしれないが,一方で,省略せず書く方が良いという意見もある. ここでは,省略せずに実現できないかを考える.

if(somePredication()){
    return trueOperation();
}
return falseOperation();

対応策

対応策1 nullチェック.

if(value == null){
    return trueOperation(value);
}
return falseOperation();

の場合,Optional を利用し,以下のような処理に変更することで,オブジェクト指向エクササイズのルールに則ってプログラミングできる.

Optional<ClassNameOfValue> optional = Optional.ofNullable(value);
return optional.ifPresent(trueOperation(value))
        .orElse(falseOperation());

対応策1 空文字チェック

if(Objects.equals(string, "")){
    return someOperation(string);
}
return falseOperation();

上記のようなプログラムの場合,Optional は使えない.Optionalnull かそうでないかのみで判定するためである. 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());