Slide 1

Slide 1 text

構造化プログラミング 古くて新しいプログラミング の基本

Slide 2

Slide 2 text

年表 1968年 • goto文は有害である 1969年 • 構造化プログラミング 1972年 • オブジェクト指向

Slide 3

Slide 3 text

年表 1968年 • goto文は有害である 1969年 • 構造化プログラミング 1970年 • リレーショナルデータベース 1971年 • Intel 4004(世界初のマイクロプロセッサ) 1972年 • オブジェクト指向 1972年 • Unix 1972年 • C言語 1974年 • Altair 8800(世界初の個人用コンピュータ)

Slide 4

Slide 4 text

疑問 GOTO文を使わないことがなぜそんなに重要なのか? 最近GOTO文を導入したPHPはダメな言語なのか? オブジェクト指向の3原則はどうして微妙なのか?

Slide 5

Slide 5 text

構造化プログラミング言語

Slide 6

Slide 6 text

構造化 非構造化 構造化 脊椎動物 哺乳類 奇蹄目 鯨偶蹄目 ネコ目 ウサギ目 ゾウ目 霊長目 鳥類 タカ目 ペンギン目 スズメ目 爬虫類 有燐目 魚類 コイ目 フグ目

Slide 7

Slide 7 text

構造化プログラミング 構造化プログラミングではプログラミング言語が持つステートメントを直接 使ってプログラムを記述するのではなく、機能を抽象化した仮想機械を想定 し、その仮想機械が提供する命令群でプログラムを記述する。普通、抽象化 は1段階ではなく階層的である。各階層での実装の詳細は他の階層と隔離さ れており、実装の変更の影響はその階層内のみに留まる。各階層はアプリ ケーションに近い抽象的な方から土台に向かって順序付けられている。この 順序は各階層を設計した時間的な順番とは必ずしも一致しない。 (Wikipedia)

Slide 8

Slide 8 text

構造化プログラミング 適切に関数(メソッド)に分けることです

Slide 9

Slide 9 text

GOTO文 goto文と何の関係が あるのか? goto文を無節操に使 うと、関数分けが不 可能になります。

Slide 10

Slide 10 text

構造化プログラミング以降の世界 GOTO文のない世界 構造化プログラミングが最低限は できている世界

Slide 11

Slide 11 text

構造化の三要素 構造化 順次 反復 分岐

Slide 12

Slide 12 text

順次 DoSomething1(); DoSomething2(); DoSomething3(); DoSomething4(); DoSomething5();

Slide 13

Slide 13 text

順次 DoSomothing1 DoSomothing2 DoSomothing3 DoSomothing4 DoSomothing5

Slide 14

Slide 14 text

反復 for (int i = 0; i < 10; i++) { DoSomething1(); DoSomething2(); DoSomething3(); DoSomething4(); DoSomething5(); }

Slide 15

Slide 15 text

反復 for DoSomothing1 DoSomothing2 DoSomothing3 DoSomothing4 DoSomothing5

Slide 16

Slide 16 text

分岐 if (i <= 2) { DoSomething1(); DoSomething2(); } else { DoSomething3(); DoSomething4(); }

Slide 17

Slide 17 text

分岐 if DoSomothing1 DoSomothing2 else DoSomothing3 DoSomothing4

Slide 18

Slide 18 text

GOTO文があるとどうなるか if (i <= 2) goto a; DoSomething1(); a: DoSomething2();

Slide 19

Slide 19 text

増えてくるともうわけ わからなく メソッドわけが不可 能 インデントすらつけら れない

Slide 20

Slide 20 text

去勢されたGOTO文 例外処理 break,continue など 最後以外の return switch

Slide 21

Slide 21 text

GOTO文を使った例外処理 if (!DoSomething1()) goto error; if (!DoSomething1()) goto error; if (!DoSomething1()) goto error; if (!DoSomething1()) goto error; if (!DoSomething1()) goto error; error: Error();

Slide 22

Slide 22 text

構造化例外 try { DoSomething1(); DoSomething2(); DoSomething3(); DoSomething4(); DoSomething5(); } catch(Exception ex) { Error(ex); }

Slide 23

Slide 23 text

CONTINUE,BREAKなど for(int i = 0;i < 10; ++i) { DoSomething1(); if(j <= I * i) { break; } DoSomething2(); }

Slide 24

Slide 24 text

最後以外のRETURN int Func() { for (int j = 0; j < 10; ++j) { for (int i = 0; i < 10; ++i) { DoSomething1(); if (j <= i * i) { return j; } } } return -1; }

Slide 25

Slide 25 text

C#やVISUAL BASICのSWITCH文 switch(i) { case 1: DoSomething1(); break; case 2: DoSomething2(); goto case 3; case 3: DoSomething3(); break; }

Slide 26

Slide 26 text

入れ子になったループ(JAVA) jl oo p: fo r (i nt j = 0; j < 10 ; ++ j) { for (int i = 0; i < 10; ++i) { doSomething1(); if (j <= i * i) { break jloop; } } } jloop:for (int j = 0; j < 10; ++j){ for (int i = 0; i < 10; ++i){ doSomething1(); if (j <= i * i) { break jloop; } } } doSomething3();

Slide 27

Slide 27 text

入れ子になったループ for (int j = 0; j < 10; ++j) { for (int i = 0; i < 10; ++i) { DoSomething1(); if (j <= i * i) { goto jexit; } } } jexit: DoSomething3();

Slide 28

Slide 28 text

PHPのGOTO文は邪悪か? • ブロックに入るgotoは禁止 • C#と同じ ループなどのブロックからの脱出 のみに利用できる • 去勢されている 関数内からのreturnと同じ挙動 • goto濫用するためにあえてループをすべてgotoで書き直したりするなら別だが • いやPHPerならあえてそれをやってくれる、という意見もあるが いくらPHPerでもここからgotoス パゲッティは作れないのでは?

Slide 29

Slide 29 text

構造化で何ができるか

Slide 30

Slide 30 text

構造化プログラミングの提唱 翌1969年、再び開催されたNATOのソフトウェア工学会議に おいて、ダイクストラは「構造化プログラミング(Structured Programming)」という語を提唱した。ダイクストラはこの論 文においてgoto文については触れず、プログラムサイズが 大きくなったとしても正しさを証明できる良く構造化され たプログラム(well-structured programs)、大きなプログラムの 理解を助ける段階的な抽象化(step-wise abstraction)、抽象 データとその操作の抽象文の共同詳細化(joint refinement)につ いて述べた。(出典:Wikipedia)

Slide 31

Slide 31 text

よく構造化されたプログラム F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15

Slide 32

Slide 32 text

よく構造化されたプログラム F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15

Slide 33

Slide 33 text

よく構造化されたプログラム F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15

Slide 34

Slide 34 text

よく構造化されたプログラム F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15

Slide 35

Slide 35 text

段階的な抽象化 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15

Slide 36

Slide 36 text

段階的な抽象化 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15

Slide 37

Slide 37 text

段階的な抽象化 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15

Slide 38

Slide 38 text

抽象データとその操作の抽象文の 共同詳細化 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15

Slide 39

Slide 39 text

抽象データとその操作の抽象文の 共同詳細化 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 D2 D8 D7 D6 D5 D4 D3

Slide 40

Slide 40 text

抽象データとその操作の抽象文の 共同詳細化 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 D2 D8 D7 D6 D5 D4 D3

Slide 41

Slide 41 text

抽象データとその操作の抽象文の 共同詳細化 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 D2

Slide 42

Slide 42 text

抽象データとその操作の抽象文の 共同詳細化 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 D2 D6 D3 D1

Slide 43

Slide 43 text

抽象データとその操作の抽象文の 共同詳細化 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 D2 D6 D3

Slide 44

Slide 44 text

抽象データとその操作の抽象文の 共同詳細化 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 D6 D3

Slide 45

Slide 45 text

抽象データとその操作の抽象 文の共同詳細化 具象 整数 浮動小数点数 足す 掛ける 抽象 会員 店舗 入会する 開店する

Slide 46

Slide 46 text

オブジェクト指向へ

Slide 47

Slide 47 text

オブジェクト指向の三原則 継承 カプセル化 ポリモーフィズム

Slide 48

Slide 48 text

他に必要なものはないのか? 「世の中のすべてのものはオブジェクト」は? 「処理とデータをまとめて扱う」は?

Slide 49

Slide 49 text

年表 1968年 • goto文は有害である 1969年 • 構造化プログラミング 1972年 • オブジェクト指向

Slide 50

Slide 50 text

年表 1968年 • goto文は有害である 1969年 • 構造化プログラミング 1972年 • オブジェクト指向

Slide 51

Slide 51 text

年表 1968年 • goto文は有害である 1969年 • 構造化プログラミング 1972年 • オブジェクト指向

Slide 52

Slide 52 text

オブジェクト指向の三原則 構造化プログラミングの抽象データ型と段 階的詳細化がすでにある状態を前提として、 オブジェクト指向言語に実装する必要があ る言語機能。

Slide 53

Slide 53 text

オブジェクト指向の三原則 構造化プログラミングの理解抜 きに考えていても意味ない概念。

Slide 54

Slide 54 text

最後に 構造化プログラミングの理解は現代でも必要なも のばかりです。 調べておきましょう。