きっかけ
こんな実装は嫌だ
function A() {
・・・ // 前半は実装
・・・
b = B() // 後半はまるっと別関数
return b
}
function B() {
・・・ // 前半は実装
・・・
c = C() // 後半はまるっと別関数
return c
}
function C() {
・・・
・・・
return c
}
考え方
学校の国語で学んだ「章」と「段落」をイメージすると良い
例
function A() {
// やること①
// やること①-1
// やること①-2
// やること①-3
// やること②
// やること②-1
// やること②-2
// やること②-3
// やること③
// やること③-1
// やること③-2
// やること③-3
return
}
↓
function A() {
// やること①
AB()
// やること②
AC()
// やること③
AD()
return
}
// やること①
function AB() {
// やること①-1
// やること①-2
// やること①-3
}
// やること②
function AC() {
// やること②-1
// やること②-2
// やること②-3
}
// やること③
function AD() {
// やること③-1
// やること③-2
// やること③-3
AD3()
}
// やること③-3
function AD3() {
// ・・・
}
メリット
- レビュー依頼の分割がしやすく、かつ、レビュー品質が上がる
- UnitTestも書きやすいと思う
- 実装を途中で他の人に投げる時も、依頼しやすいはず
レビュー依頼例
-
処理の流れが正しいか確認
function A() { // やること① // やること② // やること③ return mock }
function UnitTestA() { // 正常系 a = A() assert a mock }
-
やること①の処理の流れが正しいか確認
function A() { // やること① b = AB() // やること② // やること③ return mock } function AB() { // やること①-1 // やること①-2 // やること①-3 return mock }
function UnitTestAB() { // 正常系 b = AB() assert b mock }
-
やること①-1を実装
function AB() { // やること①-1 ・・・ ・・・ ・・・ // やること①-2 // やること①-3 return mock }
function UnitTestAB() { // やること①-1でreturnするケース(エラーとか。) b11 = AB() assert b1 error11 b12 = AB() assert b1 error12 // 正常系 b = AB() assert b mock }
-
やること①-2を実装
function AB() { // やること①-1 ・・・ // やること①-2 ・・・ ・・・ ・・・ // やること①-3 return mock }
function UnitTestAB() { // やること①-1でreturnするケース ・・・ // やること①-2でreturnするケース b21 = AB() assert b1 error21 b22 = AB() assert b1 error22 // 正常系 ・・・ }
-
やること①-3を実装
function AB() { // やること①-1 ・・・ // やること①-2 ・・・ // やること①-3 ・・・ ・・・ ・・・ return b }
function UnitTestAB() { // やること①-1でreturnするケース ・・・ // やること①-2でreturnするケース ・・・ // やること①-2でreturnするケース b21 = AB() assert b1 error21 b22 = AB() assert b1 error22 // 正常系 ・・・ }
デメリット
- 「1関数100行以内」とかコーディング規約に行数制限がある場合には、別途工夫が必要(継承とか・・・)