0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

可読性の良い実装①【関数化ってどうやるの】

Posted at

きっかけ

こんな実装は嫌だ

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も書きやすいと思う
  • 実装を途中で他の人に投げる時も、依頼しやすいはず

レビュー依頼例

  1. 処理の流れが正しいか確認

    function A() {
         // やること①
    
         // やること②
    
         // やること③
    
         return mock
    }
    
    function UnitTestA() {
        // 正常系
        a = A()
        assert a mock
    }
    
  2. やること①の処理の流れが正しいか確認

    function A() {
         // やること①
         b = AB()
    
         // やること②
    
         // やること③
    
         return mock
    }
    
    function AB() {
        // やること①-1
        // やること①-2
        // やること①-3
        return mock
    }
    
    function UnitTestAB() {
        // 正常系
        b = AB()
        assert b mock
    }
    
  3. やること①-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
    }
    
  4. やること①-2を実装

    function AB() {
        // やること①-1
        ・・・
    
        // やること①-2
        ・・・
        ・・・
        ・・・
    
        // やること①-3
    
        return mock
    }
    
    function UnitTestAB() {
        // やること①-1でreturnするケース
        ・・・
    
        // やること①-2でreturnするケース
        b21 = AB()
        assert b1 error21
    
        b22 = AB()
        assert b1 error22
    
        // 正常系
        ・・・
    }
    
  5. やること①-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行以内」とかコーディング規約に行数制限がある場合には、別途工夫が必要(継承とか・・・)
0
2
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
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?