以下のコードは、2で割り切れる数値に対して「is equal」を出力しようとします。
If(!test)then()ではなくif(test)then()でない場合、テストされた条件が「n%2」の場合。以下のコードは、「IF番号が2で割り切れない場合」、「 'number is even'を出力する」と読みますが、これは論理的ではないようです。
より一般的に言えば、条件の指定にIfステートメントを使用するよりも、Unified関数を書くことの利点は何ですか?
どんな助けでも大歓迎です。
function unless(test, then) {
if (!test) then();
}
function repeat(times, body) {
for (var i = 0; i < times; i++) body(i);
}
repeat(5, function(n) {
unless(n % 2, function() {
console.log(n, "is even");
});
// → 0 is even
// → 2 is even
// → 4 is even
これの議論の余地のない利点は、コードが英語に少し似ていることです。「nの2を法とする剰余がゼロでない限り、nが偶数であることをコンソールに記録します。」
私の経験では、これの実際的な結果として、ほとんどのプログラマーは、快適に感じる前に実際にunless()が何をするかを再確認する必要があります。これは標準のJavascriptではないため、Javascriptが使用されているかどうかを知る方法がありません。または== trueまたは=== 0または実装を調べない限り、他の少しずつ異なるテスト。
この原則の私のお気に入りの例はCOBOLです。その言語は英語に似せるために非常に一生懸命努力したので、非プログラマーでもそれを使用することができました...しかし実際には、プログラマーと非プログラマーの両方がそれを扱うことを嫌うようです。
このシナリオのように条件がインラインで提供される場合、利点はありません。変換を簡単に適用して、すべてのケースで適切にそれを無効にすることができます(例:!
前面)、およびunless
を画像から削除すると、読者が知っておくべきことが1つ少なくなります。
あるcould条件がコールバックの形式で提供されている場合に利点があります。例:
function test() { return true; }
function unless(test, then) { if (!test()) then(); }
unless(test, function() { console.log("test failed"); });
この状況では、test
の否定を、onlyIf
を補完する架空の関数unless
に直接渡すことができないため、onlyIf
とunless
を使用すると、コードを読みやすくすることができます。
onlyIf(test, function() { console.log("test passed"); });
これの代わりに:
onlyIf(function() { return !test(); }, function() { console.log("test passed"); });
上記の状況は、test
に伝達する必要がある引数がコールバックに与えられている場合、さらに悪化する可能性があります。