은 거기에 설립되는 대안을 ISomething/ISomethingable 인터페이스에 대한?

StackOverflow https://stackoverflow.com/questions/222457

  •  03-07-2019
  •  | 
  •  

문제

니다.순이의 표준을 붙 인터페이스 이름으로 나는 것 같이 되는 광범위하고 정당한 한정되지 않습니다.NET 니다.나의 많은 걸쳐 올바 코드를 사용하는 이 협약의(그래서 그것은 놀라지는 않을 것이다면 나에게 Java 를 사용하기 전에 그것 C#did).또한 코드를 사용니다.의 배치는 나의 시작에서 이름의 입맛을 다시어지고 그래서 나는 불편과 함께 그것을 사용하고 있다.

그래서 질문은 대안이 있습 방법의 것을 나타내는가에는 인터페이스가 아닌 클래스고 필요가 없을 나타내는 그것이 어쨌든.나 그것은 경우 해당 표준이되었고 그래서 나는 그냥 그것을 받아들이고 정지하려고 저어"종교 전쟁"을 제안하여 그것은 다른?

도움이 되었습니까?

해결책

프레임 워크 디자인 가이드 라인에서 : 책 :

계층 구조의 뿌리 (예 : Ilist)를 나타내는 인터페이스는 명사 또는 명사 문구를 사용해야합니다. 기능을 나타내는 인터페이스는 형용사와 형용사 문구를 사용해야합니다 (예 : Icomplayable, iformattable).

또한 인터페이스 명명의 주석에서 :

krzysztof cwalina : 사용 된 몇 가지 접두사 중 하나는 인터페이스에 대한“I”이지만 (iCollection에서와 같이) 역사적 이유입니다. 돌이켜 보면 일반 유형 이름을 사용하는 것이 더 낫다고 생각합니다. 대부분의 경우 개발자는 예를 들어 무언가가 추상 클래스가 아닌 인터페이스라는 것을 신경 쓰지 않습니다.

Brad Abrams : 반면에, 인터페이스의 "I"접두사는 .NET 프레임 워크에 대한 COM (및 Java)의 영향을 명확하게 인식 한 것입니다. Com은 인터페이스가 "I"로 시작한다는 표기법, 제도화 된 대중화 된 것으로 대중화되었습니다. 우리는이 역사적 패턴에서 발산에 대해 논의했지만 많은 사용자들이 이미 Com에 익숙했기 때문에 패턴을 전달하기로 결정했습니다.

Jeffrey Richter : 개인적으로 저는“I”접두사를 좋아하고 더 많은 것들이 있었으면 좋겠습니다. 작은 1 자리 접두사는 코드를 간결하고 설명 적으로 유지하는 데 먼 길을갑니다. 앞서 말했듯이, 나는 이것이 매우 유용하기 때문에 개인 유형 필드에 접두사를 사용합니다.

브렌트 rector 참고 : 이것은 실제로 헝가리 표기법의 또 다른 응용 프로그램입니다 (표기법이 변수 이름으로 사용하는 단점이없는 것).

그것은 매우 널리 채택 된 표준이되었으며, 브렌트가 말한 것처럼 헝가리의 한 형태이지만, 변수 이름으로 헝가리 표기법을 사용하는 단점으로 어려움을 겪지 않습니다.

다른 팁

솔직히 말해서 받아 들일 것입니다. 나는 당신이 헝가리 표기법과 비슷하다는 것이 무엇을 의미하는지 알고 있지만 (또는 적어도 같은 학대).이 경우에 가치가 충분하다고 생각합니다.

의존성 주입이 유행에 빠지면서 종종 인터페이스와 단일 생산 구현으로 끝납니다. I 접두사만으로 쉽게 구별 할 수있게하는 것이 편리합니다.

한 가지 작은 데이터 포인트 : 나는 Java와 C#과 공정한 금액을 모두 협력하고 있으며, 정기적으로 Java의 어떤 유형이 실제로 컬렉션 프레임 워크 주변의 인터페이스인지 확인해야합니다. .NET은 이것을 간단하게 만듭니다. 어쩌면 그것은 다른 사람들을 괴롭히지 않지만 나를 귀찮게합니다.

나에게서 ifoo의 경우 +1.

.NET 프로그래머로서 (대부분), 나는 실제로 I 여기서 간단한 이유가 있습니다. 종종 작은 재 설계는 인터페이스에서 추상 기본 클래스로 변경하거나 그 반대를 변경해야합니다. 이름을 변경 해야하는 경우 불필요한 리팩토링이 많이 필요할 수 있습니다.

반면에, 클라이언트의 사용은 투명해야 하므로이 유형의 힌트를 신경 쓰지 않아야합니다. 또한, 'the theable "의“Able”접미사는 충분한 힌트 여야합니다. Java에서 충분히 잘 작동합니다.

/편집 : 위의 추론으로 인해 I 개인 프로젝트의 접두사. 그러나 FXCOP 규칙 세트에 대해 그들 중 하나를 확인하자마자 나는 I. 일관성이 여기에서 승리하고 ~ 일지라도 어리석은 일관성은 작은 마음의 호고 블린입니다.

그 모든 것에 관한 것입니다 스타일 그리고 가독성. "I"와 인터페이스를 접두사하는 것은 단지 명명 컨벤션 및 스타일 가이드 라인 일뿐입니다. 컴파일러 자체는 덜 신경 쓰지 못했습니다.

Symbian의 코딩 표준에는 I가 아닌 M으로 표시되는 인터페이스 (순수한 추상 C ++ 클래스)가 있습니다.

그렇지 않으면, 인터페이스를 나타내는 것으로 본 유일한 방법은 컨텍스트를 통한 것입니다.

.NET의 경우 Microsoft의 프레임 워크 디자인 가이드 라인 책은 절대적으로 추천합니다. 그렇습니다. 매우 표준입니다. 나는 그것이 그렇지 않으면 그것을 본 적이 없으며, 새로운 컨벤션을 만드는 것은 사람들을 혼동하는 데 도움이 될 것입니다.

나는 헝가리 표기법도 싫어한다고 덧붙여 야한다. 그러나 이것과 밑줄로 클래스 변수를 접두사하는 경우는 코드를 훨씬 더 읽기 쉽게 만들기 때문에 나에게 좋은 예외이다.

나는 항상이 명명 컨벤션이 공룡의 약간이라고 생각했습니다. 요즘 Ides는 무언가가 인터페이스라는 것을 알려줄만큼 강력합니다. 코드를 읽기가 더 어렵다고 덧붙여서 실제로 인터페이스를 클래스와 분리하는 이름 지정 컨벤션을 원한다면 구현 클래스의 이름에 명시 적으로 추가됩니다.

public class CustomerImpl implements Customer

당신은 대안을 요청 했으므로 여기에 내가 만난 것이 있습니다.

사용 아니요 인터페이스 클래스에서 접두사를 접두표하지만 a 또는 해당 콘크리트 클래스의 접두사. 대부분의 코드는 일반적으로 인터페이스를 참조하므로 일반적으로 사용되는 콘크리트 유형이 아닌 접두사로 오염 된 이유가 있습니다.

이 접근법은 일부 콘크리트 유형이 접두사 (일치하는 인터페이스가있는 것)가 접두사로 만들어지고 다른 콘크리트 유형이 접두사로 표시되며 다른 콘크리트 유형은 그렇지 않다는 점에서 하나의 불일치를 불러 일으 킵니다. 이것은 인터페이스가 존재하고 콘크리트 유형보다 사용이 선호되어야한다는 것을 개발자에게 상기시키기 때문에 유용 할 수 있습니다.

솔직히, 인터페이스에서 접두사를 사용하지만, 나는 그것에 익숙해지고 편안해 졌기 때문에 더 많다고 생각합니다.

나의 주요 가정의 가장 중요한 것은 유독성에서 도메인의 일환 구현입니다.따라서:

  • 이 있는 경우 하나의 행동 하나의 가능한 구현에,그냥을 만들지 않는 인터페이스::

    공급 StackOverflowAnswerGenerator{}

  • 이 있는 경우 하나의 행동과 많은 가능한 구현에서는,다음에 문제가 없고 삭제할 수 있습니다 그냥"I",그리고:

    공용 인터페이스 StackOverflowAnswerGenerator{}

    공급 StupidStackOverflowAnswerGenerator:StackOverflowAnswerGenerator{}

    공급 RandomStackOverflowAnswerGenerator:StackOverflowAnswerGenerator{}

    공급 GoogleSearchStackoverflowAnswerGenerator:StackOverflowAnswerGenerator{}

    //...

  • 실제 문제에 올 때 당신이 한 행동이고 가능한 한 가지 구현 하지만 당신은 필요한 인터페이스를 설명하는 그의 행동(예를 들어에 대한 테스트를 편리하기 때문에,컨벤션에서 귀하의 프로젝트를 사용하여,일부 라이브러리/framework 을 적용하는 이,...).가능한 솔루션에서 다른 추가 인터페이스:

    a) 접두사 또는 접미사가 구현(에 명시된 바와 같이 일부 다른 답변에서 이 항목)

    b) 서로 다른 네임스페이스를 사용에 대한 인터페이스::

    네임스페이스 StackOverflowAnswerMachine.인터페이스 { 공용 인터페이스 StackOverflowAnswerGenerator{} }

    네임스페이스 StackOverflowAnswerMachine { 공급 StackOverflowAnswerGenerator:인터페이스가 있습니다.StackOverflowAnswerGenerator {} }

    c) 사용은 다른 네임스페이스 구현을 위한:

    네임스페이스 StackOverflowAnswerMachine { 공용 인터페이스 StackOverflowAnswerGenerator{} }

    네임스페이스 StackOverflowAnswerMachine.구현 { 공급 StackOverflowAnswerGenerator:StackOverflowAnswerMachine.StackOverflowAnswerGenerator {} }

현재 저는 실험의 마지막 가능성이다.참고 구현에 소스 파일에 당신은 여전히 수 있습니다"사용 StackOverflowAnswerMachine;"편리한 도메인에 대한 액세스를 개체입니다.

업데이트: 하지만 나는 아직도 생각하는 지속 가능성는 가장 깨끗한,그것은 하나의 단점은 그도를 사용하여"StackOverflowAnswerMachine;"에 대한 액세스를 제공합니 도메인체해야 합니다 접두사로 모든 도메인 인터페이스를 혼동하지 않으로 자신의 구현입니다.수도 있는 것 같은 느낌 뭔가 매우 편리하지만 깨끗한 디자인으로 일반적으로 클래스를 사용하지 않는 다른 많은 도메인의 개체,그리고 대부분은 당신을 사용할 필요가 접두사에서만 필드를 선언하고 생성자를 매개 변수 목록입니다.그래서,그는 현재 추천합니다.

클라이언트의 도메인 기능을 필요가 없는지를 알아들은 인터페이스를 사용하여 추상 클래스 또는 콘크리트 클래스입니다.필요한 경우 이것을 알고,다음 몇 가지는 심각한 문제에서는 이런 프로젝트이기 때문에,그것은 도메인 논리와 인프라 우려에 혼합하고 동일한 추상화 계층입니다.그러므로 내가는 것이 좋습니다"a"또는"c"솔루션입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top