인터페이스 왜 써야함?
-> 이 수준에서는 오히려 안쓰는게 편함
이런 종류에는 이런 메서드 필요하겠네
-> 이정도 생각 되면 인터페이스 쓰면 됨
c로 만들때는 그런거 없이도 잘 만들었는데?
-> c99까지만 와도 매크로랑 구조체 함수 포인터 등으로 비슷하게 사용했음
c89 시절 틀딱이면 사용 안해도 됨
기획이 기억상실증있는지 매일 말이 달라짐
-> 인터페이스로 구조 잡아도 내일이면 달라질거임, 꼭 필요한곳에만 사용
-> 그 꼭 필요한 곳이 어딘지 모르면 그냥 안쓰면 됨
추가로 개인적으로 생각하는 인터페이스가 필요한 조건은
- 비슷한 동작을 하는 여러 구현체가 필요할 것이 확실할 때
- 그 구현체들이 공유하는 공통 작업이 있을 때
- 추가로 구현체간 의존성을 제거해야 할 명확한 이유가 있을 때
이 3 가지 다 만족하면 그때 만들 생각 하면 됨
비슷한 동작을 하는 여러 구현이 필요해도 공통 작업이 없으면 만들 이유가 없음
마찬가지로 공통 작업을 해도 여러곳에서 사용 안하면 만들 필요가 없고
의존성 제거가 필요없으면 상속으로 해결 가능함
위 3가지를 만족하는거랑 만족하지 않는 상황은 이런거임
바로 밑에있는 글에서 들고온건데
interface INamed {
public string name {get;}
}
public class Item : INamed {
public string name {get;}
}
이런건 보통 만드는 의미가 없음
하나하나 생각해보면
비슷한 행동의 여러 구현체 필요
ㄴ 있을수도 있지만 name 하나 들고있는게 필요할까?
공유하는 공통 작업이 있을 때
ㄴ name getter 하나만있어 공통 작업이라고 할 수 없음
구현체간 의존성을 제거해야 할 이유가 있을 때
ㄴ name 프로퍼티만으로 의존성을 제거할 이유가 없음
그럼 어떤상황에 필요할까?
저걸 좀더 확장해서 툴팁을 표시한다고 해보자
interface ITooltipable {
string name { get; }
string description { get; }
Sprite icon { get; }
List<string> GetSubDescriptions();
}
public class Item : ITooltipable {
public string name { get; }
public string description { get; }
public Sprite icon { get; }
....
public List<string> GetSubDescriptions() {
return new List<string> {
$"공격력: +{attack}",
$"방어력: +{defense}"
};
}
}
// 대충 툴팁 표시 로직
위 코드일때 생각해보자
비슷한 행동의 여러 구현체 필요
ㄴ Item, Skill등 각각 툴팁 표시 필요하고
나중에 npc 등 확장할 가능성도 있음
공유하는 공통 작업이 있을 때
ㄴ이름, 설명, 아이콘 데이터
하위 설명 목록 생성과 표시
구현체간 의존성을 제거해야 할 이유가 있을 때
ㄴ TooltipUI에서는 클래스 대신 인터페이스만 알면 됨
나중에 다른 툴팁 대상을 추가해도 ITooltipable 상속받고 넘겨주면 구현 가능
하지만 이런 상황에서도 기획이나 디자인등이 지주 달라지는 상황에는 의미가 없음
기획, 디자인 등 변경이 자주 일어나면 결국 인터페이스 구조 자체를 수정해야 하고
그러면 모든 구현체도 함께 수정 해야하고 그러다보면 인터페이스로 얻는 이점보다 유지보수 비용이 더 커질 수 있음
와 그냥 대충보고 자려다가 로그인하고 개추박고갑니다
왜 진짜 유익한글임?
한 가짜 무익영어는 없으니까
왜 필요한지 모르겠으면 안쓰면 된다에서 고수의 스멜 느끼고 갑니다 - dc App