2010-01-26 3 views
21

는 최근 언뜻 보면이동일한 파일에서 C# 인터페이스 및 구현 - 좋은 아이디어?

namespace MyNameSpace.Foo 
{ 
    public interface IFoo{ 
     void DoThis(); 
    } 
    public class Foo : IFoo { 
     public void DoThis(); 
    } 
} 

같은 동일한 파일의 인터페이스 선언 및 구현, 그것은 같은 파일의 선언과 구현이 모든 잘못을 보인다 일부 C# 코드를 볼 수 있지만, 실제이 있습니다 은혜. 예 : Visual Studio에서 정의로 이동하면 인터페이스와 구현이 같은 파일에 있습니다. 이 접근법은 단위 테스트에 필요할 수도있는 인터페이스의 다른 구현을하는 것을 금지하지 않습니다. 인터페이스가 하나의 구현 일 경우, 이것이 실용적인 접근 방식이 될 수 있다고 생각합니다.

좋음 싫거나 나쁜 아이디어?

질문을 확장 :
사람들이 당신이 인터페이스 참조 IFoo myFoo = FooFactory.getFoo(MY_FOO);있을 때 내가 바로 IFoo 클릭하고 내가 인터페이스 선언을 얻을 수있는 정의로 이동을 선택하면 구현으로 이동하려면 Visual Studio를 사용하여 수행하는 방법. IFoo의 구현 목록을 얻는 방법이 제가 실제로 얻고 자하는 것입니다. 계면은 그때의 상단을 넣어 (단기간에) 만 보인다 (의존성 주입을위한 인터페이스를 제공하는 경우와 같이) 하나 개의 클래스에 사용될 경우 개인

+1

위대한 의견은 지금까지. 제 질문은 인터페이스 참조가있을 때 사람들이 Visual Studio를 사용하여 구현을 탐색하는 방법을 묻는 것으로 확장되어야한다고 생각합니다. IFoo myFoo = FooFactory.getFoo (MY_FOO); IFoo를 마우스 오른쪽 버튼으로 클릭하고 정의로 이동을 선택하면 인터페이스 선언을 얻을 수 있습니다. IFoo의 구현 목록을 얻는 방법이 있나요? – Paul

답변

33

내 추천은 열거 선언, 인터페이스 또는 클래스 일 때 .cs 파일 당 하나의 항목 규칙을 항상 준수하는 것입니다. .cs 파일의 이름은 포함 된 이름과 일치해야합니다.

따르기 쉬운 간단한 규칙. 내부적으로 StyleCop을 사용하여이를 신고합니다.

이 방법을 네임 스페이스를 합리적으로 사용하면 Visual Studio의 솔루션 탐색기 뷰를 통해 프로젝트의 구성 요소를 쉽게 탐색 할 수 있습니다. ReSharper gives an alternative approach은이 탐색에 사용되지만,이 방법을 사용하면 모든 사람의 취향 (모든 사람이 ReSharper와 같은 추가 기능을 가질 수있는 것은 아닙니다)에 유의하십시오.

Travis G는 대리인 및 사용자 지정 EventArgs 선언과 같은 세세한 부분에 대해 질문했습니다. 커스텀 EventArg가 클래스이기 때문에, 나는 그것들을 자신의 파일에 넣을 것이다. 내가 그들을 사용할 클래스와 선언 할 대표. 여러 곳에서 사용 된 대리자가 많이있는 경우 Delegates.cs 파일에 모든 항목을 넣을 것을 고려할 수 있습니다 (때때로 Consts.cs 파일의 상수를 사용하여이 작업을 수행함).

그러나이 중 일부는 분명 주관적이며 소프트웨어 영역 인 religious wars으로 들어갑니다.

+1

나는 이것을지지한다. 특정 클래스 나 인터페이스를 검색하는 것뿐만 아니라 코드 탐색을 용이하게합니다. 파일 이름을 살펴보십시오. –

+2

저는 여러분과 함께합니다,하지만'delegate'과 custom'' EventArg's 같은 작은 것들을 어떻게 처리합니까? 나는 한 곳에서만 사용되기 때문에 보통 같은 파일에 넣습니다. –

+0

resharper를 풀어 놓기 전에하고있는 일에 만족하는지 확인하십시오. 그것은 시원하고 나는 그것을 사용하지만 위대한 힘으로 큰 책임을진다. –

13

...

클래스 파일. 개발 중 (수업이 변경 될 수 있음) 공공 장소가 바뀔 때마다 파일 두 개를 변경해야하는 PITA입니다.

물론 인터페이스가 둘 이상의 클래스에 의해 구현 될 가능성이있는 경우 별도의 파일에 넣습니다.

+4

네, 이것은 제가 생각한 시나리오입니다. 당신이 DI를위한 인터페이스 만 사용할 때 테스트 임프린트와는 다른 인터페이스 정의를 구현할 기회는별로 없습니다. – Paul

+2

'인터페이스가 한 클래스에만 사용될 가능성이 있다면'당신은 잘못하고 있습니다. 여기서 인터페이스는 쓸모가 없습니다. 여러 클래스가 인터페이스를 즉시 구현하지 않으면 잘못되었습니다. 의존성 주입에는 의미없는 인터페이스가 필요하지 않습니다. 이것은 신화입니다. 실제 구체적인 유형을 사용하십시오. –

+5

@ChrisMarisic 종속성이 인터페이스가 아닌 경우 어떻게 Unit Testing에 대한 종속성을 제공하겠습니까? – Holf

7

동일한 파일에서 인터페이스 정의 및 구현을하는 것은 단위 테스트와 아무 관련이 없습니다. 해당 인터페이스는 어쨌든 사용할 수 있기 때문입니다.

나는 일반적으로 동일한 파일에서 간단한 인터페이스와 구현으로 시작합니다. 일이 커지면 다른 코드가 해당 인터페이스를 참조해야 할 때 코드를 분할합니다.

4

나는 "하나의 클래스, 하나의 파일"규칙을 고수 할뿐입니다.클래스 I은 인터페이스, 열거 형 등을 의미합니다.

그리고 인터페이스 이름에 커서를 올리고 F12 키를 누르는 것이 잘못된 이유는 무엇입니까?

1

물론 이런 경우에는 아무런 해가 없으며 resharper와 같은 도구는 구현을 코드의 인터페이스 아래에 배치합니다. 그러나 그들은 또한 구현 파일을 다른 파일로 옮길 수있는 옵션을 제공합니다.

그렇습니다. 단점 테스트를 위해 인터페이스의 이점을 활용할 수는 없지만 다른 어셈블리에 인터페이스를 추가하는 것이 좋습니다. 그렇게하면 인터페이스에 대해 프로그래밍하고 구현을 자유롭게 바꿀 수 있으므로 더 많은 분리가 가능합니다. 지금까지 옳거나 그른 대답은 없기 때문에, 당신이 성취하려고 시도하는 것으로 내려갑니다.

+1

별도의 어셈블리 (프로젝트)에 인터페이스를 배치하는 데 유용한 팁으로 나에게 잘 맞습니다. – Paul

0

몇 가지 방법으로 작은 인터페이스 용으로 Java에서 그렇게합니다. 이 경우 인터페이스 파일에 하나 이상의 기본 구현을 제공합니다.

이렇게하면 작은 클래스가 주위에 흩어지는 것을 피할 수 있습니다.

하지만 제 동료가 불평하지는 않았지만 악의적 인 행동이나 모범 사례인지는 말할 수 없습니다.

5

나는 이것을 나쁜 생각으로 생각한다.

인터페이스와 구현을 분리 된 상태로 유지하십시오. 그렇지 않으면 디자인을 엉망으로 만들 가능성이 있습니다. 파일을 포함하고 자동적으로 인터페이스를 원할지라도 구현을 얻습니다. 그리고 우연히 (편리하기 때문에) 대신 인터페이스 대신 Impl을 사용하고 가까운 커플 링을 사용합니다.

관련 문제