イベントの動画 : https://www.youtube.com/watch?v=2Z1CJhPk-f8
オブジェクト指向プログラミングはクラス設計。 クラス設計はプログラムの分割。 クラス設計の焦点は、ビジネスルールを表現するクラスと、ビジネスアクションを表現するクラス。 クラス設計やパッケージ設計の実証済の形を覚えると、出発地点の設計が楽になる。 リファクタリングを積み重ねて設計を改善していく。
クラス設計本格入門2021年6月16日有限会社システム設計 増田 亨JJUGナイトセミナー 「オブジェクト指向プログラミング入門」セッション #3
View Slide
自己紹介ブログ:ソフトウェア設計を考えるhttps://masuda220.hatenablog.com/www.slideshare.net/masuda220/2017年7月発売先月 増刷しました(4刷)読者サポート:twitter.com/masuda220この特集で書いた内容の背景にある考え方を今日は話す
オブジェクト指向プログラミングとはクラスの設計である
クラスの設計とはプログラムの分割であるかつ、クラスの設計とはロジックとデータの集約である
クラス設計:プログラムの分割小クラス主義と大クラス主義小クラス主義(小さく分割)⚫分割を考えるのがたいへん(分けなくても動く)⚫だんだん効果がでてきて、効果が波及する(効果が持続する)◎ わかりやすさ、変更の影響の局所化、部品として再利用大クラス主義(大きく分割)⚫とりあえず一つにまとめておけば考えることが減る(動かすことに専念)⚫だんだんたいへんになり、最後は破綻する× 見通しが悪い、変更の影響が推測できない、部分的なコピペの横行
クラス設計:分割と統合の労力分割の労力⚫分割(クラス設計・パッケージ設計)を毎回手探りするのはたいへん⚫クラス設計・パッケージ設計には実証済の形がある⚫そういう実証済の分割の形を出発点にして楽をする⚫リファクタリング(分割の改善)を毎日少しずつ積み立てる統合の労力⚫うまく分割されたクラスを組み合わせることは容易⚫統合役(組み立て役)のクラスの設計は統合の役割だけ考えればよい
リファクタリング(プログラム分割の改善)分割不足を改善する✓メソッドの抽出(と名前づけ)✓クラスの抽出(と名前づけ)✓パッケージの追加/サブパッケージの追加(と名前づけ)分割意図の表現を明確にする✓パッケージ名の変更✓クラス名の変更分割した要素(クラス・パッケージ)の凝集度を上げる✓クラスの移動✓メソッドの移動✓インスタンス変数の移動✓パッケージ/サブパッケージの移動
クラス設計(プログラム分割)の形①クラスの役割で分割するアプリケーションのクラス構成②対象領域(ドメイン)の関心事で分割する対象領域を表現するクラスとパッケージ③値の種類で分割する対象領域の基本型④組み立て役のクラス合成・コンテキスト・コレクションのラッピング
① クラスの役割で分割する永続化クライアント@RepositoryJDBC TemplateSQLMapper通信クライアント@ComponentRest TemplateJMS Templateサービスの起動役@Controller@RestController@MessageListener@Scheduledビジネスアクションの表現計算判断の実行通知・依頼記録・参照@Serviceビジネスルールの表現事業活動の決め事計算判断ロジックの宣言的な記述POJO複雑 複雑フレームワークで単純化フレームワークで単純化
クラス設計の焦点:複雑さを分割するビジネスルールを表現するクラスの設計ドメイン層のドメインオブジェクトのクラス設計✓ 事業活動の決め事(ビジネスルール)を✓ 値の種類に注目して✓ 宣言的に記述ビジネスアクションを表現するクラスの設計アプリケーション層のサービスクラスのメソッド群の定義✓ 計算判断の実行(ドメインオブジェクトに計算判断をさせる)✓ 通知・依頼✓ 記録・参照
② 対象領域(ドメイン)の関心事で分割する価値の提供能力在庫(inventory)提供能力(capacity)提供可能性(availability)手配(arrangement)購入(purchase)調達(procurement)提供する価値の表現物品(goods, product)役務(service)権利(right)利用(usage)移動(transport)価格(pricing)提供条件(policy, conditions)販売機会商品カタログ(catalogue)引合(inquiry)見積(estimate)提示(offer)約束と履行契約(contract, order)予約(reservation, booking)値引(discount)引渡(delivery)請求支払(billing, payment)進捗(progress, milestone)キャンセル(cancel)関係顧客(customer, account)関係(relationship)連絡(contact)伝達(communication)通知(notification)計画と実行予定(schedule)計画(plan)行動(action)進捗(progress, milestone)パッケージ and/or クラスの候補対象領域の知識・理解興味を持てば習得できるが…
対象領域(ドメイン)のクラス設計に取り組む前スライドのような対象領域の基本の言葉を覚えるのが第一歩基本の言葉の周りにある関連語彙を増やして知識を広げていく✓基本の言葉+[管理システム]で検索すると参考情報が見つかる在庫管理システム、請求管理システムcapacity management system基本の言葉のまわりにはさまざまな決め事(ビジネスルール)がある✓この決め事がソフトウェアを複雑にする原因さまざまな決め事をクラスで表現する形を覚える
ビジネスルールを表現する形ビジネスルールの基本の形事実から計算する(金額計算、日付計算、区分の判定、… )事実から判断する(出荷可能か?、予約可能か?、範囲内か?)計算判断ロジックと事実(データ)を一つのクラスにまとめる事実をインスタンス変数で表現計算判断のロジックをメソッドで表現(意図+実装)インスタンス変数以外の事実が必要ならメソッドの引数で渡す計算判断の結果をメソッドの返す型で表現ビジネスルールは宣言的(同じ事実からは必ず同じ結果になる)
③ 値の種類で分割対象領域の事実を扱う基本クラス基本的な値を扱うクラス数量 金額、単価、個数、人数、百分率、千分率日付・時刻 日付、日数、時刻、時間区分を表す値を扱うクラス種類の違い 商品種別、会員種類、料金区分、配送方法状態の違い 処理待・処理中・処理済、在庫有無、予約可否範囲を扱うクラス数量の範囲 価格帯(x円~y円)、数量範囲(x個~y個)日付・時間の範囲 期間(開始日~終了日)、時間帯(開始時刻~終了時刻)対象領域で扱うこれらの値の種類ごとに、ビジネスルール(計算判断のロジック)と事実の表現(インスタンス変数)をクラスで定義する区分を整理しロジックを集めるプリミティブな計算式を隠蔽判断ロジックのカプセル化
クラスの設計:メソッドの集合として定義四則演算足し算、引き算 add(), plus(), subtract(), minus()掛け算 multiply(), times()割り算、あまり divide(), remainder()比較演算等値 equalsTo(), notEqualsTo()大小、前後 greaterThan(), lessThan() , isAfter(), isBefore()境界 境界要素の取得 MAX, MIN順序 前の値・次の値 previous(), next()文字列形式文字列に変換 toString(), show(), format()文字列から変換 from(), parse()✓ 対象領域で関心のあるメソッドだけに絞り込むことで、クラスの意図(型の意味)が明確になる✓ 引数の型やメソッドの返す型を目的特化・用途限定にするほど挙動が安定する(契約による設計)(汎用的なライブラリクラスと設計の方向が逆) 事前条件・事後条件事実を扱う計算判断ロジックの候補
④ 組み立て役のクラスの形分割したクラスの組み合わせ方日時日付 時刻明細行単価 数量料金計算コンテキスト価格体系 割引適用日 税率税区分顧客種別注文番号計算判断の文脈を特定する番号永続化された事実を集めて、コンテキストを組み立てるためのキー
組み立て役のクラスの形コレクション操作をカプセル化コレクションとその操作をカプセル化して独自のクラスを作る操作の意図を公開し、操作の実装は隠蔽するリスト操作をカプセル化filter操作 サブリストの抽出map操作 別の要素のコレクションに写像reduce操作 合計、個数、最大、最小、…セット(集合)操作をカプセル化部分集合(subset)和集合(union)差集合(minus)共通集合(intersect)マップ(写像)操作をカプセル化マップのマップから値の取り出し逆写像(値からキーの特定)写像の併合(merge)共通写像(intersect)表形式の計算ルールや判定ルールスキルセットルールセット商品一覧メンバー一覧注文一覧…
組み立て役のクラス:ビジネスアクションアプリケーション層のクラスの分割と組み立ての形請求書発行サービス決済サービス請求アクティビティクラス出荷アクティビティクラス出荷指示サービス売上計上サービス出荷通知サービス注文処理シナリオクラス通知・記録・参照の基本アクションを表現関心事ごとの活動体系を表現業務全体の流れの表現ここにごちゃごちゃ書かない計算判断はビジネスルールクラスを利用する(ロジックをここに書かない)分ける分ける 分ける
クラス設計本格入門まとめ