2018년 2월 4일 일요일

C# Optional parameter & default value.



이전 포스팅에서 나온 얘기인데 좀 더 봐야할 필요가 있어 정리함.

C# API를 만드는 입장에서는 Optional parameter를 사용할 때 주의 해야 한다고 함.


1. "Default value의 변경" 과 관련해서
"C# 7.0 in a Nutshell"을 보면

Optional parameters의 default value는 빌드시 default value를 포함시켜 빌드 한다고 함. 예를 들어

public Car(string name, bool isSedan = false가 있고
var myCar = new Car("AAA"); 일 경우 
빌드 시 isSedan 값이 false로 지정되어 빌드 된다고 함.

나중에 Car의 signature의 isSedan optional parameter가 true로 바뀌어도 
기존에 컴파일 된 API client에서는 어차피 false값을 사용하고 있으므로
API 변경과는 상관이 없는 것임.

결국 변경된 API의 optional parameter의 defulat value를 적용하기 위해 모든 API client들이 재컴파일 되어야 함.


2. "Optional parameter가 있는 API가 Overload 될 때" 특이한점이 있는데

위 링크를 참조하면 Overload 된 methods들을 선택할 때 
아래와 같은 느낌?으로 호출할 대상을 선택한다고 함.
Optional parameter가 없는 함수 중 동일한 parameter 개수의 함수를 최우선으로 선택.
> 없다면 optional parameter를 가진 함수 중에서 일치하는 함수를 선택한다.
> 하지만, API들의 parameter 중 default value를 가지고 있지 않는 개수가 동일한 경우 같은 함수로 취급되어 호출 할 대상을 찾지 못해 에러가 발생한다고 한다.

public void Drive(string destination, int speed = 30) 이 있고
API client에서 Drive("Seoul")로 사용하고 있는 상황에서
public void Drive(string destination, int speed = 30, bool byBus = false) 이 추가되며 API가 업데이트 된다면

컴파일 되지 않은 기존 API client에서 호출하는 Drive("Seoul") 실행 시 에러가 발생한다.
사실상 두 Drive API가 모두 Optional parameter를 적용하면 같은 함수나 마찬가지이므로 runtime 시 어떤 API를 호출해야 할지 몰라 에러가 발생하는 것임.

public void Drive(string destination, int speed = 30)
public void Drive(string destination, int speed = 30, bool byBus = false) 

하지만 아래와 같이 optional parameter가 없는 함수가 있다면 우선적으로 해당 API를 호출하게 되므로 에러는 발생하지 않는다.

public void Drive(string destination)
public void Drive(string destination, int speed = 30)
public void Drive(string destination, int speed = 30bool byBus = false) 

댓글 없음:

댓글 쓰기