関数内の条件分岐を上へ移動
- 関数内に
if 条件分岐があるなら、それを呼び出し側(caller)へ移すことを検討する。
- 関数が前提条件を内部で確認し、条件を満たさないときに「何もしない」のではなく、呼び出し側が前提条件を確認することで、型によって前提条件が満たされていることを保証する。
- 前提条件をとくに「上へ移動」すると、全体として確認作業を減らせることがあり、これがこのルールの動機の一つである。
ループを下へ移動
- データ指向の発想から生まれたルールで、オブジェクトの「バッチ(batch)」という概念を導入し、バッチ処理を基本ケースとし、スカラ版をバッチ版の特殊ケースとして扱う。
- 主な利点は性能向上であり、開始コストを分散でき、処理順序にも柔軟性を持たせられる。
- たとえば、FFT ベースの多項式乗算では、複数の点で同時に多項式を評価するほうが、個別に評価するより速いことがある。
GN⁺の意見
- この記事で最も重要なのは、ソフトウェア開発で性能とコードの明快さを高めるための 2 つのプログラミング規則、「条件分岐を上へ移動」と「ループを下へ移動」である。
- これらの規則は、コードの可読性を高め、性能を最適化し、バグの発生可能性を減らすのに役立つ。
- ソフトウェアエンジニアリングの複雑さを管理し、効率的なコードを書く方法への洞察を与えるため、この記事は多くの開発者にとって興味深く有益である。
1件のコメント
Hacker Newsの意見
ifとforの配置についてはそれほど気にしなくてよい。forループの順序を誤るだけで、シミュレーションの実行時間が1週間から1時間に短縮されることがある。このような背景を持つ人は、forとifの順序を本能的に最適化する。ifを上に移動させることで関数定義から直接見えなくなるという欠点がある。大規模プロジェクトでは、このような関数が意図した文脈の外で再利用され、バグを引き起こす可能性がある。契約フレームワークを使うのも一つの解決策だが、契約とコードの両方に条件を二重に書かなければならない。ifは関数の末尾ではなく先頭に置かれるべきであり、エラーは適切に伝播されるべきだ。forループとif文はどちらも制御フロー演算であり、記事の一部の主張は意味をなしていないように見える。性能に関する主張が最も強いが、一般的な助言としては最後に考慮すべき懸念事項だ。walrusに依存することが多いため、ifを上に移動できない。ifを呼び出し側に移すのはひどいアイデアだという意見がある。特殊な場合には良い考えかもしれないが、一般的には望ましくない。ライブラリでは外部境界で事前条件を確認し、内部実装が内部の仮定なしに進められるようにすべきだ。呼び出し側の確認に依存すると、その目的が失われる。