2012-01-24
■[オブジェクト指向プログラミング][EffectiveJava]チェックされる例外を不必要に使用するのを避ける
アウトライン
チェックされる例外とは
- 【どういうこと?】
- プログラムの信頼性を向上させる、Javaオリジナルの例外機構。
- 【どうして?】
- リターンコードと異なり、プログラマに例外状態の処理を強制する。
- 【どうすれば?】
- APIで濫用しない。
- 使用側のプログラマの負荷が増え、APIが使いにくくなる。
- APIで濫用しない。
適しているケース
- 【どういうこと?】
- APIの適切な使用では例外状態を防ぐことができない、かつ、例外発生時、API使用者が有用な処理をほどこせる場合。
- 【どうして?】
- この両方を満たさない限り、プログラマへの負荷やプログラムを複雑にすることを正当化できない。
- 【どうすれば?】
- 補足した側が何ができるかどうかを検討する。
- 何もできないなら、チェックされる例外を使用しない。
- 【たとえば?】
- java.lang.CloneNotSupportedExceptionは悪例。
- チェックされる例外だが、捕捉しても何もできない。
- java.lang.CloneNotSupportedExceptionは悪例。
まとめ
- 議論は尽くされ、世の趨勢は、「チェックされる例外は使用しない」へ。
テストコード
package asakichy.第09章例外; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import asakichy.rule.OutLine; import asakichy.rule.WholeOutLine; public class 項目59チェックされる例外を不必要に使用するのを避ける { @Test public void チェックされる例外とは() throws Exception { o.l1("【どういうこと?】").e(); o.l2("プログラムの信頼性を向上させる、Javaオリジナルの例外機構。").e(); o.l1("【どうして?】").e(); o.l2("リターンコードと異なり、プログラマに例外状態の処理を強制する。").e(); o.l1("【どうすれば?】").e(); o.l2("APIで濫用しない。").e(); o.l3("使用側のプログラマの負荷が増え、APIが使いにくくなる。").e(); } @Test public void 適しているケース() throws Exception { o.l1("【どういうこと?】").e(); o.l2("APIの適切な使用では例外状態を防ぐことができない、"); o.__("かつ、例外発生時、API使用者が有用な処理をほどこせる場合。").e(); o.l1("【どうして?】").e(); o.l2("この両方を満たさない限り、"); o.__("プログラマへの負荷やプログラムを複雑にすることを正当化できない。").e(); o.l1("【どうすれば?】").e(); o.l2("補足した側が何ができるかどうかを検討する。").e(); o.l2("何もできないなら、チェックされる例外を使用しない。").e(); o.l1("【たとえば?】").e(); o.l2("java.lang.CloneNotSupportedExceptionは悪例。").e(); o.l3("チェックされる例外だが、捕捉しても何もできない。").e(); { /** 【補】チェックされる例外の手間 */ // チェックされる例外はcatchを強要する。 // try/catchを新たに書き起こすことは、 // プログラマに結構な(というより、大きな)面倒をかけることになる。 } } public void 適していないケース() throws Exception { o.l1("【どういうこと?】").e(); o.l2("try/catchを書く負荷をプログラマに課したくない場合。").e(); o.l2("try/catchの実行時の負荷を無視できない場合。").e(); o.l1("【どうすれば?】").e(); o.l2("チェックされない例外への変換を検討する。").e(); o.l1("【たとえば?】").e(); o.l2("Commandクラス。").e(); o.l2("「チェックされる例外」を、「チェックされない例外」+「状態検査関数」へ。").e(); Command command = new Command(); // 「チェックされる例外」 try { command.executeThrowException(); } catch (Exception e) { // 例外処理 // ..... assertThat(command.result(), is(false)); } // 「チェックされない例外」+「状態検査関数」 if (command.executePermitted()) { command.executeThrowRuntimeException(); } else { // 例外処理 // ..... assertThat(command.result(), is(false)); } } private static class Command { private boolean result = true; // チェックされる例外 public void executeThrowException() throws Exception { result = false; throw new Exception(); } // チェックされない例外 public void executeThrowRuntimeException() { result = false; throw new RuntimeException(); } // 実行可否を検査できる関数 public boolean executePermitted() { return false; } public boolean result() { return result; }; } @Test public void まとめ() throws Exception { o.l1("議論は尽くされ、世の趨勢は、「チェックされる例外は使用しない」へ。").e(); } @Rule public OutLine o = new OutLine(); @ClassRule public static WholeOutLine wo = new WholeOutLine(); }
トラックバック - http://d.hatena.ne.jp/asakichy/20120124/1327356665
リンク元
- 8 http://www.google.co.jp/url?sa=t&rct=j&q=リスコフの置換原則&source=web&cd=2&ved=0CCsQFjAB&url=http://d.hatena.ne.jp/asakichy/20090127/1233109959&ei=TDIeT8zvMK7umAWF06HHDg&usg=AFQjC
- 6 http://www.google.co.jp/url?sa=t&rct=j&q=プログラミング原則&source=web&cd=1&ved=0CCIQFjAA&url=http://d.hatena.ne.jp/asakichy/20100203/1265158263&ei=NeQdT_mjGYeHmQWLhu2dCg&usg=AFQjC
- 5 http://d.hatena.ne.jp/
- 5 http://www.google.co.jp/url?sa=t&rct=j&q=オブジェクト指向 相互参照&source=web&cd=6&ved=0CFoQFjAF&url=http://d.hatena.ne.jp/asakichy/20090203/1233620823
- 5 http://www.google.co.jp/url?sa=t&rct=j&q=オープンとクローズド&source=web&cd=1&ved=0CC8QFjAA&url=http://d.hatena.ne.jp/asakichy/20090126/1232979830&ei=e_EdT_bGGKfKmAWu58ikDg&
- 5 http://www.google.co.jp/url?sa=t&rct=j&q=eclipse+ショートカット+検索&source=web&cd=5&ved=0CD0QFjAE&url=http://d.hatena.ne.jp/asakichy/20100216/1266280192&ei=IhAeT6OrLtCciAf29tHWDQ&
- 4 http://www.google.co.jp/url?sa=t&rct=j&q=カプセル化 流動的要素&source=web&cd=1&ved=0CCEQFjAA&url=http://d.hatena.ne.jp/asakichy/20090430/1241056069&ei=TAQeT-ScEaKkiA
- 3 http://www.google.co.jp/url?sa=t&rct=j&q=俯瞰図 ドメイン アプリ&source=web&cd=1&ved=0CCAQFjAA&url=http://d.hatena.ne.jp/asakichy/20110527/1306447227&ei=EmYeT-OqCeX
- 3 http://www.google.co.jp/url?sa=t&rct=j&q=eclipse ショートカット 行頭&source=web&cd=4&ved=0CDcQFjAD&url=http://d.hatena.ne.jp/asakichy/20100215/1266191314&ei=G0EeT6jaO-TEmQXQ8e3
- 3 http://www.google.com/search


