방프리

23.01.25 Chapter2. API 설계 (Item 12) 본문

C#/More Effective C#

23.01.25 Chapter2. API 설계 (Item 12)

방프리 2023. 1. 26. 00:12

Item 12 : API에는 변환 연산자를 작성하지 말라

 

함수를 만들다보면 같은 동작을 하는 함수임에도 매개변수가 무한히 늘어나게 되는 함수를 볼 수 있다.

이를 위해 C에서는 ..., C#에서는 params를 통해서 해결하지만 이 챕터에서는 다른 방향을 제시한다.

/////////////////////////////////////////////////변경하기 전 매개변수가 쓸데없이 늘어나는 코드
var wasted = Type.Missing;
var wordApp = new Microsoft.Office.Interop.Word.Application();
wordApp.Visible = true;
Documents docs = wordApp.Documents;

Document doc = docs.Add(ref wasted, ref wasted, ref wasted, ref wasted);
Range range = doc.Range(0, 0);
range.InsertAfter("Testing, testing, testing...");

/////////////////////////////////////////////////변경하기 후 매개변수에 기본값을 주어 최적화된 코드
var wordApp = new Microsoft.Office.Interop.Word.Application();
wordApp.Visible = true;
Documents docs = wordApp.Documents;

Document doc = docs.Add();		//매개변수의 기본값으로 Type.Missing을 넣어주었다.
Range range = doc.Range(0, 0);
range.InsertAfter("Testing, testing, testing...");

////생략되었지만 구현되어 있다면 다음과 같을 것
public Document Add(Type type1 = Type.Missing, Type type2 = Type.Missing...)
{
	//Do work
}

하지만 매개변수가 늘어날수록 사용하는 사람은 어떤 변수가 어떻게 할당되었는지 헷갈릴 수 있다.

이 때 우리는 매개변수를 명시적으로 알려주어 해당 변수가 어떤 매개변수 역할을 하는지 지정할 수 있다.

private void SetName(string lastName, string firstName)
{
    //생략
}

SetName(lastName: "Wagner", firstName: "Bill");	//순서대로 매개변수 지정
SetName(firstName: "Bill", lastName: "Wagner");	//명시적으로 한다면 순서를 바꿀 수도 있다.

하지만 주의해야할 점이 있다. 추후 업데이트 때 해당 변수명이 수정된다면? 해당 라이브러리를 사용하는 개발자들은

변수명을 모두 바꿔주어야한다. (명확성을 위해 사용했는데 오히려 보수작업이 더 늘어나게 됨)

그러므로 매개변수명 또한 public 인터페이스 취급을 해야한다.

Comments