Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
オブジェクト指向と アジャイルソフトウェア開発と 5つの原則
Slide 2
Slide 2 text
自己紹介 @tdakak PHP, Ruby, FreeBSD とか好きです。 無職生活4ヶ月目突入。 これ終わったら BEAR.Sunday で遊ぶ仕事に 戻りつつ、就職活動始めます。 (宣言して自分を追いつめるメソッド)
Slide 3
Slide 3 text
今日話したいこと
Slide 4
Slide 4 text
今日話したいこと オブジェクト指向パラダイム(概念)と オブジェクト指向っぽい設計について。 オブジェクト指向っぽいという流れで アジャイルソフトウェア開発的な話とか。
Slide 5
Slide 5 text
今日話したいこと 今更?
Slide 6
Slide 6 text
今日話したいこと ちょっと脱線して自分の経歴。 学生時代は COBOL, C をメインに Java を少し。 趣味で VB, VC++6.0 や Perl。 社会人になってからは PHP 4.x や 5.1.x, Java など。 前職で Ruby + アジャイルな開発を経験。 現在に至る。
Slide 7
Slide 7 text
今日話したいこと PHP5 ではじめてオブジェクト指向を意識する。 試行錯誤しながら設計する日々を過ごし、 なんとかそれっぽい設計ができるようになり、 その後業務で Ruby を使うことになる。 が、思うようなコードが書けない…!
Slide 8
Slide 8 text
今日話したいこと 書けない原因として考えられること ・ 言語の仕様を理解していない ・ オブジェクト指向を理解していない ・ 何か本質的なところを理解していない ・ そもそもプログラマに向いていない
Slide 9
Slide 9 text
今日話したいこと 自分の持っている知識を見直してみるために、 オブジェクト指向パラダイムと アジャイルソフトウェア開発について 改めて勉強してみた。
Slide 10
Slide 10 text
なぜオブジェクト指向なのか?
Slide 11
Slide 11 text
なぜオブジェクト指向なのか 従来の構造化プログラミングの限界 ・ 各処理の結合度が高くなる ・ 一連の流れを読まなくちゃいけない ・ 変更の影響範囲が大きくなりがち ・ メモリ要領や処理速度の向上 ・ 多少の負荷より可読性や 保守のしやすさを優先できる
Slide 12
Slide 12 text
なぜオブジェクト指向なのか オブジェクト指向プログラミングへの移行 ・ 機能ごとに分割 ・ 再利用しやすくなる ・ ユニットテストしやすくなる …… とか? (※ゆるいイメージです)
Slide 13
Slide 13 text
なぜオブジェクト指向なのか 構造化プログラミングが問題を抱えているのは 何となくわかるけども、 なぜオブジェクト指向なのか?
Slide 14
Slide 14 text
そもそもオブジェクトって何?
Slide 15
Slide 15 text
オブジェクトって? そもそも自分が考える「オブジェクト」の イメージや定義は正しいのか? というところから疑ってみる。
Slide 16
Slide 16 text
オブジェクトって? // PHP で書くとこんな感じになるはず class Hoge { function piyo() { … } } $obj = new Hoge();
Slide 17
Slide 17 text
オブジェクトって? 「たのしいRuby」より ・ プログラムの処理の対象を「データ」ではなく 「オブジェクト」として考える ・ データ構造を組み合わせて複雑な情報を表現 ・ データをプログラム上で表現することで いろいろな操作が可能になる
Slide 18
Slide 18 text
オブジェクトって? わかるような、 わからないような…? (´・ω・`)
Slide 19
Slide 19 text
3つの観点
Slide 20
Slide 20 text
3つの観点 マーティン・ファウラーは ソフトウェア開発プロセスにおける3つの観点と して次のようなものを挙げている。 1. 概念 (conceptual) 2. 仕様 (specification) 3. 実装 (implementation)
Slide 21
Slide 21 text
3つの観点 抽象度が高い=具体的なものではない 具体的なものって? ・ ソースコード ・ データ ・ 演算処理
Slide 22
Slide 22 text
3つの観点 1. 概念 (conceptual) ・ 実装(ソースコード)とは切り離されたもの ・ 責任 ・ 「私が何に対して責任があるのか?」
Slide 23
Slide 23 text
3つの観点 2. 仕様(specification) ・ ソフトウェアのインタフェース ・ 振る舞い ・ 「私はどのように使用されるのか?」
Slide 24
Slide 24 text
3つの観点 3. 実装(implementation) ・ 具体的な処理 ・ ソースコード、データ、演算処理 ・ 「私はどのようにして 自身の責任を全うするのか?」
Slide 25
Slide 25 text
3つの観点 呼び出す側からオブジェクトを見ると… ・ 各機能の責任を負っているオブジェクトたちの 「実装」は問題ではない ・ オブジェクトが何を表すのか ・ オブジェクトがどのような 振る舞いを持つのか
Slide 26
Slide 26 text
3つの観点 実装レベルからオブジェクトを見ると… ・ 操作(メソッド)を伴ったデータ ・ 操作(メソッド)とデータの集合
Slide 27
Slide 27 text
3つの観点 オブジェクトとは… ・ 「データ」と「振る舞い」の集合 ・ 「責任」を持ったもの
Slide 28
Slide 28 text
3つの観点 クラス設計時に、オブジェクト自身の 「責任」や「振る舞い」を はっきりと意識しているか? 自分は感覚に頼ってる部分が多い気がする… 何か危険なにおいがする…
Slide 29
Slide 29 text
腐敗するソフトウェア
Slide 30
Slide 30 text
腐敗するソフトウェア ソフトウェアはなぜ腐ってしまうのか… ・ 開発者の力不足 (´・ω・`) ・ 要件定義が曖昧 ・ 納期に追われた結果 ・ 繰り返される仕様変更
Slide 31
Slide 31 text
腐敗するソフトウェアの兆候
Slide 32
Slide 32 text
腐敗するソフトウェアの兆候 1. 硬さ 2. 脆さ 3. 移植性のなさ 4. 扱いにくさ 5. 不必要な複雑さ 6. 不必要な繰り返し 7. 不透明さ
Slide 33
Slide 33 text
腐敗するソフトウェアの兆候 1. 硬さ ・ 変更しにくいシステム ・ 1つの変更が他の部分にまで影響する
Slide 34
Slide 34 text
腐敗するソフトウェアの兆候 2. 脆さ ・ 1つの変更によって概念的に関係のない部分 まで壊れてしまう
Slide 35
Slide 35 text
腐敗するソフトウェアの兆候 3. 移植性のなさ ・ 他のシステムでの再利用が難しい
Slide 36
Slide 36 text
腐敗するソフトウェアの兆候 4. 扱いにくさ ・ 正しい設計をするのが困難なソフトウェア ・ 正しいことより誤ったことをしやすい ・ 裏技、バッドノウハウ ・ 面倒な開発環境
Slide 37
Slide 37 text
腐敗するソフトウェアの兆候 5. 不必要な複雑さ ・ 本質的な意味を持たない構造を内包 ・ 先行実装したコード ・ 複雑さを増やす魔法の呪文 "後で必要になるかもしれない"
Slide 38
Slide 38 text
腐敗するソフトウェアの兆候 6. 不必要な繰り返し ・ コピペ ・ コピペ ・ コピペ
Slide 39
Slide 39 text
腐敗するソフトウェアの兆候 7. 不透明さ ・ 目的や意図がわかりにくい ・ 読みにくい
Slide 40
Slide 40 text
腐らせないためにどうするか?
Slide 41
Slide 41 text
腐らせないために 「原則」「パターン」「プラクティス」を 継続的に適用することで、 読みやすく変更に強い状態を保つ。 ↓ これがアジャイルな設計!
Slide 42
Slide 42 text
腐らせないために 具体的にどうしたらいい? ・ 設計の方針を決めて従う ・ オブジェクト指向プログラミング ・ アジャイルや XP などのプラクティス適用 ・ 原則
Slide 43
Slide 43 text
5つの原則
Slide 44
Slide 44 text
1. 単一責任の原則
Slide 45
Slide 45 text
単一責任の原則 単一責任の原則 SRP : Single Responsibility Principle クラスを変更する理由は 1つ以上存在してはならない。
Slide 46
Slide 46 text
単一責任の原則 変更理由=役割(責任) 基本的に、1つのクラスに割り当てられる役割は 1つになるようにする。
Slide 47
Slide 47 text
2. オープン・クローズドの原則
Slide 48
Slide 48 text
オープン・クローズドの原則 オープン・クローズドの原則 OCP : Open-Closed Principle ・ 拡張に対して開いていなければならない。 ・ 修正に対して閉じていなければならない。
Slide 49
Slide 49 text
3. リスコフの置換原則
Slide 50
Slide 50 text
リスコフの置換原則 リスコフの置換原則 LSP : Liskov Substitution Principle 派生型はその基本型と 置換可能でなければならない。
Slide 51
Slide 51 text
リスコフの置換原則 ?????
Slide 52
Slide 52 text
リスコフの置換原則 ここで望まれるのは、次の述べるような置換可能な性質 である:S型のオブジェクトo1の各々に、対応するT型 のオブジェクトo2が1つ存在し、Tを使って定義されたプ ログラムPに対してo2の代わりにo1を使ってもPの振る 舞いが変わらない場合、SはTの派生型であると言える。
Slide 53
Slide 53 text
リスコフの置換原則 ?????????????
Slide 54
Slide 54 text
リスコフの置換原則 ・ 赤いもの ・ T型のオブジェクトo2 ・ ねこ ・ S型のオブジェクトo1 ・ o2を持つ ・ とり ・ プログラムP ・ T型のオブジェクトを使う
Slide 55
Slide 55 text
リスコフの置換原則 とりに対して赤いものの代わりにねこを使っても とりの振る舞いが変わらない場合、 SはTの派生型と言える。
Slide 56
Slide 56 text
リスコフの置換原則 プログラム P に o2(T型のオブジェクト) または o1(o2 を保持するS型のオブジェクト) のどちらを渡しても P の挙動が変わらない、 この状態は「 LSP に従っている」と言える。 LSP に違反すると OCP にも違反してしまう。
Slide 57
Slide 57 text
4. 依存性逆転の原則
Slide 58
Slide 58 text
依存性逆転の原則 依存性逆転の原則 DIP : Dependency Inversion Principle ・ 上位のモジュールは下位のモジュールに依存しては ならない。どちらも「抽象」に依存すべきである。 ・ 「抽象」は実装の詳細に依存してはならない。 実装の詳細が「抽象」に依存すべきである。
Slide 59
Slide 59 text
依存性逆転の原則 ここでいう上位モジュールとは ・ アプリケーションの方針に基づく重要な判断 ・ ビジネスモデル ・ アプリケーションの存在理由を決定づける 下位モジュールとは ・ 上位モジュールの実装の詳細を担当
Slide 60
Slide 60 text
依存性逆転の原則 上位モジュールが下位モジュールに依存している 場合、問題を抱えてしまう。 ・ 下位モジュールの変更が 上位モジュールに影響を与えてしまう ・ 上位モジュールの再利用が難しい (依存関係にある下位モジュールを切り離せない)
Slide 61
Slide 61 text
依存性逆転の原則 下位モジュールが宣言したインタフェースに 上位モジュールが従う形は、 インタフェースの所有権が 下位モジュールにある 状態だといえる。
Slide 62
Slide 62 text
依存性逆転の原則 逆に上位モジュールがインタフェースを宣言し、 下位モジュールはそれに従う形にすることで、 インタフェースの所有権を 上位モジュールに 持たせることができる。
Slide 63
Slide 63 text
5. インタフェース分離の原則
Slide 64
Slide 64 text
インタフェース分離の原則 インタフェース分離の原則 ISP : Interface Segregation Principle クライアントに対し、クライアントが利用しない メソッドへの依存を強制してはならない。
Slide 65
Slide 65 text
まとめ
Slide 66
Slide 66 text
まとめ この辺のことを知っておくと何がいいの? ・ オブジェクト指向のこと ・ アジャイル的な何か
Slide 67
Slide 67 text
まとめ オブジェクト指向パラダイムへの理解 ・ Web + 軽量プログラミング言語界隈では 大事な考え方(少なくとも今のところは) ・ 何となくでも理解することで、読み書き できる内容が変わってくると思う。 ・ FW やライブラリの設計を理解する手助け。
Slide 68
Slide 68 text
まとめ アジャイルの思想とか アジャイルや XP は先人の知恵。 取り入れられそうなところをやってみる。 パターン、プラクティス、原則 などなど。 ただしむやみやたらに導入、適用しないことも大切。
Slide 69
Slide 69 text
参考書籍
Slide 70
Slide 70 text
参考書籍 アジャイルソフトウェア開発の奥義 著者はロバート・C・マーチン、 通称ボブおじさん。 オブジェクト指向による設計と アジャイルの思想についてがっつり。 700ページ超のボリューム(凶器)
Slide 71
Slide 71 text
参考書籍 オブジェクト指向のこころ オブジェクト指向を題する本の中で 評価がよさそうだったので購入。 「オブジェクトとは何か」という定義 から UML の説明、具体的な実装を例 にいくつかのデザインパターンが紹介 されている。
Slide 72
Slide 72 text
参考書籍 各原則については「アジャイルソフトウェア開発 の奥義」から引用しています。 「オブジェクト指向のこころ」は ”実装レベルで は理解できているけど本質的なところは曖昧でふ わふわしてる” っていう人におすすめです。
Slide 73
Slide 73 text
参考書籍 定番のこちらもおすすめ アジャイルプラクティス 達人プログラマに学ぶ現場開発者の習慣 アジャイルサムライ 達人開発者への道
Slide 74
Slide 74 text
ありがとうございました。