여기에 관련된 Java와 C # 사이에는 작은 차이가 있습니다. Java에서 모든 멤버는 기본적으로 가상입니다. C #에서는 인터페이스 멤버를 제외한 모든 멤버가 기본적으로 봉인됩니다.
이에 관한 가정은 지침에 영향을 미칩니다. Java에서는 모든 공개 유형이 Liskov의 대체 원칙 [1]에 따라 비 최종으로 간주되어야합니다. 구현이 하나 뿐인 경우 클래스 이름을 지정합니다 Parser
. 여러 구현이 필요한 경우 클래스를 동일한 이름의 인터페이스로 변경하고 구체적인 구현의 이름을 설명으로 변경하면됩니다.
C #에서 주된 가정은 클래스를 가져올 때 (이름이로 시작되지 않음 I
) 원하는 클래스라는 것입니다. 100 % 정확하지는 않습니다. 일반적인 카운터 예제는 Stream
(실제로 인터페이스이거나 몇 개의 인터페이스 여야 했음) 같은 클래스가 될 것입니다. 모든 사람은 다른 언어의 고유 한 지침과 배경을 가지고 있습니다. Base
추상 클래스를 나타 내기 위해 상당히 널리 사용되는 접미사 와 같은 다른 예외도 있습니다 . 인터페이스와 마찬가지로 유형이 다형성이어야한다는 것을 알고 있습니다.
또한 인터페이스를 추상 클래스로 만들지 않고 해당 인터페이스와 관련된 기능에 I 접두사가 아닌 이름을 남겨두면 유용한 유용성 기능이 있습니다 (C #의 클래스 다중 상속이 없기 때문에 상처를 입을 수 있음). LINQ IEnumerable<T>
는 인터페이스와 Enumerable
해당 인터페이스에 적용되는 메소드의 저장소로 사용됩니다. 인터페이스에는 메소드 구현도 포함될 수있는 Java에서는 필요하지 않습니다.
궁극적으로 I
접두사는 C # 세계에서 널리 사용되며 확장으로 .NET 세계 (대부분의 .NET 코드는 C #으로 작성되므로 대부분의 공용 인터페이스에 대한 C # 지침을 따르는 것이 좋습니다)입니다. 이것은 거의 확실 하게이 표기법을 따르는 라이브러리 및 코드로 작업하고 있음을 의미하며 불필요한 혼란을 방지하기 위해 전통을 채택하는 것이 합리적입니다. 접두사를 생략하면 코드가 더 좋아질 것입니다 :)
밥 삼촌의 추론은 다음과 같다고 생각합니다.
IBanana
바나나의 추상적 개념입니다. 보다 나은 이름을 가지지 않는 구현 클래스가있을 경우 Banana
추상화는 전혀 의미 가 없으므로 인터페이스를 삭제하고 클래스를 사용해야합니다. 더 나은 이름 (예 : LongBanana
또는 AppleBanana
)이 있으면 Banana
인터페이스 이름으로 사용하지 않을 이유가 없습니다 . 따라서 I
접두사를 사용하면 쓸모없는 추상화가 생겨 코드를 이해하기 어렵게 만들 수 있습니다. 엄격한 OOP는 항상 인터페이스에 대해 코드를 작성 I
하므로 유형 에서 접두사 가 표시되지 않는 유일한 위치 는 생성자에 있습니다.
이것을 샘플 IParser
인터페이스에 적용 하면 추상화가 전적으로 "무의미한"영역에 있음을 분명히 알 수 있습니다. 어느 파서 (예를 들면의 구체적인 구현에 대한 구체적인 뭔가있다 JsonParser
, XmlParser
...), 아니면 그냥 클래스를 사용해야은. "기본 구현"과 같은 것은 없습니다 (일부 환경에서는 COM이 의미가 있습니다). 특정 구현이 있거나 "기본"에 대한 추상 클래스 또는 확장 메소드를 원합니다. 그러나 C #에서는 코드베이스에서 I
-prefix를 이미 생략하지 않은 한 유지하십시오. 다음과 같은 코드를 볼 때마다 정신적으로 메모하십시오. class Something: ISomething
누군가 YAGNI를 따르고 합리적인 추상화를 작성하는 데 능숙하지 않다는 것을 의미합니다.
[1]-기술적으로 이것은 Liskov의 논문에서 구체적으로 언급되지는 않았지만 원래 OOP 논문의 기초 중 하나이며 Liskov를 읽었을 때 그녀는 이것에 도전하지 않았습니다. 덜 엄격한 해석 (대부분의 OOP 언어가 사용하는 해석)에서, 대체 용 (예 : 최종 / 밀봉되지 않은) 공용 유형을 사용하는 코드는 해당 유형의 적합한 구현에서 작동해야합니다.