SlideShare a Scribd company logo
1 of 27
Effective Java 輪読会 第6回
(項目38~40)
2014/2/12
開発部 野口
項目38 パラメータの正当性を検査する
パラメータの正当性を検査する
 エラーが発生したらできるだけ速やかにエ
ラーを検出すべき
 メソッドはパラメータへの制約をメソッド本体の
初めに検査すべき
パラメータの正当性を
検査しない場合
 処理の途中で訳の分からない性外で失敗する
 メソッドは正常にリターンするが、何も言わ
ずに誤った結果を計算する
 メソッドは正常にリターンするが、いくつか
のオブジェクトを不正な状態のままにする
 後になって、コードの全く関係のない箇所でエ
ラーを引き起こす
 最悪!
例外を文書化する
 public のメソッドに対しては、パラメータ値
に関する制約が守られていない場合にスロー
される例外を文書化する
 Javadoc の @throws タグを使用
 IllegalArgumentException、
IndexOutOfBoundsException、
NullPointerException 等
 文書化さえできれば、コードを書くのは簡単
アサーションを用いる
 公開されていないメソッドに関しては、ア
サーションを用いてパラメータを検査する
 DataSpider では、独自のアサーション用ユー
ティリティクラス
com.appresso.ds.common.fw.Assert を用いてい
る
規則に対する例外
 正当性検査のコストが高いか現実的でない
 かつ、正当性検査が計算の処理の中で暗黙に
行われる
 例)Collections.sort(List)
 ただし、エラーアトミック性(項目64)に注意が
必要
 失敗したメソッド呼び出しは、オブジェクトをそのメ
ソッド呼び出しの前の状態にしておくべき
注意:制約はよいものではない
 制約がなくなるくらい、メソッドを一般的に
設計すべき
 実際には、制約がやむをえない場合が多いの
で、その際は文書化し、チェックする
まとめ
 メソッドあるいはコンストラクタを書く際に
は、パラメータの制約を考える
 制約を文書化する
 メソッド本体のはじめで明示的に検査し、制
約を強制する
項目39
必要な場合には、防御的にコピーする
Java は安全な言語
 バッファオーバーランを始めとするメモリ破
壊エラーに対して、免疫がある
 (疑問:「免疫がある」ということは、
completely free というわけではない?)
それでも守る努力は必要
 クラスのクライアントは、クラスの不変式を
破壊するために徹底した努力をする
 と想定して防御的にプログラムすべき
 セキュリティを破ろうとする悪意のプログラ
マ
 よりも、むしろ使用者の単純なミスが問題
セキュリティホールの例
 pp.178 Period クラス
 コンストラクタで渡した Date を、渡したあとも
変更できる(pp.179)
 start / end メソッドの戻り値を変更することで、
Period の内部を変更できる(pp.180)
セキュリティホールへの対処
 コンストラクタで、防御的コピー(pp.179)
 TOCTOU 攻撃に備えるため、コピーに対して正
当性を検査する
 サブクラス化に対処するため、clone メソッドを
使用しない
 アクセッサ-でも、防御的コピー(pp.180)
本当の教訓
 可能な場所では、オブジェクトの構成要素と
して不変オブジェクトを使用する
 例)Date ではなく、Date.getTime() の戻り値
(long)を用いる
トレードオフ
 パフォーマンス上のペナルティはありうる
 クラスとその呼び出し元が同じパッケージの一部
であるような場合には、防御的コピーを行わず、
かわりにドキュメンテーションで済ませるといっ
た手もある
制御の移転
 パッケージ境界を越えるとしても、あえて防
御的にコピーしないケース
 ドキュメンテーションに制御の移転が必要で
あることを示し、クライアントはそれに従う
 例)ラッパークラス
 ラッパークラスでは、一般に制御を移転したあとにオ
ブジェクトを変更した場合に、クライアント自身にの
み害を及ぼす
まとめ
 クラスがそのクライアントから得たり、クラ
イアントへ返したりする可変の要素を持って
いるならば、防御的にコピーする
 コピーのコストが非常に高く、クライアント
が要素を不適切に変更しないことを信頼でき
るなら、その旨をドキュメンテーションに示
す
項目40
メソッドのシグニチャを注意深く設計す
る
メソッド名を注意深く選ぶ
 理解可能
 同じパッケージ内の他の名前と矛盾がない
 広範囲のコンセンサスと矛盾がない
 Java ライブラリーの API がガイダンスになる
 まあ、ところどころ矛盾もあるけど……。
 大きさとか、歴史的な経緯とか
便利なメソッドを提供し過ぎたり
しないようにする
 個々のメソッドは、「自分の役割を果たす」
こと
 型がサポートしている個々の処理について完
全に機能すること
 速記法は本当に頻繁に使用され、明らかに役
に立つ場合だけ
 特にインタフェースには注意
 多くのメソッドを持つインタフェースはユーザお
よび実装者の人生を複雑にする
 人生、シンプルな方が(精神衛生上)よい
長いパラメータのリストは避ける
 4 個以下を目標に
 マジックナンバー 7±2 という説もありますね
 同じ型のパラメータが何個も続くのは特に有
害
 順序を間違えてもコンパイルエラーにならない
パラメータリスト短縮法その1
 メソッドを複数のメソッドに分割する
 直交性を増加させ、メソッド数を減らすこともで
きる
 例)java.util.List の subList メソッドと、indexOf
/ lastIndexOf メソッド
パラメータリスト短縮法その2
 ヘルパークラス
 static のメンバークラス
 例)カードゲームを表すクラスにおいて、ランク
とスートを常に同時に扱っているなら、「カー
ド」ヘルパークラスを導入する
パラメータリスト短縮法その3
 ビルダーパターンの応用
 saucepan.water(400).sugar(5).salt(10).cube(Cub
e.Chicken, 2).cook()
パラメータ型に関しては、
クラスよりインタフェースを選ぶ
 たとえば、HashMap ではなく Map を使う
 たまたま HashMap 以外の Map を持っているク
ライアントを煩わせずにすむ
 参照)項目 52 インタフェースでオブジェクトを
参照する
 『実装パターン』(Kent Beck)にも同様の議論があ
りました
boolean パラメータより 2 つの要
素を持つ enum 型を使用する
 読みやすくなる
 IDE のコード補完を活用できる
 オプションを追加しやすい
 メソッドへのリファクタリングも可能

More Related Content

More from Appresso Engineering Team

Effective Java 輪読会 第6章 項目35-37
Effective Java 輪読会 第6章 項目35-37Effective Java 輪読会 第6章 項目35-37
Effective Java 輪読会 第6章 項目35-37
Appresso Engineering Team
 
Effective java 輪読会 第6章 項目32-34
Effective java 輪読会 第6章 項目32-34Effective java 輪読会 第6章 項目32-34
Effective java 輪読会 第6章 項目32-34
Appresso Engineering Team
 
Effective java 輪読会 第5章 項目26-29
Effective java 輪読会 第5章 項目26-29Effective java 輪読会 第5章 項目26-29
Effective java 輪読会 第5章 項目26-29
Appresso Engineering Team
 
Effective java 輪読会 第5章 項目23-25
Effective java 輪読会 第5章 項目23-25Effective java 輪読会 第5章 項目23-25
Effective java 輪読会 第5章 項目23-25
Appresso Engineering Team
 
Effective java 輪読会 第4章 項目18-22
Effective java 輪読会 第4章 項目18-22Effective java 輪読会 第4章 項目18-22
Effective java 輪読会 第4章 項目18-22
Appresso Engineering Team
 
Effective Java 輪読会 第4章 項目13-17
Effective Java 輪読会 第4章 項目13-17Effective Java 輪読会 第4章 項目13-17
Effective Java 輪読会 第4章 項目13-17
Appresso Engineering Team
 

More from Appresso Engineering Team (20)

JavaScript 勉強会 ― 変数・演算子・文
JavaScript 勉強会 ― 変数・演算子・文JavaScript 勉強会 ― 変数・演算子・文
JavaScript 勉強会 ― 変数・演算子・文
 
JavaScript 勉強会 ― 型と値
JavaScript 勉強会 ― 型と値JavaScript 勉強会 ― 型と値
JavaScript 勉強会 ― 型と値
 
Effective Java 輪読会 項目69-70追加
Effective Java 輪読会 項目69-70追加Effective Java 輪読会 項目69-70追加
Effective Java 輪読会 項目69-70追加
 
Effective Java 輪読会 項目69-70
Effective Java 輪読会 項目69-70Effective Java 輪読会 項目69-70
Effective Java 輪読会 項目69-70
 
Effective Java 輪読会 項目66-68
Effective Java 輪読会 項目66-68Effective Java 輪読会 項目66-68
Effective Java 輪読会 項目66-68
 
Effective Java 輪読会 項目71-73
Effective Java 輪読会 項目71-73Effective Java 輪読会 項目71-73
Effective Java 輪読会 項目71-73
 
Java Day Tokyo 2014 まとめ (chen)
Java Day Tokyo 2014 まとめ (chen)Java Day Tokyo 2014 まとめ (chen)
Java Day Tokyo 2014 まとめ (chen)
 
Effective Java 輪読会 項目63-65
Effective Java 輪読会 項目63-65Effective Java 輪読会 項目63-65
Effective Java 輪読会 項目63-65
 
Effective Java 輪読会 項目60-62
Effective Java 輪読会 項目60-62Effective Java 輪読会 項目60-62
Effective Java 輪読会 項目60-62
 
Effective java 輪読会 項目57-59
Effective java 輪読会 項目57-59Effective java 輪読会 項目57-59
Effective java 輪読会 項目57-59
 
Effective Java 輪読会 項目49-52
Effective Java 輪読会 項目49-52Effective Java 輪読会 項目49-52
Effective Java 輪読会 項目49-52
 
Effective Java 輪読会 項目45-48
Effective Java 輪読会 項目45-48Effective Java 輪読会 項目45-48
Effective Java 輪読会 項目45-48
 
Effective Java 輪読会 第6章 項目35-37
Effective Java 輪読会 第6章 項目35-37Effective Java 輪読会 第6章 項目35-37
Effective Java 輪読会 第6章 項目35-37
 
Effective java 輪読会 第6章 項目32-34
Effective java 輪読会 第6章 項目32-34Effective java 輪読会 第6章 項目32-34
Effective java 輪読会 第6章 項目32-34
 
Effective java 輪読会 第5章 項目26-29
Effective java 輪読会 第5章 項目26-29Effective java 輪読会 第5章 項目26-29
Effective java 輪読会 第5章 項目26-29
 
Effective java 輪読会 第5章 項目23-25
Effective java 輪読会 第5章 項目23-25Effective java 輪読会 第5章 項目23-25
Effective java 輪読会 第5章 項目23-25
 
Effective java 輪読会 第4章 項目18-22
Effective java 輪読会 第4章 項目18-22Effective java 輪読会 第4章 項目18-22
Effective java 輪読会 第4章 項目18-22
 
Effective Java 輪読会 第4章 項目13-17
Effective Java 輪読会 第4章 項目13-17Effective Java 輪読会 第4章 項目13-17
Effective Java 輪読会 第4章 項目13-17
 
Effective java 輪読会 第3章 項目11, 12
Effective java 輪読会 第3章 項目11, 12Effective java 輪読会 第3章 項目11, 12
Effective java 輪読会 第3章 項目11, 12
 
Effective java 輪読会 第3章 項目8,9,10
Effective java 輪読会 第3章 項目8,9,10Effective java 輪読会 第3章 項目8,9,10
Effective java 輪読会 第3章 項目8,9,10
 

Recently uploaded

研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
atsushi061452
 

Recently uploaded (16)

MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その1) 2024/05/17の勉強会で発表されたものです。
 
情報を表現するときのポイント
情報を表現するときのポイント情報を表現するときのポイント
情報を表現するときのポイント
 
20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf20240523_IoTLT_vol111_kitazaki_v1___.pdf
20240523_IoTLT_vol111_kitazaki_v1___.pdf
 
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
ロボットマニピュレーションの作業・動作計画 / rosjp_planning_for_robotic_manipulation_20240521
 
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
5/22 第23回 Customer系エンジニア座談会のスライド 公開用 西口瑛一
 
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイルLoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
LoRaWAN無位置ロープ型水漏れセンサー WL03A-LB/LSカタログ ファイル
 
Keywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltdKeywordmap overview material/CINC.co.ltd
Keywordmap overview material/CINC.co.ltd
 
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
論文紹介:ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation
 
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
研究紹介スライド: オフライン強化学習に基づくロボティックスワームの制御器の設計
 
Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )Intranet Development v1.0 (TSG LIVE! 12 LT )
Intranet Development v1.0 (TSG LIVE! 12 LT )
 
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdfネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
ネットワーク可視化 振る舞い検知(NDR)ご紹介_キンドリル202405.pdf
 
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
Hyperledger Fabricコミュニティ活動体験& Hyperledger Fabric最新状況ご紹介
 
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
2024年5月17日 先駆的科学計算フォーラム2024 機械学習を用いた新たなゲーム体験の創出の応用
 
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
クラウド時代におけるSREとUPWARDの取組ーUPWARD株式会社 CTO門畑
 
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
部内勉強会(IT用語ざっくり学習) 実施日:2024年5月17日(金) 対象者:営業部社員
 
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
Amazon Cognitoで実装するパスキー (Security-JAWS【第33回】 勉強会)
 

Effective Java 輪読会 第7章 項目38-40