😝

ifとelseの両方でreturnすると損する…かも

2020/09/29に公開

当たり前ですが

コーディングにおいて大切なことは「正しく動くこと」と「読みやすいこと」です。
あと、「修正しやすいこと」とかも大切ですね。

それをふまえて

わかりやすい命名とか、適切な処理単位だとか、そのへんが最低限度文化的であれば、
あとは各々のポリシーに従って実装するべきです。

ただ、私はコミュ障で陰キャでオタクで普段あんまり喋らないので、
自分のポリシーを伝えて、相手に納得してもらうことはなかなか難しかったりします。

public class Hoge {
    public func testMethod(flg: Bool) -> String {
        if flg {
            return "trueだよ"
        } else {
            return "falseだよ"
        }
    }
    public func testMethod2(flg: Bool) -> String {
        if flg {
            return "trueだよ"
        }
        return "falseだよ"
    }
    public func testMethod3(flg: Bool) -> String {
        guard flg else {
            return "falseだよ"
        }
        return "trueだよ"
    }
}

testMethodtestMethod2testMethod3はすべて同じ挙動です。
flgが持つ意味や、メソッドの目的なんかを考慮して好きに実装していいと思います。
ただ、testMethodの実装パターンを選択してしまうと、ほんの僅かに損するかもしれません。

損するってなんだ

testMethodtestMethod2testMethod3に対してユニットテストを実行します。

    func testExample() throws {
        let target = Hoge()
        target.testMethod(flg: true)
        target.testMethod(flg: false)
        target.testMethod2(flg: true)
        target.testMethod2(flg: false)
        target.testMethod3(flg: true)
        target.testMethod3(flg: false)
    }

実行結果がこちら

なぜtestMethodだけ、カバレッジ率が低いのかというと、
else節の終わり〜メソッドの終わり間の処理無し部分が実行されていないのです。バカバカしい。

if節とelse節の両方でreturnしちゃうと、カバレッジ100%マンに殴り勝てないこともあります。
(客観的数値は主観的ポリシーよりも、たいてい強いので…)
そのような意味で、ごくわずかに、損してしまう…かも😭

Discussion