F(x)
をG(x)
を呼び出す関数とすると、x
は0より大きくなければなりません。G
がすでにassert(x > 0)
を実行している場合は、 F
それもしますか?
F
とG
がクラスの関数である場合、外部から呼び出すことができるパブリックメソッドに検証を配置できます。
G
がビジネスをスタンドアロンで実行する関数であり、F
がx> 0でもx <= 0でもかまわない場合、このアサーションをG
に置くことができます。 F
をチェックする必要はありません。
F
とG
がまったく異なるレイヤー関数であり、F
がxを考慮する必要がある場合は、このアサーションをF
とG
の両方に配置します。
恐らく。詳細はプログラミング言語とパフォーマンスの制約によって異なりますが、一般的に呼び出し元はGが存在することを知らない可能性があるため、Fからエラーを受け取り、できるだけ早くエラーを受け取ることをお勧めします。
ただし、これがJavaの場合は、アサート(デフォルトでは無効)で事前条件をチェックするのではなく、通常のif
でチェックする必要があります。
F(x)が負のxを受け取ることが意味をなさない場合は、F(x)でxが厳密に正であることを表明する必要があります。一方、F(x)内でxが負またはnullであることは理にかなっている場合は、ロジックのみをF(x) G(x)が無効なxで呼び出されるのを防ぎます。
多分、しかし最後の手段としてのpossilby。
最善の解決策は、f以外の型にコントラクトをカプセル化することです...ただし、int> 0の型は、多くの型システムで作成することは不可能または困難です。 (あなたは本当に依存型の領域に入り込んで型システムでこれを指定していますが、HaskellはGADTでそれを行うことができると思います)
2番目の最適なソリューションは、通常の条件で前提条件をチェックすることです。パフォーマンスが必要ない場合、リリースビルド用に最適化された前提条件チェックは本当に必要ありません。
最後の手段は、アサートでチェックすることです。これは、開発中の問題をキャッチしますが、リリースでは削除されます。