Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Code Complete 第2版 第2部 第5章 / Code Complete Secon...

Avatar for taroosg taroosg
February 19, 2019

Code Complete 第2版 第2部 第5章 / Code Complete Second Edition Part 02 Chapter 05

Avatar for taroosg

taroosg

February 19, 2019

More Decks by taroosg

Other Decks in Programming

Transcript

  1. 1 / 38 code complete 第2 版 5 章 2019/02/19

    @ 読んだ内容まとめてLT 会#05 @taro_osg
  2. 2 / 38 自己紹介 基本情報 氏名:大杉太郎 仕事:G's ACADEMY FUKUOKA 講師

    年齢:31 出身:茨城 => 北海道 => 東京 => 福岡 好きな技術 javascript (vue.js, firebase, ajax ) PHP (laravel ) その他好きなもの 旅行 写真
  3. 5 / 38 これまでの雑なまとめ 第 1 章:導入 第 2 章:ソフトウェア設計の実感がわかない場合はメタファを使え!

    わかりにくい概念はみんな知っているもので例えると良い. 雑学大事! 第 3 章:アーキテクチャ設計は準備がとっっっても大事 書きたい気持ちはわかるが準備.上司はメタファやデータで殴れ. 変更しやすい計画と明文化を意識! 第 4 章:書くときの考え方 表現したい事を決めて,どう書けばよいかを考える!
  4. 6 / 38 第5 章 コンストラクションにおける設計 5.1 設計の難題 5.2 重要な設計概念

    5.3 構成要素の設計:ヒューリスティクス 5.4 設計のプラクティス 5.5 一般的な設計手法へのコメント 5.6 参考資料 5.7 まとめ
  5. 8 / 38 5.1 設計の難題 「ソフトウェア設計」とは仕様を実物に変化させるための概念, 発想,工夫 偉い人の意見 要求仕様からエラーのない合理的な方法で設計を行うのは無理. その昔,タコマ橋の設計したけどあれはやばかった...

    重量を支えられる構造にしたけど風吹くとか聞いてないし... 科学者はそれまで空気力学を考慮する必要があるとは考えていなかった. 課題を出して,完成直前に課題を変更するようなもの.
  6. 9 / 38 5.1 設計の難題 設計はルーズなプロセス 設計が完成したら明確なものであってほしい. しかし大体ルーズなものになる. 設計がルーズになる理由 いろいろなことを間違えるため.

    良い解決策と悪い解決策の違いが僅かであるため. ただし,設計でいろいろ間違えたほうがコードが完成して修正するよ りまし. => どこまでやれば十分な設計なのか??
  7. 10 / 38 5.1 設計の難題 「設計」は妥協と優先順位の産物 理想のソフトウェアは... 全てのシステムが瞬時に動作. 記憶領域や帯域幅の消費がゼロ. エラーも0

    . 現実は... 無理っす... 設計上の要素を重み付けしてバランスを取る. 時間と要求事項の優先度で設計を選択する.
  8. 13 / 38 5.2 重要な設計概念 本質は複雑性への対処 偶発的な問題:物事が物事であるかどうかに影響しない 車のエンジンをどれにするか.ドアの数をいくつにするか. 現在では解決されている. 本質的な問題:複雑性への対処

    現実世界は複雑. ソフトウェアが対処する現実問題は大きい. 現実が複雑になるのでソフトウェアも複雑になる. => 開発者はプログラム全体を頭に詰め込まず,一度に検討する量を減らせ!
  9. 14 / 38 5.2 重要な設計概念 一度に検討する量を減らす 簡単な問題 * 10 <

    難しい問題 * 1 複雑な問題は簡単な問題に分割し,単純に解決する. 自分が考えているほど人間は優秀ではない.限界を知ろう.
  10. 15 / 38 5.2 重要な設計概念 目指すべき設計 できる限り単純. 保守しやすい. 疎結合. 拡張性.

    再利用性. 高いファンイン.(そのクラスを多くのクラスが使用する) 低いファンアウト.(1 つのクラスが使用する他のクラス数を減らす) 無駄の無さ.(減らせるものがなくなったら完成) 階層化.
  11. 17 / 38 5.2 重要な設計概念 サブシステムのやり取りは水を通すホース ソフトウェア全体に対して,複数のサブシステムが存在する. 業務ルール UI DB

    アクセス ... 何も考えずに設計すると,「多対多」のやり取りが必要になる. ホースのコネクタが多いほど水漏れのリスクが高まる. => 本当にやり取りが必要なのか吟味する. => 循環関係は NG !
  12. 20 / 38 5.3 構成要素の設計:ヒューリスティクス 現実世界のオブジェクト システムが「何をするか」ではなく,「何のために何をするか」を問おう. by 偉い人 現実で実現すべきことについてオブジェクトを意識して考える.

    オブジェクトと属性の特定. 各オブジェクトの目的の特定. 各オブジェクトが他のオブジェクトにできることの特定. パブリック部分とプライベート部分の決定. インターフェイスの定義.
  13. 23 / 38 5.3 構成要素の設計:ヒューリスティクス 見えない情報の取扱 見えない情報の例 ファイルフォーマット データ型 インクリメンタルなパラメータの処理

    エラー対応のコード => 必要な部分を最小限見えるようにした設計を意識する! => 常に「何が隠蔽できるか」を問おう!
  14. 30 / 38 5.4 設計のプラクティス 分割攻略 人間は賢くない. 問題を分ける -> それぞれ反復.

    計画 -> 実行 -> レビュー の繰り返し. どこまで分割すれば良い?? => 分解よりコーディングが楽になるまで!
  15. 31 / 38 5.4 設計のプラクティス トップダウン方式とボトムアップ方式 トップダウン 抽象度の高いクラスをつくる. 作業が進んだら必要に応じてサブクラスを定義. 最初は簡単で後に難しくなる.

    ボトムアップ 具体的な要素を考え,まとめて汎用化する. 最初は難しいが,後から楽できる. => 両者は競合しない.毎回試行錯誤しよう!
  16. 36 / 38 5.5 一般的な手法へのコメント 1990 年代初め:設計過激派(Big Design Up Front

    ) 2000 年代初め:設計不要論 その後:Little Design Up Front, Enough Design Up Front => 設計に正解はない! => 両極端だけは NG !