SlideShare a Scribd company logo
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

JavaScript 勉強会 ― 変数・演算子・文
JavaScript 勉強会 ― 変数・演算子・文JavaScript 勉強会 ― 変数・演算子・文
JavaScript 勉強会 ― 変数・演算子・文
Appresso Engineering Team
 
JavaScript 勉強会 ― 型と値
JavaScript 勉強会 ― 型と値JavaScript 勉強会 ― 型と値
JavaScript 勉強会 ― 型と値
Appresso Engineering Team
 
Effective Java 輪読会 項目69-70追加
Effective Java 輪読会 項目69-70追加Effective Java 輪読会 項目69-70追加
Effective Java 輪読会 項目69-70追加
Appresso Engineering Team
 
Effective Java 輪読会 第6章 項目35-37
Effective Java 輪読会 第6章 項目35-37Effective Java 輪読会 第6章 項目35-37
Effective Java 輪読会 第6章 項目35-37Appresso Engineering Team
 
Effective java 輪読会 第6章 項目32-34
Effective java 輪読会 第6章 項目32-34Effective java 輪読会 第6章 項目32-34
Effective java 輪読会 第6章 項目32-34Appresso Engineering Team
 
Effective java 輪読会 第5章 項目26-29
Effective java 輪読会 第5章 項目26-29Effective java 輪読会 第5章 項目26-29
Effective java 輪読会 第5章 項目26-29Appresso Engineering Team
 
Effective java 輪読会 第5章 項目23-25
Effective java 輪読会 第5章 項目23-25Effective java 輪読会 第5章 項目23-25
Effective java 輪読会 第5章 項目23-25Appresso Engineering Team
 
Effective java 輪読会 第4章 項目18-22
Effective java 輪読会 第4章 項目18-22Effective java 輪読会 第4章 項目18-22
Effective java 輪読会 第4章 項目18-22Appresso Engineering Team
 
Effective Java 輪読会 第4章 項目13-17
Effective Java 輪読会 第4章 項目13-17Effective Java 輪読会 第4章 項目13-17
Effective Java 輪読会 第4章 項目13-17Appresso Engineering Team
 
Effective java 輪読会 第3章 項目11, 12
Effective java 輪読会 第3章 項目11, 12Effective java 輪読会 第3章 項目11, 12
Effective java 輪読会 第3章 項目11, 12
Appresso Engineering Team
 
Effective java 輪読会 第3章 項目8,9,10
Effective java 輪読会 第3章 項目8,9,10Effective java 輪読会 第3章 項目8,9,10
Effective java 輪読会 第3章 項目8,9,10
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

遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
t m
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
chiefujita1
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
Toru Tamaki
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
harmonylab
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
0207sukipio
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
Matsushita Laboratory
 
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
Takayuki Nakayama
 

Recently uploaded (8)

遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
 
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
 

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