LoginSignup
22
22

More than 5 years have passed since last update.

プログラミング設計に関してのまとめ

Posted at
インクリメンタル設計

インクリメンタルな設計 => インクリメンタル =>  一定の値、単位や数値を「一ずつ増やしていく」ことの形容


インクリメンタルな設計の場合
最低限必要な機能から「すこしずつ」開発を進め、その過程で設計自体も「すこしずつ」進化させていく

適合するケース => アジャイルな開発
・つくりたいものが決まっていない、わからない
・開発チームが開発対象を十分理解していない
・開発対象が複雑で正しい設計を誰もしらない
#TDDの設計思想/流れ

設計思想

テスト駆動開発 Test Driven Development/TDD
価値
・インクリメンタルな設計を促す
・チームに良いリズムを生む
・開発に自信と信頼をもたらす
原則
・実装する前にテストを書く
・問題を放置せずに少しずつ前進する
・大事なのは完璧さよりも自信を持てること

開発の流れ

TDDの場合、RED(失敗)とGREEN(成功)を繰り返し、Refactor(改造)の工程をへて、再度RED(失敗)に移ります。

1 失敗するテストを書く "CASE Red"
・機能の追加
・条件の追加
・バグの再現

2 テストが成功する最小限のコードを書く "CASE Green"

3 動作を保ったまま設計を洗練させる "CASE Refactor"

プログラミング設計の二つの設計要素

・責任の設計 => 静的な設計
インターフェース
問題を最も単純化できるクラスやメソッドの構成は?

名前
責任の内容を端的に表現するには?

・仕事の正しさの設計 => 動的な設計
振舞い
どんな手順でクラスやメソッドを使って処理をしていくか
事前条件と事後条件
ある事前条件で求められる結果 => 事後条件は何か??
TDDは初学者こそ学ぶべき、でも、TDD is Dead??

David Heinemeier Hansson said

The test-first part was a wondeful set of training wheels that taught
me how to think about testing at a deeper lebel, but also some I quickly left behind.

テストファーストは自動車の補助輪のようなもので、テスティングをより深いレベルで考えるやり方を教わる
役にはたったが、私はすぐに補助輪を外してしまった。
YAGNI => You ain't gonna need it => 機能は実際に必要になるまでは追加しない方が良い

・きっと後に必要になるだろう => 90%無駄になる
・予測できない事態に伴う変更に対しては、設計を単純にする事で対処できる
・コードを素早く実装するため、バグを減らすための最適な方法 => あまりコードを書かない事である。
・YAGNIとインクリメンタル設計は親和性が高い

静的設計
BowlingGameクラスの責務の決定
・投球ごとの倒したピンの数を記録する
・スコアを計算する
責務を表現するメソッドの命名
・record_shot(pins)とsocre

動的設計
最も簡単なシナリオを考える
・全投球がガターの時にはスコアが0点になる
実際の手順を考える
・全投球がガター: 20回のrecord_shot(0)
・スコアが0点: socreの戻り値をassert_equalで確認
リファクタリング => 機能 = 振る舞いを変えずに設計を改善する事

How to do?? => ExtractMethod = メソッドの抽出/基本のリファクタ手法

リファクタリング/TDD

コードの「不吉な匂い」をきっかけにおこなう
重複したコード
長すぎるメソッド
多すぎる引数

振る舞いを変えずにコードを修正する
設計の向上、劣化の防止
理解しやすくなる
テストコードも対象となる

参考URL

22
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
22