O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

Usp友の会勉強会、ジャクソン構造図の巻(前編)

4.713 visualizações

Publicada em

  • Seja o primeiro a comentar

Usp友の会勉強会、ジャクソン構造図の巻(前編)

  1. 1. やわらかマッドサイエンティスツのプログラミング入門3つのダイアログから見たプログラミング第2回 ジャクソン構造図の巻 USP友の会会員 鳥海秀一
  2. 2. 自己紹介名前:鳥海秀一出身地:北海道年齢:47歳初めて買ったコンピュータ:PC-1245職業:SIerのBPとして、金融機関で働いてます趣味:プログラミング言語の習得USP友の会との関わり: 「アジャイルジャパン2009」の當仲講演から
  3. 3. 本日の予定1. USP友の会の紹介(10分)2. アイスブレイク(一言自己紹介)(30分)3. 前回の振り返り(15分)4. 講義1(状態遷移図とその限界)(40分)5. 講義2(ジャクソン構造図の紹介) (30分)6. 演習(1時間ぐらい)7. まとめ(15分)
  4. 4. 自己紹介をお願いします下記の内容を含めてください① お名前とご出身と現在お住まいの場所② ご職業と今やっていること③ この勉強会に参加しようと思ったわけ1分間でお願いします。
  5. 5. 前回の振り返り1. プログラム入門でダイアログを 取り上げる理由について2. 状態遷移図の振り返り
  6. 6. プログラム入門でダイアログを取り上げる理由プログラムの作成には事前の設計が大切• 設計は二つのプロセスから構成される – 発散 – 収束• 発散には概要把握と視点の切り替えが必要• ダイアログは上記二つを提供する
  7. 7. 3つのダイアログが提供する3つの視点• 状態遷移図 状態遷移(計算モデル)• ジャクソン構造図 データの構造• データフローダイアグラム データの流れ
  8. 8. 前回の勉強会の最後- フォーマルな書き方 ・次回へ 想定以上の良い振り!! より一層力をいれねば!!
  9. 9. ジャクソン構造図の解説前後2回やります。• 前半 状態遷移図の問題からジャクソン構造図へ• 後半 ジャクソン構造図の可能性と限界
  10. 10. 状態遷移図の振り返り前回の資料を参照http://www.slideshare.net/ryuichiueda/usp-9642558
  11. 11. 状態遷移図の問題素直にプログラムに変換すると可読性の低いプログラムとなる
  12. 12. 状態遷移図からプログラムを作成する方法• P.J.プローガーの評価 これで、どうしてボトムアップ手法の評判がよくない かが分かったと思う。この設計手法では、冗長なプ ログラム・カウンタ、未構造化プログラム、GOTO文 の使用を勧めていることになるからである。これで は不評を買うのも無理はない。 『プログラミングの壺Ⅰ』より
  13. 13. 例題:整数判定の状態遷移図 0~9 0~9 0~9 EOS +|-開始 S0 S1 S2 S3 その他 その他 その他 S4
  14. 14. 例題を素直にプログラムにすると#!/usr/bin/perl s1: s3: $c = shift @c; exit 0;@c = split //, shift; if (0 le $c && $c le 9) { goto s2; s4:s0: } else { exit 1;$c = shift @c; goto s4;if ($c eq + || $c eq -) { } goto s1;} elsif (0 le $c && $c le 9) { s2: goto s2; $c = shift @c;} else { if (0 le $c && $c le 9) { goto s4; goto s2;} } elsif ($c eq ) { goto s3; } else { goto s4; }
  15. 15. 可読性が低い理由 やっぱり…gotoが問題?
  16. 16. gotoを取り除く方法2種類あります。1. 系統的な方法2. 発見的な方法
  17. 17. gotoを取り除く系統的な方法1. 状態変数(フラグ)を導入する。2. 状態変数を初期化する。3. 処理全体を無限ループで囲う4. goto先で行われる処理を状態変数に 対する判定文で囲う5. goto文を状態変数への代入文に置き 換える
  18. 18. 実際にやってみると#!/usr/bin/perl if ($s == 1) { if ($s == 3) { $c = shift @c; exit 0;@c = split //, shift; if (0 le $c && $c le 9) { } $s = 2; if ($s == 4) { } else {$s = 0; exit 1; $s = 4;while () { } }if ($s == 0) { } } $c = shift @c; if ($s == 2) { if ($c eq + || $c eq -) { $c = shift @c; $s = 1; if (0 le $c && $c le 9) { } elsif (0 le $c && $c le 9){ $s = 2; $s = 2; } elsif ($c eq ) { } else { $s = 3; $s = 4; } else { } $s = 4; } } }
  19. 19. 系統的な方法の問題点可読性が全く向上しない
  20. 20. 実は系統的な方法は…構造化定理が採用した方法です。
  21. 21. 構造化定理とは…任意のgotoを使用したプログラムはそれと同じ結果を計算するような連接構文、条件構文、反復構文という3種類の基本構文と、代入文および補助的な変数に関するテストだけで構成したプログラムに系統的に変形できることを証明した定理。1966年にG.JacopiniとC.Bohmが発表。
  22. 22. 構造化定理に対する識者の評価• E.W. ダイクストラ 機械的にgoto文のないものに変換することは推奨 できない。 『Go To Statement Considered Harmful』より• D.E.クヌース 実用的な見地からは、この定理は意味を持たない。 『文芸的プログラミング』より
  23. 23. 全くの個人的見解ですが…プログラマの視点から評価すると構造化定理とは 構造化プログラミングの議論に 混乱をもたらした無意味な定理 といえると思います。
  24. 24. gotoを取り除く発見的な方法の方針1. 全体的に上から下に処理が流れるように 順番を整理する。2. 上向きのgoto文について反復構文を使っ て同じ処理を実現できないか検討する。3. 下向きのgoto文について以下を検討する。 – ジャンプ先の処理で置き換えられないか。 – 条件構文を使って同じ処理を実現できないか。4. その他いろいろ考えてみる。
  25. 25. 実際にやってみると#!/usr/bin/perl while (0 le $c && $c le 9) { $c = shift @c;@c = split //, shift; }$c = shift @c; if ($c eq ) {if ($c eq + || $c eq -) { exit 0; $c = shift @c; } else {} exit 1; }if (0 le $c && $c le 9) { $c = shift @c;} else { exit 1;} 読みやすいと思いますがどうですか?
  26. 26. ここで問題 なぜ今回のプログラムは 前回のプログラムより 読みやすいのか 可読性とはなにか?人間とはどういう生き物なのか?
  27. 27. 人間はどういう生き物か?情報の見地からは…人間は五感を通じて情報を収集する生き物
  28. 28. 五感とは• 視覚 眼で感じるもの• 聴覚 耳で感じるもの• 嗅覚 鼻で感じるもの• 味覚 舌で感じるもの• 触覚 皮膚で感じるもの情報収集の際に一番よく使うのは?
  29. 29. 視覚で感じるもの• 光の明るさ• 光の色• 光の位置最も頼りにしているのは?
  30. 30. 人間はどういう生き物か?光の位置から情報を収集するのを得意とする生き物 ※注意 鳥海仮説
  31. 31. 位置を利用した情報の表現例(1)1. 表2. グラフ3. 楽譜4. アラビア数字5. ダイアグラム
  32. 32. 位置を利用した情報の表現例(2)
  33. 33. 位置を利用した表現例(3)実は… 構造化プログラムも それに該当します。
  34. 34. E.W.ダイクストラが書いていることプログラムのテキストを通じてその計算を(知的に)制御するのが私達の義務であると認めるならば、私達は、謙虚になって、“計算における進行”が“プログラムのテキストにおける進行”に直接的に写像することを保証する最も系統的な制御の機構だけを用いるべきなのです。 『構造化プログラム』より
  35. 35. gotoやフラグを使うと可読性が低くなる理由何が書かれているかだけでなく、それがどこに書かれているかからも人間は情報を吸収する。位置情報を処理内容を表現するのに活用するとプログラムは可読性が高くなる。gotoやフラグを使用すると位置情報が利用できなくなるため可読性が低くなる。
  36. 36. 可読性の高いプログラムを作成するには ジャクソン構造図を利用すると それがわりと楽にできます
  37. 37. ここで休憩です
  38. 38. ジャクソン構造図とはデータの構造に注目してプログラムを作成する技法であるJSP法の中でデータの構造を記述するために使うダイアグラム
  39. 39. 注目するのは入力データか出力データか?答えより複雑な方に注目する。
  40. 40. 入出力データともに複雑な場合は?答え1. 両者が似ている場合 入出力のデータ構造を足し合わせる。2. 両者が似ていない場合 単純な構造を持つ中間データを設け、 プログラムを2つに分解する。
  41. 41. 分割の方法 複雑な 複雑な 入力データ 処理 出力データ 複雑な 単純な 複雑な入力データ 処理1 中間データ 処理2 出力データ
  42. 42. ジャクソン構造図は次の3つの基本構造でデータを記述する• 連接• 選択• 反復
  43. 43. ジャクソン構造図による連接の表現 A B C D Aは、BとCとDからなる
  44. 44. ジャクソン構造図の連接の例 名前 年月日姓 名 年 月 日
  45. 45. ジャクソン構造図による選択の表現 A B C D Aは、BかCかDである
  46. 46. ジャクソン構造図による選択の表現(補足1) A B C -Aは、BかCか存在しないかである
  47. 47. ジャクソン構造図による選択の表現(補足2) (省略形) A A B - B Aは、Bか存在しないかである
  48. 48. ジャクソン構造図の選択の例 人 年金 国民 厚生 共済男 女 年金 年金 年金
  49. 49. ジャクソン構造図による反復の表現 A * B Aは、複数のBからなる
  50. 50. ジャクソン構造図の反復の例 テキストプロジェクト ファイル * *プロジェクト 行 メンバー
  51. 51. ジャクソン構造図の注意点(その1)1つの頂点から分岐する枝の先の構造は連接、選択、反復のいずれか一つに限る 資料 資料 * 資料表表紙 本文 裏表紙 表表紙 本体 裏表紙 * ※ 理由はわかりません 本文
  52. 52. ジャクソン構造図の注意点(その2)反復の記法は0個以上任意の個数という意味(例)Aが1個以上のBからなる場合の記法 A B A本体 * B
  53. 53. 余談:ER図を利用しても同じことができますIDEF1Xでの例 連接 選択 反復 A A A 1 1 1 1 B C B C B
  54. 54. ジャクソン構造図による整数表現 整数 符号 絶対値 ○ ○ 明示符号 暗示符号 1文字目 2文字目 数字 以降数字群 ○ ○ ○ ○ ○ *+ - なし 0 … 9 数字 ○ ○ ○ 0 … 9
  55. 55. ジャクソン構造図による整数表現(省略形) 整数 符号 絶対値 ○ 1文字目 2文字目 + or - 数字 以降数字群 * 0~9 0~9 ※注意 鳥海アレンジ
  56. 56. ジャクソン構造図をプログラムに変換する方法1. 連接は連接文に置き換える。2. 選択は選択文に置き換える。3. 反復は反復文に置き換える。4. 処理を適宜追加する。
  57. 57. 実際にやってみると#!/usr/bin/perl while (0 le $c && $c le 9) { $c = shift @c;@c = split //, shift; }$c = shift @c; if ($c eq ) {if ($c eq + || $c eq -) { exit 0; $c = shift @c; } else {} exit 1; }if (0 le $c && $c le 9) { $c = shift @c;} else { exit 1;} 先ほどと同じプログラムになります
  58. 58. 結論ジャクソン構造図を利用すると 可読性の高いプログラムが わりと楽に作成できます
  59. 59. 演習問題1食事のジャクソン構造図を描け。ここで食事は次のような案内により定義されている。食事を楽しんでいただけることを期待します。前菜は好きなものを食べて下さい。次に3種類のスープからうまいものを選び、ロールパンとバター、それに冷菜は幾皿でもおとり下さい。食事の終わりには、紅茶かコーヒーがあります。なお、前菜にキャビアをお選びになった方は、残念ながら高価なものですので、キャビアのスープは召し上がらないようにお願い致します。 『構造的プログラム設計の原理』P.43 演習問題2.6(b)より
  60. 60. ここで休憩です
  61. 61. 演習問題1解答例 食事 前菜+ メイン 食後の スープ ディッシュ 飲み物 ○ ○ ○ ○ 前菜 前菜 複数の 複数の 複数の 紅茶 コーヒー キャビア 非キャビア 冷菜 パン バター コース コース * * *前菜 スープ 前菜 スープ 冷菜 パン バター ○ ○ ○ ○ ○ ○ ○ ○ ○キャビア キャビア キャビア キャビア キャビア キャビアの キャビア キャビア 以外の 以外の 以外の 以外の … キャビア 以外の スープ 以外の 以外の スープ1 スープ2 前菜1 前菜2 前菜n スープ1 スープ2
  62. 62. 演習問題2浮動小数点数のジャクソン構造図を描け。ここで浮動小数点数は次の状態遷移図により定義されている。
  63. 63. 演習問題2(資料1) 0~9 E|e 0~9 0~9 0~9 0~9 +|- 0~9 ・ E|e +|- 0~9開始 S0 S1 S2 S4 S5 S6 S7 EOS ・ EOS ・ 0~9 S3 EOS OK
  64. 64. 演習問題2(ヒント) 浮動 小数点数仮数部 指数部
  65. 65. ここで休憩です
  66. 66. 演習問題2解答例 浮動 小数点数 仮数部 指数部 ○ 符号 絶対値 省略可能 指数部 ○ ○ ○+ or - 整数部付 小数部のみ 指数文字 指数 絶対値 絶対値 整数部 小数部 小数部 E or e 符号 整数部 ○ ○ 1文字目 2文字目 省略可能 小数点 小数 + or - 1文字目 2文字目 数字 以降数字群 小数部 数字 以降数字群 * * 0~9 0~9 小数点 小数 ・ 1文字目 2文字目 0~9 0~9 数字 以降数字群 * * ・ 0~9 0~9 0~9
  67. 67. まとめ(その1)1. 状態遷移図を素直にプログラムに変 換すると可読性の低いプログラムにな りやすい2. 構造化プログラムとは位置に情報をも たせることで可読性を高めようとする プログラミングスタイル(でもある)
  68. 68. まとめ(その2)3. ジャクソン構造図をもとにプログラムを 作成すると可読性の高いプログラムに なりやすい4. 状態遷移図から作成したプログラムを 整理するとジャクソン構造図から作成 したプログラムに近づいていく
  69. 69. 補足 チョムスキーの言語階層言語階層 機械 文法 備考タイプ0 チューリングマシン 句構造文法タイプ1 線形有界オートマトン 文脈依存文法 プッシュダウンオートタイプ2 状態遷移図と等価 文脈自由文法 プログラミング言語の階層 ジャクソン構造図と等価 マトンタイプ3 有限オートマトン 正規文法
  70. 70. まとめ(その3)5. 状態遷移図とジャクソン構造図は基本 的に同じものであり相性が良い6. 両者を同時に使うとことでプログラム 作成はさらに容易になる
  71. 71. 家に帰ったらやってみよう1. 身の回りのもので位置を利用して情 報を表現しているものを探してみよう2. 浮動小数点数のジャクソン構造図をプ ログラムに変換してみよう3. 浮動小数点数の状態遷移図からgoto プログラムを書いたのち、発見的手法 でgotoを取り除いてみよう
  72. 72. 参考文献• M.A.ジャクソン(1985/02) 『構造的プログラム設計の原理』 (日本コン ピュータ協会)• 若林糧(2000/03) 『C言語プログラミング演習』 (日経BP社)• 飯泉 純子、大槻 繁(2011/08) 『ずっと受けたかったソフトウェア設計の授 業』 (翔泳社)• E.W.ダイクストラ、C.A.R.ホーア、O.J.ダール(1975/05) 『構造化プログラミン グ』 (サイエンス社)• ドナルド・E. クヌース(1994/03) 『文芸的プログラミング』 (アスキー出版局)• 野口健一郎(1990/05) 『ソフトウェアの論理的設計法』 (共立出版)• P.J. プローガ(1995/09) 『プログラミングの壺〈1〉ソフトウェア設計編』 (共立 出版)• 玉井哲雄(2004/03) 『ソフトウェア工学の基礎』 (岩波書店)• 真野正(2003/03 ) 『実践的データモデリング入門』 (翔泳社)• きだあきら(1995/05) 「特集 Cプログラム設計技法」 『C MAGAZIN 1993 MAY Vol.5 No.5』 (ソフトバンク )
  73. 73. ご清聴ありがとうございました次回へ続きます。

×