arguments에는 generic type을 사용하고, return value로는 specific type을 사용하자!
1. Return the most specific type, accept the most generic type
- Use the most generic types possible for arguments
- Use the most specific types possible for return values
public abstract class Pet
{
/* ... */
}
public class Dog : Pet
{
/* ... */
}
public class Cat : Pet
{
/* ... */
}
1.1 Generic types are for arguments
public static void Feed(Xxx xxx)
{
/* ... */
}
Feed 라는 함수가 있다고 하자. argument type을 무엇으로 해야할까?
Feed 기능이 dog와 cat 모두 사용할 수 있다면, 함수는 generic Pet을 받아야 한다.
public static void Feed(Pet pet)
{
/* ... */
}
Wash 함수는 dog에는 적용되지만, cat에는 적용되지 않는다.
public static void Wash(Dog dog)
{
/* ... */
}
이 함수에서 the most generic type은 Dog이다.
Feed 함수가 pet에 적용되고, 모든 objects에 적용되지 않는 것처럼, Wash 함수는 pets의 하위인 dogs에만 적용된다.
1.2 Specific types are for return values
public static Xxx FindNextOneToFeed()
{
/* ... */
}
Xxx에는 어떤 타입이 들어갈까?
public static Pet FindNextOneToFeed()
{
/* ... */
}
cat, dog 다 해당되기 때문에 Pet이다.
public static Dog FindNextOneToWash()
{
/* ... */
}
FindNextOneToWash 는 오직 dog type을 리턴한다. Pet을 사용할 수도 있지만, Dog가 더 specific type이다.
예를들어, Dog는 Bark 함수를 가진다.
1.3. Return the most specific type, accept the most generic type
- 함수가 input 값의 넓은 범위를 제공하므로, arguments type은 generic as possible일 수록 유용하다.
- specific 값이 generic보다 더 기능성을 제공하므로, return type은 specific as possible일 수록 유용하다.
2. Leaky abstractions
- Use the most generic types possible for arguments
- Use the most specific types possible for return values
possible 은 정확히 무슨 뜻인가?
예를들어, Feed 함수에 Pet 대신 Object를 사용할 수 있다.
public static void Feed(Object obj)
{
/* ... */
}
물론, 함수는 모든 objects에 적용되지는 않지만, 아래와 같이 cast 할 수 있다.
public static void Feed(Object obj)
{
Pet pet = obj as Pet;
if (pet == null)
return;
/* ... */
}
이런 수정방식은 leaky abstraction을 초래한다.
Abstraction is the amplification of the essential and the elimination of the irrelevant.
— Robert Martin
모든 code는 abstraction이다. abstraction을 소개하기 위해 반드시 interface, abstract class를 사용해야 하는 것은 아니다.
잘 정의된 함수는 좋은 abstraction을 만든다. 함수를 적절히 사용하기 위해서 알아야 하는 것은 단지 함수의 signature(함수 이름과 arugments)이다. 함수 본문을 다 들여봐야 하는 것은 아니다. 반면에, Feed함수가 Object argument를 받으면 사용자가 함수의 구현내용을 잘 알아야 하기 때문에 leaky abstraction하게 된다.
따라서, possible이 붙은 것이다. 함수의 signature honest를 유지하고, leaky abstraction이 되지 않도록 유지하는 한 the most generic, specific type을 사용해야 한다.
3. Summary
- arguments에 대해 가능한 the most generic types을 사용해라. argument types이 가능한 generic할수록 input values 범위가 넓어지므로 유용하다.
- return values에 대해 가능한 the most specific type을 사용해라. specific return value가 generic보다 더 기능성을 제공한다.
- '가능한'이란, leaky abstraction 함수를 만들지 않는 것을 말한다.
- leaky abstraction 이란 abstract 하기 위해 함수 상세내용을 알아야 한다는 의미이다.
'C#' 카테고리의 다른 글
C#] Query String 만드는 방법 (0) | 2023.11.07 |
---|---|
C#] String 검색 함수, 성능 비교 (0) | 2023.10.23 |
C# 9.0] init keyword, record, with-expression (0) | 2023.09.05 |
C#] Method Parameters - params, out (0) | 2023.08.23 |
C#] Method Parameters - parameters 전달 (0) | 2023.08.22 |
댓글