オブジェクト指向設計の原則

7,145 views

Published on

2010/12/11 VSUG アーキテクトアカデミー

Published in: Design
0 Comments
17 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
7,145
On SlideShare
0
From Embeds
0
Number of Embeds
1,606
Actions
Shares
0
Downloads
85
Comments
0
Likes
17
Embeds 0
No embeds

No notes for slide
  • これは、概要スライドの 別の例です。
  • これは、切り替えを使用した 概要スライドの例です。
  • オブジェクト指向設計の原則

    1. 1. オブジェクト指向設計の原則<br />NPO アイネタ・ジャパン 理事<br />日本XPユーザ会 運営メンバー<br />小井土 亨<br />
    2. 2. 自己紹介<br />仕事<br />パッケージベンダーで、パッケージを開発<br />具体的な作業内容<br />開発のガイドラインを作る<br />開発プロセスを設計する<br />開発プロセスを支える環境を構築し、運用する<br />各種ツールの選択や開発<br />ビルド環境の整備、各種管理ツールの整備<br />ソフトウェア・アーキテクチャの決定する<br />基盤フレームワークの設計と実装<br />基盤の共通ライブラリの設計と実装<br />開発上のいろいろな相談を受ける<br />今日の目的<br />オブジェクト指向における設計の基本原則やデザインパターンなどについて、良い設計という観点で議論したいと思います<br />特に、アーキテクチャと設計の関係について、会場のみなさんと考えたいと思います<br />2<br />
    3. 3. 本日のアジェンダ<br />3<br />
    4. 4. ソフトウェア開発とは<br />ソフトウェア開発の本質<br />解決すべき問題をより単純な問題に分割する<br />分割した問題に解法を適応する<br />解法を適応したものを組み立てる<br />4<br />
    5. 5. 設計に関する質問<br />要求を完全に理解できたとした場合、<br />設計結果は同じとなる?<br />Yes /No<br />5<br />
    6. 6. 設計に関する質問<br />機能仕様が同じ場合、設計は、だれが行っても同じ結果となる?<br />Yes /No<br />6<br />
    7. 7. 設計に関する質問<br />去年の自分と今年の自分が同じ仕様に対して設計したら、同じ結果となる?<br />Yes /No<br />7<br />
    8. 8. 設計とは<br />設計の本質<br />要求、分析の結果をどのように実現するかを解決させる活動<br />設計は、問題を解く作業なので、唯一の正解はなく、あるのは最適解<br />設計の基本<br />分析の全ての機能を正しく実現する<br />ソフトウェアの完全な姿を提供すべきである<br />設計結果は、ドキュメントとして提供されることが多い<br />ドキュメントベースのコミュニケーション<br />設計結果を利用する人が読みやすく理解しやすい<br />8<br />
    9. 9. 設計の目的<br />9<br />
    10. 10. 悪い設計<br />良い設計<br />10<br />
    11. 11. 設計の難しさ<br />11<br />
    12. 12. 心がけていること<br />12<br />
    13. 13. 設計の原則<br />プログラムをモジュールに分割する<br />分割することで、プログラムが複雑になるのを避ける<br />モジュール間の依存関係を明確にする<br />モジュール間の結合度が低い<br />モジュール間の結合度が低いほうが良い<br />修正や問題が影響する範囲が少なくなる<br />モジュールの凝集度が高い<br />各モジュール内の凝集度を高くすることで、モジュール間の結合度が低くなる<br />再利用率<br />モジュール分割し、モジュール間の結合度を低くして再利用率を上げる<br />13<br />
    14. 14. イベント駆動型サービス<br />要求があった場合にサービスを実行する。<br />例は?<br />利点は?<br />14<br />
    15. 15. バッチ処理型サービス<br />決められた計画に沿ってサービスを実行する。<br />例は?<br />利点は?<br />15<br />
    16. 16. アーキテクチャと品質<br />「人を移動させる」という要求に対して、<br />イベント駆動型とバッチ処理型のサービスでは、品質にどのような違いがあるでしょうか?<br />16<br />
    17. 17. イベント駆動とバッチ処理<br />イベント駆動によるサービス<br />要求があった場合にサービスを実行する<br />イベント駆動の例<br />タクシーのサービス<br />利点<br />要求された時だけサービスを行うことで運用コストを減らす<br />バッチ処理によるサービス<br />事前に決められた計画に沿ってサービスを実行する<br />バッチ処理の例<br />ダイヤを決めて運行する電車やバスのサービス<br />利点<br />まとめて行うことでコストを減らす<br />サービスを行う回数を少なくして運用コストを減らす<br />17<br />
    18. 18. ソフトウェアアーキテクチャ<br />ソフトウェアアーキテクチャとは<br />ソフトウェア構造や構造化の原則<br />ソフトウェアアーキテクチャの目的<br />ソフトウェアの品質特性を強制(支配)する構造を構築する<br />品質特性とは<br />ソフトウェアが実現するべき品質の特徴<br />代表的なもの<br />パフォーマンス(性能・速度)<br />安全性<br />信頼性<br />可用性(Availability)<br />堅牢性(セキュリティ)<br />ユーザビリティ(使いやすさ)<br />拡張性<br />18<br />
    19. 19. ソフトウェアアーキテクチャの定義<br />ソフトウェアアーキテクチャの定義<br />複数の定義が必要<br />複数の角度からの表現を組み合わせて定義を行う<br />ソフトウェア開発のビジョンを実現するために必要なソフトウェア構造<br />構造化原則<br />抽象的な構造やガイドライン<br />概念的な構造(モデリング)<br />ANSI/IEEE Std 1471-2000<br />構成要素を統合したシステムの基本的な構造,構成要素の相互および構成要素と環境間の関係,そしてシステム設計と発展を導く方針<br />全体の分け方と、分けた部分をどのように関係づけるか<br />19<br />
    20. 20. ソフトウェアアーキテクチャの構築<br />アーキテクチャへの要求<br />達成すべき品質特性への要求<br />各品質特性は、相反する項目がある<br />トレードオフを考慮し、アーキテクチャを決定する<br />要求の種類<br />非機能要求<br />長期的な機能要求<br />アーキテクチャ構築時の考慮点<br />可変性<br />変わる要求と変わらない要求の分析<br />リスクの方針<br />さまざまの視点からリスクの洗い出しと方針を決定<br />20<br />
    21. 21. アーキテクチャの複数のビュー<br />ビューポイントとは<br />ステークホルダの関心事に応じた視点<br />ビューとは<br />複数の関連した視点(ビューポイント)によって、アーキテクチャを記述するものがビューである<br />4つのビュー<br />論理ビュー<br />システムが必要とされている機能を実現する、論理的な構造<br />実行ビュー<br />実行時のプロセスやタスクやスレッドといった実行時の単位の構造<br />開発ビュー<br />システムが開発時のファイル等を単位とした構造<br />配置ビュー<br />システムをどのようなマシン上で動作させ、各プロセスがどのマシン(CPU)上に配置されるか等を表した構造<br />21<br />
    22. 22. パターンに関する質問<br />デザイン・パターンを勉強したことは?<br />Yes /No<br />22<br />
    23. 23. パターンに関する質問<br />パターンを書いたことは?<br />Yes /No<br />23<br />
    24. 24. パターンに関する質問<br />パタン・ランゲージを説明してください。<br />24<br />
    25. 25. パタン・ランゲージ<br />デザイン・パターン<br />経験に基づいて、繰り返し考え出されてきた、設計についての解決策を一定の形式で記述したもの<br />名前/目的/動機/適用可能性/構造/構成要素/協調関係/結果/実装/関連するパターン<br />名前/問題/解決策/効果(トレードオフ)/関連<br />パタン・ランゲージ<br />何らかの活動に必要なパターンの集まり<br />パターンを組合わせて作られる体系<br />25<br />
    26. 26. パターンに関する質問<br />アーキテクチャをパタン・ランゲージで体系化することについて?<br />〇(有効) or ×(有効でない)<br />26<br />
    27. 27. 設計方針に関する質問<br />仕様変更が繰り返されると、設計は悪くなる(設計の悪臭)?<br />Yes /No<br />27<br />
    28. 28. 設計方針に関する質問<br />先を見越して、発生しそうな仕様変更に<br />対する仕組みを組み込むべきである?<br />Yes /No<br />28<br />
    29. 29. 設計方針に関する質問<br />仕様変更は、予測できる?<br />(予測できない、仕様変更はない)Yes /No<br />29<br />
    30. 30. 悪い設計の兆候<br />硬さ<br />変化しにくいシステム<br />1つの変更が全体に影響し、多くの変更が必要になる<br />もろさ<br />1つの変更で、論理的には関連のない箇所まで正常動作しなくなる<br />扱いにくさ<br />正しいことをすることが難しいシステム<br />不透明さ<br />読みにくく、わかりにくい<br />不必要な複雑さ<br />本質的に意味を持たない構造が含まれているシステム<br />不必要な繰り返し<br />同じような構造が繰り返し現われ、共通化できる部分がされていない<br />移植性のなさ<br />再利用できる部分を切り出すことができない<br />30<br />
    31. 31. 良い設計とは(設計品質特性)<br />正確性<br />仕様を正しく満たしていること<br />理解性<br />設計結果が読みやすく理解しやすいこと<br />一貫性(統一性)<br />設計上の個々の概念が首尾一貫して、ぶれがない<br />変更容易性<br />機能強化などに伴う変更が容易であること<br />頑健性<br />誤った使い方に対して、システムが適切に対処できること<br />システムの一部のバグが全体に波及しないこと<br />移植性<br />いろいろなハードウェア、ソフトウェア環境へ容易に移植できること<br />効率性<br />実行効率、資源効率ともに十分実用に適応していること<br />31<br />
    32. 32. テスト容易性と設計<br />テスト容易性は設計の指針となるか?<br />Yes /No<br />32<br />
    33. 33. 良いテストの条件<br />テスト目的が明確である<br />何をテストするか明確である<br />その目的も明確で、更にひとつであること<br />テストの判定が正しい<br />テストの成功、失敗が正しく判定されている<br />テストを独立して実行することができる<br />テストが他のテストに依存することなく、独立している<br />繰り返し実行することができる<br />何度でも繰り返して、テストを実行することができる<br />テストを実行しても、状態が変化しない<br />テストを実行し、成功した場合でも失敗した場合でも、テストを実行する前と後で何も変わらない<br />33<br />
    34. 34. 良いテストの効果<br />メソッドが一つの機能を実現している<br />メソッドが明確な一つの機能だけを提供する<br />メソッドの結果を提供する<br />外部に対して、メソッドの処理結果を判断できるような何らかの方法を提供する<br />クラスやメソッドの独立度が高いこと<br />クラスやメソッドの、他のクラスやメソッドへの依存度が低い<br />特定の環境への依存度が低い<br />特定のファイルやデータベース構造などに対する依存度が低い<br />34<br />
    35. 35. 良い設計の特徴<br />完全性と十分性<br />システムが目的を達成するために必要な機能のみを含んでいる<br />原子性<br />1つのサービスを実現することに焦点があたっている<br />高凝集度<br />少数に絞られた責務を持ち、その責務を実装するためだけの機能を持つ<br />低結合度<br />他の部分との連携が必要最低限である<br />35<br />
    36. 36. 設計品質とテスト容易性<br />良いテストの効果と良い設計の相関関係<br />36<br />
    37. 37. 重複をなくす<br />DRY原則(Don't Repeat Yourself.)<br />例は? 有効性は? 理由は?<br />37<br />
    38. 38. DRY原則(Don't Repeat Yourself.)<br />DRY原則<br />重複をなくす<br />重複コードを書かないための設計を行う<br />ソフトウェア開発全般での適応<br />設計、プログラミング以外でも、重複をなくす<br />38<br />
    39. 39. 設計の原則 単一責任の原則<br />SRP(The Single Responsibility Principle)<br />クラスは、1つの役割(責任)だけを持つ<br />1つの理由のみによって、クラスが変更される<br />役割を単独でテストできる<br />役割=変更理由=テスト単位<br />凝集(cohesion)と同意<br />凝集とは、モジュールに含まれる要素間の機能的な結び付き<br />原則の適用条件<br />役割の変更が確実に想定される場合<br />理由なく適応すると、「不必要に複雑な設計」となる<br />役割をテストする必要がある場合<br />問題の予兆(もろい設計)<br />ある役割の変更に伴い、本来関係ないと思われる役割のクラスに変更の影響がある<br />独立したテストが困難なクラスがある<br />39<br />
    40. 40. 設計の原則 オープン・クローズドの法則<br />OCP(The Open-Closed Principle)<br />ソフトウェアの構成要素(クラス、モジュール、関数など)は拡張に対して開いていて、修正に対して閉じていなかればならない<br />拡張に対して開いているとは<br />構成要素の振る舞いを拡張できる<br />修正に対して閉じているとは<br />モジュールの振る舞いを拡張しても、既存のモジュールは変更の必要がない<br />原則の適用<br />長く使い続けられるシステムを開発する<br />システムに機能の追加や変更をし、成長させる必要がある<br />確実でない変化に対応するための準備は 「無意味に複雑な設計」となる<br />問題の予兆(硬い設計)<br />ちょっとした変更でさえ、修正箇所と依存関係のある全ての箇所を修正する必要がある<br />機能の追加や修正を行なったときに、それに伴って修正しなければならないif文やswitch文が数多くある<br />コピー&ペーストで、大量の同じコード存在する<br />40<br />
    41. 41. 設計の原則 リスコフの置換原則<br />LSP(The Liskov Substitution Principle)<br />派生クラスは、その基本クラスと置換え可能でなければならない<br />派生クラスは、基本クラスが許可する全てを許可しなければならい<br />原則の適応条件<br />基本クラスの派生型を作成する場合<br />契約による設計<br />派生クラスは、基本クラスの事前条件より等しいか弱いか<br />派生クラスは、基本クラスの事後条件より等しいか強いか<br />単体テストによって契約を明記する<br />問題の予兆(もろい設計)<br />派生クラスが増えた場合に基本クラスに変更が必要<br />派生クラスごとの分岐処理が基本クラスに存在する<br />基本クラスの機能を派生クラスが無力化する<br />基本クラスの機能を派生クラスで何もしない動作と置き換える<br />41<br />
    42. 42. 設計の原則 依存性逆転の原則<br />DIP(The Dependency Inversion Principle)<br />上位モジュールは、下位モジュールに依存してはならない<br />抽象(目的)に依存させる<br />実装の詳細に依存させない<br />原則の適応条件<br />レイヤ構造によって、システムの複雑性を低くする<br />変更に耐えられるコードを構築する必要がある<br />コードの保守が想定される<br />問題の予兆(もろい設計)<br />下位モジュールの変更が上位モジュールに影響する<br />42<br />A<br />A<br />IB<br />B<br />B<br />
    43. 43. 設計の原則 インターフェイス分離の原則<br />ISP(The Interface Segregation Principle)<br />クライアントに、クライアント依存しないメソッドへの依存性を強制してはならない<br />インターフェイス内の強い関連があるものをグループ化して分離する<br />原則の適応条件<br />変更に強いシステムを開発する<br />多目的なインターフェイスを目的ごとに分離し、不用意な結びつきを避ける<br />クラス間の依存度を下げて、低結合度を実現する<br />目的ごとのテストを作成する<br />問題の予兆(もろい設計)<br />クライアントが利用していないメソッドの変更に影響される<br />インターフェイスの実装クラスの変更が広範囲に影響する<br />インターフェイスが部分的(グループ単位)にしか強い関連を持っていない<br />43<br />
    44. 44. テスト駆動開発とは<br />TDDの目的<br />テスト利用して、良いソフトウェアを開発する<br />TDDの定義(規則)<br />失敗する自動テストコードを作成するまで、プロダクトコードを書かない<br />コードの重複をなくす<br />TDDのテストコードとは<br />プロダクトコードが実現しなければならないこと<br />プロダクトコードのインターフェイスを洗練させるもの<br />TDDの設計(シンプルな設計)<br />すべてのテストにパスする<br />テストにパスするのに必要なコード<br />最適な範囲で、最小限の数のクラス<br />最適な範囲で、最小限の数のメソッド<br />44<br />
    45. 45. TDDと設計<br />TDDでは、設計せずに、すぐに実装を行う?<br />Yes / No<br />45<br />
    46. 46. 誤解と実際<br />誤解<br /><ul><li>設計せずに、すぐに実装を行う
    47. 47. 実装を始める前に、全てのテストを作成する
    48. 48. コードが唯一のドキュメントである</li></ul>実際<br /><ul><li>コードを重要なドキュメントのひとつと位置づける
    49. 49. 要件をテストという形で明確化する
    50. 50. 自動テストを作成してから実装を行う
    51. 51. テストを単位として、小さいステップでソフトウェア開発を進める</li></ul>46<br />
    52. 52. コードの位置づけ<br />コードは重要なドキュメントのひとつ<br />目標「動作するきれいなコード」<br />詳細かつ正確なドキュメント<br />ドキュメントとして認識して、クリアで読みやすくする<br />テストコードは貴重なリソースのひとつ<br />継続的な開発で繰り返し利用される<br />運用で問題が発生した場合<br />テストを追加する<br />既存のテストを実行し、修正を確実に行う<br />47<br />
    53. 53. リファクタリング<br />リファクタリング(再設計)は、設計力がない人が行うものである?<br />Yes / No<br />48<br />
    54. 54. リファクタリング<br />リファクタリングとは<br />機能や振る舞いを変えることなく、コンポーネントの構造を最適化する<br />重複をなくす、非効率なアルゴリズムの改修、よりシンプルな構造にするなどを目的に行う<br />リファクタリングの目的<br />長期的に機能拡張を可能な状態にコードを維持する<br />変更コストを一定に保つ<br />リファクタリングのサイクル<br />常にリファクタリングを意識して、コードを良い状態に保つ<br />コメントを書きたくなった時<br />テストしたいプライベートメソッドがあった時<br />変更を行う前に、変更しやすいようにリファクタリングする<br />49<br />
    55. 55. リファクタリング<br />どのような時にリファクタリング(再設計)を、行いますか?<br />50<br />
    56. 56. リファクタリング コードの不吉な匂い<br />リファクタリングのヒント<br />重複したコード<br />長すぎるメソッド<br />巨大なクラス<br />多すぎる引数<br />変更の発散<br />ひとつの変更に、複数のクラスを同時に直さなければならない<br />変更の分散<br />ひとつの変更が多くの箇所に影響する<br />プロパティ、メソッドの横恋慕<br />他のクラスをよく利用するメソッドなど<br />データの群れ<br />必ず同時に利用されるデータの集まり<br />51<br />
    57. 57. リファクタリング コードの不吉な匂い<br />リファクタリングのヒント<br />スイッチ文<br />疑わしき一般化<br />「いつか必要になるかも?」という理由での基本クラス<br />一時的プロパティ<br />特定の状況下だけで有効なプロパティ<br />仲介人<br />他のクラスに処理を委譲するだけのクラス<br />不適切な関係<br />2つのクラスを常に連動して動作する<br />相続拒否<br />親クラスの一部しか利用しないサブクラス<br />コメント<br />52<br />
    58. 58. 参考文献<br />実践ソフトウェアエンジニアリング ロジャー S・プレスマン<br />森口 繁一編『ソフトウェア品質管理ガイドブック』日本規格協会(1990)<br />アジャイルソフトウェア開発の奥義 ロバート・C・マーチン<br />日経ソフトウェア「正しく学ぶソフトウェア設計」<br />実践UML パターンによる統一プロセスガイド クレーグ・ラーマン<br />UMLによる オブジェクト指向モデリング セルフレビューノート 荒井玲子<br />UML モデリングの本質 児玉公信<br />テスト駆動開発入門 ケント・ベッグ<br />ソフトウェアアーキテクチャ 岸知二、野田夏子、深澤良彰<br />Software Factories ソフトウェアファクトリー Jack Greenfield, Keith Short<br />リファクタリング プログラムの体質改善テクニック Martin Fowler<br />IT アーキテクチャ・メタモデル セマンティック解説 ITスキル標準 V2 2006<br />アーキテクトの審美眼 萩原正義<br />53<br />

    ×