Effective java 3版 読書会 12日目

実施日時:2019/3/28 22:00~23:00
対象範囲:項目50~項目54
参加者:yodai、yoridori、kassyi
形式:オンライン(discord)
   課題本を事前に読み、実業務と照らし合わせて記述内容の
   議論をする。

項目50 必要な場合、防御的にコピーする
実務では、参照渡しでコピーして内部を変更される状態を防ぐ処理はする。
引数で取ってきて、新しくnewする様な経験は無い。
フレームワークを作る場合は、やることも有る。
valueオブジェクトの場合は仕方ないけど実施する。
関数の直前でmapを作成して引数で渡し、mapにデータを詰める実装をした例が有った。
参照を引数で渡してやり取りするのは、見辛いしバグの元になりかねない。
DateよりCalenderに慣れるとDateは使い辛い
DateTimeAPIは、段階を追って組み立てる考えでは、使いやすい
また、月の始まりが1なのも使いやすい
防御的コピーについては、引数のチェックをコピー後の値に対して行う。
そうでないと、TOCTOU攻撃にさらされる可能性がある。
(検査されてコピーされる間の時間に攻撃される)
防御的コピーでパフォーマンス上の影響が有る場合は、外部から変更しない様にドキュメントで明示する。

項目51 メソッドのシグネチャを注意深く設計する
便利なメソッドは有っても良いが、あり過ぎても良くない
必要なメソッドを検討して作成する。
メソッドの引数は4個以下にするべきで、それ以上だとメソッドの分割など、設計を見直すべき。
また、設計のクラスを作って、ビルダーパターン(項目2)でメソッドを実行する。
パラメータの型はインターフェースを使用する。

項目52 オーバーロードを注意して使う
実務でオーバーロードを使う事は殆ど無い。
JavaのAPIではオーバーロードが使われている。
注意して使うというより、使わない方が良い。
オーバーロードを使うより、分かり易いメソッド名を
付けた方が分かり易い

項目53 可変長引数を注意して使う
引数の数で処理を変えられる。
この場合のオーバーロードは良い。
可変長引数で処理する時は、まず1つ目の引数を別に取得して処理をする。

項目54 nullではなく、空コレクションか空配列を返す
return値でnullを返すとnullチェックする必要が有るので、空のリストや長さ0の配列を返す様にする。
最適化で取得個数が0の場合にEmptyを返す様にしているが普通はやらない

協力:Tech Baton
https://tech-baton.studio.design/

この記事が気に入ったらサポートをしてみませんか?