방프리

23.11.12 Chapter2. API 설계 (Item 22) 본문

C#/More Effective C#

23.11.12 Chapter2. API 설계 (Item 22)

방프리 2023. 11. 12. 23:47

Item 22 : 명확하고 간결하며 완결된 메서드 그룹을 생성하라

 

API를 구성할 때 유의해야할 점이 사용하는 사람이 보았을 때 혼동이 있어서는 안된다.

명확하고 사용자가 API를 사용함으로써 실수를 줄일 수 있는 몇 가지 방법이 있다.

1. 적은 양의 오버로드 함수

- 오버로드된 함수를 만드는 것은 좋으나, 그 개수가 많아진다면 사용자 측면에서 혼동이 일어날 수 있다. 
나중에는 각 함수 별 각주를 달거나 사용자가 해당 API를 사용할 때마다 기능을 확인해야 하는 경우가 발생할 수 있으니 
무분별한 오버로드 함수는 좋지 않다.

2. 동일 명에 동일 동작이 원칙

- 같은 메서드 명이라면 그 안에서 동작하는 행위는 무조건 같아야 한다. 다를 경우 사용자 측면에서 구분하기 어렵고 
사용 시 예측 불가능한 동작이 이뤄질 경우 원인을 분석하기 어렵기 때문이다.

3. 가능한 모든 타입에 대한 메서드 오버로드 제공

- 인자로 받는 타입이 여러 개일 때 각 타입 별로 정의해주는 것이 좋다. 물론 형변환하여 사용을 해도 상관없지만 
구분 측면에서는 타입 별로 따로 제작하는 것이 좋다. 특히 인자가 여러 개가 될 경우 복잡해지기 때문이다.
컴파일러는 생각보다 넓은 범위에서 최적의 후보 메서드를 검색한다. 그렇기 때문에 API 개발자가 꼼꼼하게
지정하지 않는다면 사용자는 하나의 기능을 사용할 때에도 굉장히 넓은 검색을 하게 된다.

public class Point
{
    public double X { get; set; }
    public double Y { get; set; }
    
    //생략
    public void Scale (int scale)
    {
        X *= scale;
        Y *= scale;
    }
}

public class Point3D : Point
{
    public double Z { get; set; }
    
    // override나 new가 아님. 매개변수 타입이 다름
    public void Scale (double scale)
    {
        X *= scale;
        Y *= scale;
        Z *= scale;
    }
}

Point3D p2 = new Point3D { X = 1, Y = 2, Z = 3 };
p2.Scale(3);

 위의 코드처럼 작성되면 안된다. Point의 Scale과 Point3D의 Scale은 서로 다를 뿐더러 이럴 경우에는 부모 클래스에서
Scale 메서드가 가상 메서드로 만들어졌어야 했다.

Comments