Задать вопрос
@lookingfor2

Как красиво и правильно написать метод/методы чтобы не дублировать код, когда они полностью идентичны?

Есть метод для двух сущностей, который суммирует поле результата.
Сущности похожи. Метод получается один и тот же. Мне не нравится как он выглядит.
Как правильно его описать?
Может сделать для каждой сущности по методу, но тогда все просто дублируется.
Может как то более правильно описать через дженерики?
async summarizeResults(
    entityName: 'accrueds' | 'deductions',
    userId: number,
    startDate: Date, // for example 2022-06-30T21:00:00.000Z
    endDate: Date, // for example 2022-07-31T20:59:59.999Z
  ): Promise<number> {
    const sheets = await this.sheetRepository
      .createQueryBuilder('sheets')
      .where('user_id = :id', {
        id: userId,
      })
      .leftJoinAndSelect(`sheets.${entityName}`, entityName)
      .andWhere(`${entityName}.period > :startDate`, {
        startDate: startDate,
      })
      .andWhere(`${entityName}.period < :endDate`, {
        endDate: endDate,
      })
      .andWhere(`${entityName}.status != :status`, {
        status: TransactionStatus.REJECTED,
      })
      .getMany();

    const items: (AccruedEntity | DeductionEntity)[] = sheets?.reduce(
      (prev, curr) => {
        return [...prev, ...curr[entityName]];
      },
      [],
    );
    const initialValue = 0;
    const sum = items?.reduce((accumulator, currentValue) => {
      return evaluate(`(${accumulator} + ${currentValue.result})`);
    }, initialValue);

    return round(sum, 2);
  }

console.log({
      sheets: sheets,
      items: items,
      sum: sum,
    });
{
  sheets: [
    PaymentSheet2Entity {
      id: 9,
      user_id: 1,
      organization: '7842460869/781301001',
      individual_guid: '0bd4be28-88ef-44be-a630-04b5541786b0',
      period: 2022-07-19T13:02:33.942Z,
      created_at: 2022-07-19T13:02:33.943Z,
      average_salary: null,
      accrueds: [Array]
    }
  ],
  items: [
    AccruedEntity {
      id: 11,
      guid: null,
      payment_sheets_2_id: 9,
      name: 'Выплата по инициативе сотрудника',
      period: 2022-07-19T13:02:33.942Z,
      result: '8000.20',
      status: 'checked',
      created_at: 2022-07-19T13:02:33.943Z,
      updated_at: 2022-07-19T13:02:33.943Z
    }
  ],
  sum: 8000.2
}
  • Вопрос задан
  • 101 просмотр
Подписаться 1 Простой 5 комментариев
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Фронтенд-разработчик
    10 месяцев
    Далее
  • Skillbox
    JavaScript
    3 месяца
    Далее
  • Нетология
    Fullstack-разработчик на Python + нейросети
    20 месяцев
    Далее
Пригласить эксперта
Ваш ответ на вопрос

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

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