ホームページ  >  記事  >  バックエンド開発  >  If ステートメントを使用しないプログラミング例

If ステートメントを使用しないプログラミング例

小云云
小云云オリジナル
2018-02-01 14:27:442107ブラウズ

今後は、私たちのビジネスを実装する際に if ステートメントを使用しないようにしてください。

if を使用しないことでどのようなメリットがあるのか​​疑問に思うかもしれません。そうですね~、明らかなメリットはなく、考え方を変えて問題を解決するだけかもしれません。 if-else に問題はありませんが、場合によっては、if-else の数が多いとコードが読みにくくなる可能性があります。以下に、その謎を感じるのに役立ついくつかの例を示します。

コーディングのヒント: if ステートメントを使用せずにコーディングしてみてください

If ステートメントを使用しないプログラミング例

課題 #1: 数値配列内に奇数がいくつあるか数えてください

整数型の配列が与えられた場合、その中の奇数の数を数えますarray

const arrayOfIntegers = [1, 4, 5, 9, 0, -1, 5];

if実装

let counter = 0;
arrayOfIntegers.forEach((integer) => {
  const remainder = Math.abs(integer % 2);
  if (remainder === 1) {
    counter++;
  }
});
console.log(counter);

Non-if実装

let counter = 0;
arrayOfIntegers.forEach((integer) => {
  const remainder = Math.abs(integer % 2);
  // 偶数除2的余数为零,奇数的余数为一
  counter += remainder;
});
console.log(counter);

注: 上記の 2 つの例では、forEach は元の配列を変更し、メソッドは variable であり、現在の関数型プログラミングに違反します。 不変の概念については心配しないでください。この記事の焦点では​​ありません。 2 つの例を比較すると、if ステートメント の実装の方が互換性が高く、配列要素が 10 進数 である状況にも適応できます。配列要素が浮動小数点型の場合、2 番目の例は正しく動作しません。 可变的,违背了当下所提倡的函数式编程immutable理念,不用在意,不是本文关注点。两个例子比较而言,if语句的实现可能更具兼容性,可以适应于数组元素是小数的情况。若数组元素为浮点类型,第二个例子就无法正常使用。

Challenge #2: 判断一个日期是周末还是工作日

实现一个函数,日期对象 new Date()作为输入,根据不同日期返回当天是工作日还是周末

if实现

const weekendOrWeekday = inputDate => {
  const day = inputDate.getDay();
  if (day === 0 || day === 6) {
    return 'weekend';
  }

  return 'weekday';
  // Or, for ternary fans:
  // return (day === 0 || day === 6) ? 'weekend' : 'weekday';
};
console.log(weekendOrWeekday(new Date()));

非if实现

const weekendOrWeekday = (inputDate) => {
  const day = inputDate.getDay();
  return weekendOrWeekday.labels[day] ||
         weekendOrWeekday.labels['default'];
};
weekendOrWeekday.labels = {
  0: 'weekend',
  6: 'weekend',
  default: 'weekday'
};
console.log(weekendOrWeekday(new Date()));

有没有注意到,if语句中的数字代表哪天是周末,判定条件分布的较为零散,我们需要做的是将数字和周末或工作日类型对应起来,如例子2,可以使用一个对象或者map来存储对应关系。

上述两个例子对比,可以明显看出非if代码实现具有更好的可读性和扩展性

Challenge #3: The doubler function (here be dragons),翻译不出来~尬~

实现一个doubler函数,根据输入不同,做如下处理:

  1. 若输入是number类型, 做翻倍处理(5 => 10, -10 => -20)

  2. 若输入是string类型,重复每个字符('hello' => 'hheelloo')

  3. 若输入是function类型,调用执行两次函数

  4. 若输入是array类型,对数组的每个元素做doubler处理

  5. 若输入是object类型,对对象的每个属性做doubler处理

switch实现

const doubler = (input) => {
  switch (typeof input) {
    case 'number':
      return input + input;
    case 'string':
      return input
        .split('')
        .map(letter => letter + letter)
        .join('');
    case 'object':
      Object.keys(input)
            .map(key => (input[key] = doubler(input[key])));
      return input;
    case 'function':
      input();
      input();
  }
};
console.log(doubler(-10));
console.log(doubler('hey'));
console.log(doubler([5, 'hello']));
console.log(doubler({ a: 5, b: 'hello' }));
console.log(
  doubler(function() {
    console.log('call-me');
  }),
);

switch实现

const doubler = (input) => {
  return doubler.operationsByType[typeof input](input);
};
doubler.operationsByType = {
  number: (input) => input + input,
  string: (input) =>
    input
      .split('')
      .map((letter) => letter + letter)
      .join(''),
  function: (input) => {
    input();
    input();
  },
  object: (input) => {
    Object.keys(input)
          .map((key) => (input[key] = doubler(input[key])));
    return input;
  },
};
console.log(doubler(-10));
console.log(doubler('hey'));
console.log(doubler([5, 'hello']));
console.log(doubler({ a: 5, b: 'hello' }));
console.log(
  doubler(function() {
    console.log('call-me');
  }),
);

和Challenge #2类似,将条件值聚合在一起做统一处理。

总结

if-else的判断条件较多时,将条件做集中处理(用object存储其对应关系--条件做key,处理做value)。好处是增删某个条件变得容易,代码更加可读,提倡使用key-value对应来取代一部分的if-else

課題 #2: 日付が週末か営業日かを判断する


日付オブジェクト new Date() を入力として受け取り、その日が であるかどうかを返す関数を実装します。別の日付に基づく営業日 > まだ週末です。

if実装rrreee非if実装

rrreee

if文内の数字は週末を表しており、判定条件の分布が比較的分散していることに気づきましたか。必要なのは、数値を結合することです。例 2 のように、weekend または Weekday タイプに対応させるには、オブジェクトまたはマップを使用して、対応する関係を保存できます。 上の 2 つの例を比較すると、non-if code 実装の方が可読性とスケーラビリティが優れていることが明確にわかります

課題 #3: doubler 関数 (ここではドラゴン)、翻訳は次のとおりです。出てこない~気まずい~ doubler 関数を実装し、さまざまな入力に応じて次の処理を実行します:

  1. 🎜 入力が number 型の場合、Double 処理を実行します (5 => 10、-10 => -20)🎜
  2. 🎜 入力が string 型の場合、各文字を繰り返します('hello' => ; 'hheelloo')🎜
  3. 🎜 入力が function 型の場合、関数を 2 回呼び出して実行します🎜
  4. 🎜入力が array code> タイプの場合、配列の各要素に対して <code>doubler 処理を実行します🎜
  5. 🎜入力が object タイプ、オブジェクトの各属性に対して <code>doubler 処理を実行します code>doubler は 🎜
🎜switch 実装を処理します🎜rrreee 🎜非 switch 実装🎜rrreee🎜 課題 #2 と同様に、条件値が統合処理のために集約されます。 🎜🎜まとめ🎜🎜 if-else の判定条件が多い場合、条件を一元的に処理します(対応関係をオブジェクトに格納し、条件をキーにして処理を行います)値)。利点は、特定の条件の追加または削除が簡単になり、コードが読みやすくなることです。if-elsekey-value 対応を使用することをお勧めします。 /code> 条件判定。 🎜🎜関連する推奨事項: 🎜🎜🎜🎜 if ステートメントの現状、展望、機会について話す🎜🎜🎜🎜 PHP に基づく elseif ステートメントのコード例の概要🎜🎜🎜🎜 SQL の if ステートメントの詳細な説明🎜🎜

以上がIf ステートメントを使用しないプログラミング例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。