SlideShare a Scribd company logo
1 of 56
Download to read offline
HOWTO
よいデザイン
 Hiroki Yagita
  2010/09/27
      YSH
※
ドメイン = ソフトウェア
デザイン = 設計
質問は適時で
よいデザインの原則
1.定石にもとづく
2.疎結合
3.高凝集
4.Design by contract
5.高いテスト容易性
6.以降もたくさんある
今日は1.だけ
1.定石にもとづく
ソフトウェア開発のある部分を
切り出すと一定のパターンには
まることが非常に多い
Example #1

グラフィカルユーザーインターフェイス
          ↓
      イベントドリブン
      ダブルフリップ
Example #2

一度に複数を同時実行
     ↓
  マルチスレッド
 同期オブジェクト
Example #3

様々な外部記憶装置を一様に扱う
        ↓
    ファイルシステム
      ストリーム
◎

既知のパターンをできるかぎり多く押さえ
ておくことが、よいソフトウェアを開発でき
     るか否かの鍵となる
×

パターンに基づかずに開発したソフトウェ
アは、パターンにはまっていないが故に学
  習コストが高く、見通しが悪くなる
パターン概要
アーキテクチャパターン
 デザインパターン
   イディオム
アーキテクチャパターン


          デザインパターン

                 イディオム
イディオム
ソフトウェア工学においてアルゴリズムや
プログラミングのノウハウ、チップを集めた
もの




     -- http://ja.wikipedia.org/wiki/イディオム_(曖昧さ回避)
Example #1 Ruby

               obj ||= {}


unless obj
  obj = {}
end
Example #2 Ruby

         a, b = b, a


c = a
a = b
b = c
Example #3 C

void usage() { /* … */ }
Example #4 C

while ((c = getc(f)) != EOF) {
  /* … */
}
Example #5 C++

class NonCopyable {
private:
   NonCopyable(const NonCopyable &);
   NonCopyable &operator=(const NonCopyable &);
};
◎

知っている人は流れる水のごとく意味を理
解できるため、コードリーディング・コードラ
 イティングスピードが圧倒的に速くなる
×

イディオムにもとづかずに開発したソフト
ウェアは、イディオムにはまっていないが
故に学習コストが高く、見通しが悪くなる
イディオム本
1. Code Reading
   http://amzn.to/adcMvY
2. リファクタリング
   http://amzn.to/M3UvT
3. ケント・ベックのSmalltalkベストプラクティス・パ
   ターン―シンプル・デザインへの宝石集
   http://amzn.to/aeEBdL
デザインパターン
コンピュータのプログラミングで、素人と達人の
間ではびっくりするほどの生産性の差があるが、
その差はかなりの部分が経験の違いからきて
いる。達人は、さまざまな難局を、何度も何度も
耐え忍んで乗り切ってきている。そのような達
人たちが同じ問題に取り組んだ場合、典型的に
はみな同じパターンの解決策にたどり着くのだ
が、これがデザインパターンである (GoF)。

     -- http://ja.wikipedia.org/wiki/デザインパターン(ソフトウェア)
デザインパターンをものにする
     プロセス
1.本を読んで覚える
   2.実際に使ってみる
 3.パターン病に罹患する
4.パターン病から回復する
  5.パターンを理解する
Example #1 Template Method(C++)
class FuncA {      class FuncInterface {
public:            public:
   void func() {      void func() {
     // 前処理             // 前処理
     // 固有処理1           specific_func();
     // 後処理             // 後処理
   }                  }
};                 protected:
                      virtual void specific_func() = 0;
class FuncB {      };
public:
   void func() {   class FuncA : public FuncInterface {
     // 前処理        protected:
     // 固有処理2         virtual void specific_func() {
     // 後処理             // 固有処理1
   }                  }
};                 };

                   class FuncB : public FuncInterface {
                   protected:
                      virtual void specific_func() {
                        // 固有処理2
                      }
                   };

        適用前                          適用後
◎

デザインパターンを押さえることで設計上
の典型的な問題を簡単に解決することが
出来るようになる。また、すべてのデザイ
ンパターンには名前がついているため、設
計者同士での議論を加速することが可能
        となる。
×

デザインパターンにもとづかずに開発した
ソフトウェアは、デザインパターンにはまっ
ていないが故に学習コストが高く、見通し
        が悪くなる
デザインパターン本
1.   オブジェクト指向における再利用のためのデザインパターン
     http://amzn.to/80alJI
2.   パターン指向リファクタリング入門
     http://amzn.to/dB23ad
3.   プログラムデザインのためのパターン言語
     http://amzn.to/8ipKvr
アーキテクチャパターン
アーキテクチャパターンは、ソフトウェアシステムの基礎的な構
造組織化スキーマ(structural organization schema)を
表現するものである。アーキテクチャパターンによって、あらか
じめ定義されているサブシステムの集合が与えられ、その責務
が決定される。パターンには、サブシステム間の関係を組織化
するルールとガイドラインが含まれる。




                   -- PATTERN-ORIENTED SOFTWARE ARCHITECTURE
Example #1 Layers

  OSI 参照モデル
Example #1 Layers

Android architecture
Example #2 Model-View-Controller

       Smalltalk-80 MVC
Example #2 Model-View-Controller

       Ruby on Rails MVC
◎

アーキテクチャパターンを押さえることでシ
ステムがどのような基本構造を持っている
かを明確に示すことができ、また、明確に
  理解することができるようになる。
×

アーキテクチャパターンにもとづかずに開
 発したソフトウェアは、アーキテクチャパ
ターンにはまっていないが故に学習コスト
    が高く、見通しが悪くなる
アーキテクチャパターン本
1.   ソフトウェアアーキテクチャ―ソフトウェア開発のためのパターン体系
     http://amzn.to/9TiAiR
2.   エンタープライズアプリケーションアーキテクチャパターン
     http://amzn.to/d0A1v
3.   ビューティフルアーキテクチャ
     http://amzn.to/4Ydjtt
結論
定石を会得せよ
おわり

More Related Content

Viewers also liked

Theres nothing like a good book
Theres nothing like a good bookTheres nothing like a good book
Theres nothing like a good book
Molly Smart
 
Dynamic covered call writing June 2013 - Eden Rahim
Dynamic covered call writing June 2013 - Eden RahimDynamic covered call writing June 2013 - Eden Rahim
Dynamic covered call writing June 2013 - Eden Rahim
sorenk
 
Mid semester exam notes
Mid semester exam notesMid semester exam notes
Mid semester exam notes
Jac
 

Viewers also liked (20)

Theres nothing like a good book
Theres nothing like a good bookTheres nothing like a good book
Theres nothing like a good book
 
What did the samurai do and believe
What did the samurai do and believeWhat did the samurai do and believe
What did the samurai do and believe
 
Teaser swimathon
Teaser swimathonTeaser swimathon
Teaser swimathon
 
A town-like-alice by navil shute
A town-like-alice by navil shuteA town-like-alice by navil shute
A town-like-alice by navil shute
 
Jeopardy verbs
Jeopardy verbsJeopardy verbs
Jeopardy verbs
 
Engage 2011.1rev
Engage 2011.1revEngage 2011.1rev
Engage 2011.1rev
 
Unit 4, Lesson 1
Unit 4, Lesson 1Unit 4, Lesson 1
Unit 4, Lesson 1
 
SPIW03 Taking the Geek out of SharePoint Project Governance
SPIW03 Taking the Geek out of SharePoint Project GovernanceSPIW03 Taking the Geek out of SharePoint Project Governance
SPIW03 Taking the Geek out of SharePoint Project Governance
 
भुकम्प प्रभावित संरचना पुननिर्माण ऐन २०७२
भुकम्प प्रभावित संरचना पुननिर्माण ऐन २०७२भुकम्प प्रभावित संरचना पुननिर्माण ऐन २०७२
भुकम्प प्रभावित संरचना पुननिर्माण ऐन २०७२
 
Treating traumatic stress injuries presentation 4-5-13-rev
Treating traumatic stress injuries presentation   4-5-13-revTreating traumatic stress injuries presentation   4-5-13-rev
Treating traumatic stress injuries presentation 4-5-13-rev
 
Transforming india by er krishan khanna a guideline for making india economic...
Transforming india by er krishan khanna a guideline for making india economic...Transforming india by er krishan khanna a guideline for making india economic...
Transforming india by er krishan khanna a guideline for making india economic...
 
Paket b 2012
Paket b 2012Paket b 2012
Paket b 2012
 
Sleep Medicine for Ortho-Pedo Residents
Sleep Medicine for Ortho-Pedo ResidentsSleep Medicine for Ortho-Pedo Residents
Sleep Medicine for Ortho-Pedo Residents
 
Dynamic covered call writing June 2013 - Eden Rahim
Dynamic covered call writing June 2013 - Eden RahimDynamic covered call writing June 2013 - Eden Rahim
Dynamic covered call writing June 2013 - Eden Rahim
 
How To Present A Point Powerfully
How To Present A Point PowerfullyHow To Present A Point Powerfully
How To Present A Point Powerfully
 
Unit 4, Lesson 2
Unit 4, Lesson 2Unit 4, Lesson 2
Unit 4, Lesson 2
 
Experiences of decentralized management of rural infras dev in nepal by bhim ...
Experiences of decentralized management of rural infras dev in nepal by bhim ...Experiences of decentralized management of rural infras dev in nepal by bhim ...
Experiences of decentralized management of rural infras dev in nepal by bhim ...
 
Mid semester exam notes
Mid semester exam notesMid semester exam notes
Mid semester exam notes
 
WordPress San Diego Meetup - Sharing Made Easy
WordPress San Diego Meetup - Sharing Made EasyWordPress San Diego Meetup - Sharing Made Easy
WordPress San Diego Meetup - Sharing Made Easy
 
2011 IABC Europe & Middle East AGM
2011 IABC Europe & Middle East AGM2011 IABC Europe & Middle East AGM
2011 IABC Europe & Middle East AGM
 

Similar to Howtoよいデザイン

デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 1: openFrameworks入門
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 1: openFrameworks入門デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 1: openFrameworks入門
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 1: openFrameworks入門
Atsushi Tadokoro
 
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
Atsushi Tadokoro
 
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
Hiroh Satoh
 
2010 icse-an analysis of the variability in forty preprocessor-based software...
2010 icse-an analysis of the variability in forty preprocessor-based software...2010 icse-an analysis of the variability in forty preprocessor-based software...
2010 icse-an analysis of the variability in forty preprocessor-based software...
n-yuki
 
わんくまT78 mfcを始めようとしてみた
わんくまT78 mfcを始めようとしてみたわんくまT78 mfcを始めようとしてみた
わんくまT78 mfcを始めようとしてみた
伸男 伊藤
 
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
Tadayoshi Sato
 

Similar to Howtoよいデザイン (20)

デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 1: openFrameworks入門
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 1: openFrameworks入門デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 1: openFrameworks入門
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 1: openFrameworks入門
 
Visual Studioで始めるTypeScript開発入門
Visual Studioで始めるTypeScript開発入門Visual Studioで始めるTypeScript開発入門
Visual Studioで始めるTypeScript開発入門
 
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
 
自己紹介とC# Devkitについて.pptx
自己紹介とC# Devkitについて.pptx自己紹介とC# Devkitについて.pptx
自己紹介とC# Devkitについて.pptx
 
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
 
20221226_TITECH_lecture_ishizaki_public.pdf
20221226_TITECH_lecture_ishizaki_public.pdf20221226_TITECH_lecture_ishizaki_public.pdf
20221226_TITECH_lecture_ishizaki_public.pdf
 
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
 
2010 icse-an analysis of the variability in forty preprocessor-based software...
2010 icse-an analysis of the variability in forty preprocessor-based software...2010 icse-an analysis of the variability in forty preprocessor-based software...
2010 icse-an analysis of the variability in forty preprocessor-based software...
 
CMSI計算科学技術特論C (2015) 可読性と性能の両立を目指して
CMSI計算科学技術特論C (2015) 可読性と性能の両立を目指してCMSI計算科学技術特論C (2015) 可読性と性能の両立を目指して
CMSI計算科学技術特論C (2015) 可読性と性能の両立を目指して
 
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
 
わんくまT78 mfcを始めようとしてみた
わんくまT78 mfcを始めようとしてみたわんくまT78 mfcを始めようとしてみた
わんくまT78 mfcを始めようとしてみた
 
ソフトウェア設計原則【SOLID】を学ぶ #2 インターフェイス分離の原則.pdf
ソフトウェア設計原則【SOLID】を学ぶ #2 インターフェイス分離の原則.pdfソフトウェア設計原則【SOLID】を学ぶ #2 インターフェイス分離の原則.pdf
ソフトウェア設計原則【SOLID】を学ぶ #2 インターフェイス分離の原則.pdf
 
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
 
Visual Studio Code でプログラムをデバッグしよう!
Visual Studio Code でプログラムをデバッグしよう!Visual Studio Code でプログラムをデバッグしよう!
Visual Studio Code でプログラムをデバッグしよう!
 
AndroidでDIxAOP
AndroidでDIxAOPAndroidでDIxAOP
AndroidでDIxAOP
 
KOGEI & KAIT Funnel WS
KOGEI & KAIT Funnel WSKOGEI & KAIT Funnel WS
KOGEI & KAIT Funnel WS
 
.NETラボ2021年10月 .NETの過去と現在
.NETラボ2021年10月 .NETの過去と現在.NETラボ2021年10月 .NETの過去と現在
.NETラボ2021年10月 .NETの過去と現在
 
PHP基礎勉強会
PHP基礎勉強会PHP基礎勉強会
PHP基礎勉強会
 
The Twelve-Factor (A|M)pp with C#
The Twelve-Factor (A|M)pp with C#The Twelve-Factor (A|M)pp with C#
The Twelve-Factor (A|M)pp with C#
 
Node.js Tutorial at Hiroshima
Node.js Tutorial at HiroshimaNode.js Tutorial at Hiroshima
Node.js Tutorial at Hiroshima
 

Howtoよいデザイン