가짜 정적 클래스를 사용하여 네임스페이스(js/ts) 보호

우리 모두는 모듈을 사용하면 다른 파일이 충돌하지 않도록 파일의 기호를 숨길 수 있다는 것을 알고 있습니다.

그리고 우리는 이것을 하는 OOP 이후의 사람들입니다.

type Point = [x: number, y: number]
function magnitude(p: Point) {
    return Math.sqrt(p[0] * p[0] + p[1] * p[1])
}


이렇게 하는 대신

class Point {
    constructor(public x: number, public y: number) {}
    magnitude() {
        return Math.sqrt(this.x * this.x + this.y * this.y)
    }
}


유형 및 인터페이스 및 함수 접근 방식은 이상한 상속 패턴을 방지하고 데이터베이스/파일 시스템/네트워킹 목적을 위해 잘 직렬화하며 일반적으로 이러한 클래스를 분해하고 항상 다시 인스턴스화할 필요가 없기 때문에 더 간결한 코드를 작성할 수 있습니다.

// nice
function add(p: Point, q: Point): Point {
    return [p[0] + q[0], p[1] + q[1]]
}
// annoying constructor; less symetric
class Point {
    // ...
    add(q) {
        return new Point(this.x + q.x, this.y + q.y)
    }
}


하지만 이 전환 과정에서 잃어버린 것이 있습니다. 프로젝트 네임스페이스가 방대해집니다. 대규모 프로젝트에는 다양한 유형의 데이터로 수행하려는 몇 가지 일반적인 작업이 있습니다. ECMAScript 모듈을 사용하면 짧고 적절한 이름을 사용할 수 있습니다. 프로젝트는 다음과 같이 표시됩니다.

// accounts.ts
function transfer(accountId: string, amount: number) {}

// item-management.ts
function transfer(from: User, to: User, itemId: string) {}

// array-helpers.ts
function transfer<T>(from: T[], to: T[], val: T) {}

// ...


한 달 후 누군가 계정 잔액을 이체하기 위한 새 페이지를 만들고 싶어합니다.
  • 그들은 코드베이스에서 transfer로 점프를 시도하고 5개의 내보낸 정의가 있습니다.
  • 자동 가져오기는 프로젝트의 관련 없는 부분에서 정크를 제안합니다.
  • 프로젝트 전체에 수많은 짧은 함수가 흩어져 있기 때문에 User에서 모든 메소드를 쉽게 찾을 수 있는 방법이 없습니다.

  • 해결책



    하나의 파일에서 하나의 유형과 모든 메서드를 정의하고 개체의 메서드를 캡슐화합니다.

    // Point.ts
    export type Point = [x: number, y: number]
    export const Point = {
        mag: (p: Point) => Math.sqrt(p[0] * p[0] + p[1] * p[1]),
        add: (p: Point, q: Point) => [p[0] + q[0], p[1] + q[1]],
        mul: (p: Point, factor: number) => [p[0] * factor, p[1] * factor],
    } as const
    
    // some-application-code.ts
    import { Point } from './Point'
    
    function whatever() {
        const p: Point = [5, 6]
        const q: Point = [10, 11]
        return Point.add(p, q)
    }
    


    이것은
  • 프로젝트 어휘가 너무 커지지 않도록 합니다.
  • 사용 시 클래스 인스턴스 값에서 사용할 수 있는 모든 메소드 함수를 볼 수 있습니다.
  • 유형을 확장하려는 경우 코드를 작성할 명확한 위치를 제공하고
  • 거대한 수입 명세서 블록을 피하십시오.
  • 프로젝트에서 특정 기능을 검색할 수 있습니다(Point.add는 고유하지만 add는 잘못된 긍정이 많습니다),
  • 모호함 없이 더 짧은 함수 이름을 사용할 수 있습니다.
  • 좋은 웹페이지 즐겨찾기