DevLOVE仙台 オブジェクト設計とリーン開発、その実践

2013/11/30 (土) に開催した、DevLOVE仙台 オブジェクト設計とリーン開発、その実践 のまとめです。 http://devlove-sendai.doorkeeper.jp/events/6549
4
YAMAMOTO Masaki @nnasaki

メソッドで使う変数に注目する。可能な限りメソッドのローカル変数にする。変数の宣言は使用する直前に行う。引数が多くなってきたら、引数のクラスを作る。 #DevLove #DevSen

2013-11-30 14:05:36
YAMAMOTO Masaki @nnasaki

データ初期化は必ずコンストラクタで行う。とりあえずデフォルトコンストラクタで作成して、後から値をセットするというのはNG。変更に弱くなる。Immutable ってことかな? #DevLove #DevSen

2013-11-30 14:08:59
小泉勝志郎 @koi_zoom1

#devlove #DevSen 増田さん:変更に関するデータとコードを集めるための入れ物としてのクラスを宣言。クラスを作る。データ初期化をコンストラクタで宣言。初期化パターンごとにコンストラクタを作る。そして、メソッドをこのクラスに移動する

2013-11-30 14:11:45
YAMAMOTO Masaki @nnasaki

クラスにすると冗長になる。杓子定規に何でもクラスにする必要は無く、実践的では無い。 #DevLove #DevSen

2013-11-30 14:14:04
YAMAMOTO Masaki @nnasaki

今まではメソッド分割 → クラス分割という流れだったが、実践的なやり方の紹介。 getter クラスを最初に作ってしまう。クラス名は変更仕様書に出てくるキーワードにする。データを設定する箇所はコンストラクタに置き換える。#DevLove #DevSen

2013-11-30 14:19:52
YAMAMOTO Masaki @nnasaki

実践的なやり方の続き。get した後のロジックをクラスに移動する。getter は最終的に削除するまでやる。(でも納期前は難しいよねーという話) #DevLove #DevSen

2013-11-30 14:20:37
YAMAMOTO Masaki @nnasaki

クラスの粒度。Stringフィールドが一つだけのクラスを作るんですか?電話番号一つだけなんですが。 → YES。変更を影響箇所を局所化する。注意して欲しいのはString一個のクラスをたくさんつくって欲しいわけじゃない。 #DevLove #DevSen

2013-11-30 14:23:55
YAMAMOTO Masaki @nnasaki

小さなクラスの例として、例えば業務仕様のキーワードをクラスにする。クラス名が業務要件の基本語集になる。DDD でいえば ユビキタス言語 ですかね。 #DevLove #DevSen

2013-11-30 14:25:56
YAMAMOTO Masaki @nnasaki

ドキュメントの改善も行う。自分たちにとって不要なドキュメントは、お客様にとっても不要なものになる。 #DevLove #DevSen

2013-11-30 14:27:04
Takehiro Inoue @i_takehiro

最近レガシーコードと格闘しているので、増田さんの話はとても腑に落ちる #DevLove #DevSen

2013-11-30 14:29:43
小泉勝志郎 @koi_zoom1

#devlove #DevSen 増田さん:日付系クラスは頑張って作る方が良い。「月またぎ」をやる際にミリ秒でもっていてもどうしようもない!

2013-11-30 14:30:32
YAMAMOTO Masaki @nnasaki

プリミティブな型はなるべく使わない。日付は是非クラス化して欲しい。(特にJava) スケジュールで言えば、 DueDate 予定日とか。繰り返しのある予定日とかはLongなどでは表せない。 #DevLove #DevSen

2013-11-30 14:30:49
YAMAMOTO Masaki @nnasaki

データの上書きをやめること。 setter は使わない。データはコンストラクタのみで設定する。データを変えたい時は別のオブジェクトを作る(例:substring) 。出来るだけ immutable にすべき。 #DevLove #DevSen

2013-11-30 14:34:10
小泉勝志郎 @koi_zoom1

#devlove #DevSen 増田さん:副作用を避ける。原因はデータの上書き。じゃあ!上書きをやめれば良い!setterは使わない。データはコンストラクタでのみ設定可能。データを変えたい場合は、別のオブジェクトを用意する。不変(immutable)オブジェクトが副作用をなくす

2013-11-30 14:34:53
YAMAMOTO Masaki @nnasaki

データの複製をやめること。値渡しを止める。データの複製は例えるならば、キャッシュ。データの一貫性が保証されない。 #DevLove #DevSen

2013-11-30 14:38:03
YAMAMOTO Masaki @nnasaki

データを渡してデータを返すのではなく、オブジェクトを渡して、オブジェクトを返す。print したいデータを渡して返してもらうのではなく、print して欲しい print してもらう にする。 #DevLove #DevSen

2013-11-30 14:39:11
YAMAMOTO Masaki @nnasaki

for と コレクションはバグの巣窟。ファーストクラスコレクション パターンを使う。Book, Books<Book> のような感じ。コレクションは外に渡さない。 #DevLove #DevSen

2013-11-30 14:41:40
小泉勝志郎 @koi_zoom1

#DevSen #devlove 増田さん:ファーストクラスコレクション。バグの温床であるfor文を一箇所に集める。プログラムのあちこちに散らばっているロジックを集約するだけでもコードは安定する

2013-11-30 14:42:38
YAMAMOTO Masaki @nnasaki

if や switch 文 は、クラスに分割して、interface 化する。#DevLove #DevSen

2013-11-30 14:48:30
YAMAMOTO Masaki @nnasaki

if や switch 文 は、クラスに分割して、interface 化する。Java なら 列挙型 を使うと良い。 #DevLove #DevSen

2013-11-30 14:48:31
YAMAMOTO Masaki @nnasaki

クラス名の付け方。小さなクラスをたくさん作ると名前つけるの大変。英語の入門書の目次をそのままパッケージ/クラスにしてしまう。会計関連なら例えば、 Accounting Made Simple がお勧めとのこと! #DevLove #devsen

2013-11-30 14:54:20
藤原大 (Dai Fujihara) | アジャイルコーチ @daipresents

100ページぐらいの本を読めばクラス名をつけるの楽ちん。いい発想だなー Accounting Made Simple: http://t.co/o6FwVdOEt0 #devlove #devsen

2013-11-30 14:54:21
小泉勝志郎 @koi_zoom1

#devlove #DevSen 英単語イメージハンドブック、開発の枠を超えて使えそう。make,create,buildの違いとか http://t.co/4jfGUQjwwV

2013-11-30 14:55:34
Takehiro Inoue @i_takehiro

ドメイン駆動設計を導入した結果として、コード量が明らかに減り、変更箇所の特定が容易になった #DevLove #DevSen

2013-11-30 14:56:27