Как я кодирую?

Пока я учился кодить, я совершил много ошибок, и это помогло мне изучить новые концепции в JavaScript и принцип DRY. Рассмотрим приведенную ниже логику преобразования.

// The source data type coming to be transformed
interface ISourceData {
  id: number;
  name: string;
  email: string;
  country: string;
  active: boolean;
  isPro: boolean;
}

// The data that will be loaded to the db
interface ITargetData extends ISourceData {
  modifiedBy: string;
  modifiedOn: string;
  createdBy: string;
  createdOn: string;
  isValid: boolean;
}
Войти в полноэкранный режим Выход из полноэкранного режима

В первые дни разработки я бы написал свой код следующим образом:

class Transformation {
  public async transform(data: ISourceData[]) {
    const transformedData = data.map((item) => {
      let isValid = false;
      if (item.active === true && item.isPro === true) {
        isValid = true;
      }

      const modifiedBy = "System1";
      const modifiedOn = new Date().toDateString();
      const createdBy = "System1";
      const createdOn = new Date().toDateString();

      return {
        id: item.id,
        name: item.name,
        email: item.email,
        country: item.country,
        active: item.active,
        isPro: item.isPro,
        isValid: isValid,
        modifiedBy: modifiedBy,
        modifiedOn: modifiedOn,
        createdBy: createdBy,
        createdOn: createdOn,
      } as ITargetData;
    });
    // Loading the data to database
    transformedData.forEach(async (item) => await loadToDb(item));
  }
}

Вход в полноэкранный режим Выход из полноэкранного режима

Этот код имеет одну серьезную проблему и может быть написан гораздо лучше.

Проблема:
async-await не работает с forEach. Поэтому поток не будет асинхронным.

Итак, вот как я пишу коды сейчас, которые я буду улучшать, если потребуется.


const CREATED_BY_USER = "System1";
class Transformation2 {
  public async transform(data: ISourceData[]) {
    for (const item of data) {
      const transformedData = this.getTransformedData(item);
      await this.loadToDb(transformedData)
    }

  }

  private getTransformedData(sourceData: ISourceData): ITargetData {
    return {
      ...sourceData,
      ...this.getIsValid(sourceData.active, sourceData.isPro),
      ...this.generateDefaults(),
    } as ITargetData;
  }

  private getIsValid(active: boolean, isPro: boolean) {
    return { isValid: active && isPro };
  }

  private generateDefaults() {
    const transformationDate: string = new Date().toISOString();
    return {
      modifiedBy: CREATED_BY_USER,
      modifiedOn: transformationDate,
      createdBy: CREATED_BY_USER,
      createdOn: transformationDate,
    };
  }

  private async loadToDb(data: ITargetData): Promise<void>{
    // logic to load the data to database
  }
}

Вход в полноэкранный режим Выход из полноэкранного режима

Вы можете ясно увидеть разницу,

  • Несколько приватных методов, которые имеют определенные задачи.
  • Переменная CREATED_BY_USER const, так как она не будет меняться.
  • transformData теперь является строкой ISO вместо даты & день раньше: «Wed Aug 31 2022» теперь: «2022-08-31T09:30:16.579Z»
  • Метод getIsValid работает специально для получения данных ключа isValid.
  • Де-структуризация для приведения данных в нужный формат.
  • цикл for-of, который отлично работает с async-await.

Если вам понравился этот пост, следите за мной, чтобы узнать больше

Рахул Радж

Я разработчик, который старается совершенствоваться день за днем.

Оцените статью
devanswers.ru
Добавить комментарий