어떻게 코딩합니까?

코딩을 시작하는 동안 나는 많은 실수를 저질렀고 그것이 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));
  }
}


이 코드에는 한 가지 주요 문제가 있으며 훨씬 더 나은 방법으로 작성할 수 있습니다.

Issue:
async-await does not work with forEach. So the flow will not be asynchronous.



이제 코드를 작성하는 방법은 다음과 같습니다. 필요한 경우 개선하겠습니다.


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 변수는 변경되지 않습니다.
  • transformationData는 이제 이전 날짜 및 날짜 대신 ISO 문자열입니다.
  • getIsValid 메소드는 isValid 키 데이터를 얻기 위해 특별히 작동합니다.
  • 데이터를 필요한 형식으로 가져오기 위한 구조 분해.
  • async-await와 완벽하게 작동하는 for-of 루프.


  • 게시물이 마음에 들면 더 많은 것을 위해 나를 따르십시오.



    라훌 라즈 팔로우



    I am a developer who is trying to improve myself day by day.

    좋은 웹페이지 즐겨찾기