Мы можем очистить наш код JavaScript, чтобы нам было легче работать с ними.

В этой статье мы рассмотрим некоторые идеи рефакторинга, которые имеют отношение к очистке условных выражений JavaScript.

Ввести утверждение

Мы можем добавить утверждения, чтобы проверить переданные параметры, добавив утверждения.

Таким образом, предположения становятся явными.

Например, мы можем написать следующее, чтобы добавить утверждение:

const assert = require('assert');
const foo = (val) => {
  assert.equal(val, 50);
  //...
}

Приведенный выше код работает для Node.js, поскольку он использует модуль assert в Node.js.

Прежде чем продолжить, мы проверяем, равно ли val 50. Если утверждение ложно, функция завершится.

Переименовать метод

Если название нашего метода недостаточно ясное, мы должны переименовать его, чтобы было понятнее.

Например, вместо написания:

class Person {
  ga() {
    //...
  }
}

Мы пишем:

class Person {
  getAge() {
    //...
  }
}

getAge намного понятнее, чем ga, поэтому нам следует переименовать его.

Добавить параметр

Мы также можем добавлять параметры в методы. Например, вместо написания:

class Person {
  getContact() {
    //...
  }
}

Мы пишем:

class Person {
  getContact(date) {
    //...
  }
}

Мы добавили параметр date, чтобы упростить получение желаемого.

Отдельный запрос от модификатора

Если у нас есть метод, который возвращает значение и изменяет состояние объекта, мы должны разбить их на отдельные методы.

Таким образом, каждый из них делает только одно.

Например, вместо того, чтобы писать:

class Purchase {
  setPurchaseDateAndGetTotalPrice() {
    //...
  }
}

Мы пишем:

class Purchase {
  setPurchaseDate() {
    //...
  }
  getTotalPrice() {
    //...
  }
}

Не только названия методов короче, но и их тела делают меньше и делают только одно, так что это лучше.

Параметризация метода

Вместо того, чтобы иметь несколько методов, выполняющих похожие действия, у нас может быть один метод, который принимает параметр, выполняющий то же самое, что и все методы.

Например, вместо написания:

class Purchase {
  fivePercentDiscount() {
    //...
  }
  tenPercentDiscount() {
    //...
  }
}

Мы пишем:

class Purchase {
  discount(percent) {
    //...
  }
}

Заменить параметр явными методами

Если у нас есть метод с параметрами и в соответствии с этими параметрами выполняются разные операции, мы можем разделить их на отдельные методы.

Например, вместо написания:

class Person {
  getDimension(type) {
    if (type === 'height') {
      return this.getHeight();
    } else if (type === 'weight') {
      return this.getWeight();
    }
  }
  getHeight() {
    ///...
  }
  getWeight() {
    ///...
  }
}

Мы пишем:

class Person {
  getHeight() {
    ///...
  }
  getWeight() {
    ///...
  }
}

Как мы видим, getDimension не так уж и полезно для начала, поэтому мы можем удалить его и вызвать эти getHeight и getWeight напрямую.

Сохранить объект целиком

Если нам нужно получить несколько значений от объекта и передать их все в функцию, то вместо этого мы должны просто передать весь объект.

Например, вместо написания:

const calculate = (height, weight) => {
  //...
}
const height = getDimensions().height;
const weight = getDimensions().weight;
calculate(height, weight);

Мы пишем:

const calculate = ({
  height,
  weight
}) => {
  //...
}
const dimensions = getDimensions();
calculate(dimensions);

Мы просто передаем объект целиком вместо того, чтобы передавать отдельные свойства.

Чтобы сделать функцию calculate более читаемой, мы использовали деструктуризацию, чтобы получить свойства, которые мы хотим получить от объекта.

Заменить параметр методом

Мы можем заменить параметр его собственным методом. Например, если у нас есть:

const getDiscountLevel = () => {
  //...
  return 0.5;
};
const discountedPrice = (subtotal, discountLevel) => {
  return subtotal * discountLevel
}
const subtotal = 100
const discountLevel = getDiscountLevel();
const total = discountedPrice(subtotal, discountLevel);

Мы можем просто заменить discountLevel самим вызовом функции getDiscountLevel следующим образом:

const getDiscountLevel = () => {
  //...
  return 0.5;
};
const discountedPrice = (subtotal) => {
  return subtotal * getDiscountLevel()
}
const subtotal = 100
const total = discountedPrice(subtotal);

Теперь мы удалили параметр из discountedPrice и переменной discountLevel.

Заключение

Чтобы добавить проверки к функции перед ее запуском, мы добавляем некоторые утверждения с помощью модуля Node assert.

Мы также можем переименовать методы, чтобы сделать их более понятными. Также следует разбить методы, которые выполняют несколько задач.

Если мы передаем несколько свойств из одного и того же объекта в функцию, мы должны просто заставить функцию принимать весь объект.