@gomerIT

SOLID Единая ответственность — стоит ли мне в данном случае написать отдельный класс?

Задача заключается в том, чтобы подсчитать сумму всех двух значений ключей a и b в объекте, которые находятся в массиве, но так же иметь возможность подсчитывать сумму только для одно объекта.
const data = [{"id": 1, "a": 99, "b": 100}, {"id": 2, "a": 1 "b": 2}];
const oneEl = {"id": 3, "a": 2, "b": 10};

Сразу понятно, что тут можно написать один метод, который будет использоваться еще и в другом методе тем самым решав две задачи.
class Calc {
  calcAmount (obj) {
    const {a, b} = obj;
    return a + b;
  }

 calcAmountOfArray(data) {
   let sum = 0;
   data.forEach((item) => {
     sum += this.calcAmount(item);
   });

  return sum;
 }
}

Вроде все логично, но разве этим я не нарушил единую ответственность? Допустим появится новый ключ "c" и придется подсчитывать и его сумму. Интуиция мне подсказывает создать отдельный класс для метода calcAmount, но стоит ли так делать?
  • Вопрос задан
  • 217 просмотров
Пригласить эксперта
Ответы на вопрос 2
@pin2t
Ну начнем с того, что класс вам тут вообще не нужен. Потому что в классе Calc нет никаких данных, только методы. Вот функции вам и нужны, а не класс.
Не надо сильно выдумывать и придумывать что-то связанное с этими принципами, они очень абстрактны. Даже сам автор SOLID сто раз переобувался что он имел в виду под этим S.
Простой функции

arrayAmount(data) {
   let sum = 0;
   data.forEach((item) => {
     const {a, b} = item;
     sum += a + b;
   });

  return sum;
 }

будет достаточно
Ответ написан
Комментировать
Aetae
@Aetae Куратор тега JavaScript
Тлен
calcAmount по SOLID должен быть методом у объекта с этими ключами.
Т.е. допустим с сервера пришла
const data = [{"id": 1, "a": 99, "b": 100}, {"id": 2, "a": 1 "b": 2}];

Перед тем как с ней что-то делать, ты преобразуешь её в типизированную структуру:
interface Calculable {
  calcAmount(): number;
}

class CalculableAB implements Calculable {
  constructor(obj) {
    Object.assign(this, obj);
  }
  calcAmount() {
    const {a, b} = this;
    return a + b;
  }
}

struct = data.map(obj => new CalculableAB(obj));

Ну и дальше при работе с любым Calculable ты просто вызываешь у него calcAmount(). Как оно там реализовано - тебя не волнует.

Это конечно хардкорное ООП и в большинстве мелких случаев такого не надо, но суть думаю ясна.)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы