여기에 관련된 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 언어가 사용하는 해석)에서, 대체 용 (예 : 최종 / 밀봉되지 않은) 공용 유형을 사용하는 코드는 해당 유형의 적합한 구현에서 작동해야합니다.