2008-09-21 3 views
10

오버 인터페이스가 가능합니까? 이제는 시스템을 설계 할 때 인터페이스에서 시작하여 점진적으로 인터페이스와 함께 단위 테스트를 작성합니다. 제대로 작동하는 패턴이 될 때까지 ... 몇 가지 구체적인 클래스를 작성하고 이들에 대해 단위 테스트를 설정합니다..NET - 인터페이스를 통해 수행 할 수 있습니까? 인터페이스를 사용할 수없는 경우

저는 이제 인터페이스를 좋아하는 사람입니다. 코드를 제어 할 때 일반적으로 지나가는/돌아 오는 primatives 나 인터페이스를 끝내게 될 것입니다. 지금까지는 이것이 이상적이라고 생각했습니다. 쉽게 적응하고 향상시킬 수 있습니다. 시스템은 일반적으로 종속 시스템에 영향을 미치지 않습니다.

분명히 인터페이스를 사용하는 이유는 팔 필요가 없지만 모든 것이 인터페이스가되는 ps인지 궁금합니다. ps.

interface ISomethingProvider 
{ 
    ISomething Provide(ISomethingOptions options); 
} 

이 정말 맨 위에인가 : 내가 좋아하는 뭔가 더 이야기하고

interface IStringCollection : ICollection<string> 
{ 
} 

: 나는 하지 같은 미친 뭔가로 빈 인터페이스에 대해서 이야기하고? 내 추론은 모든 유형이 어떤 시점에서 인터페이싱에서 얻을 수 있다는 것입니다. 내가 가진 유일한 유일한 문제는 내가 수업을 설계하는 더 좋은 방법이라고 생각하는 것을 배워야한다는 것입니다. 상호 작용과 '해킹'이 계속되고 있습니다.

이가 Timebomb이 경우에 대한 귀하의 의견을 사랑하고겠습니까이 정말 인터페이스를 작성하는 방법에 대해 많이하지 PS- 당신이

..하지 대 인터페이스로 결정 때.

답변

1

당신이 사방 인터페이스가있는 경우 디버거와 단계 전에 최종 호출 스택을 해결하는 진짜 고통이 될 수 있습니다. 난 경우에만 인터페이스를 선호하는 경향이 :

  1. 당신이해야하는 사람들에 동의하는 팀 구성원을 필요 그들은 코딩을 시작하기 전에 - 당신이 실제로 문제를 해결하기 위해 인터페이스를 필요로 할 때 인터페이스가 다음 국경 정확히
  2. 을 문서화 서로
  3. 를 확장하지 않도록 적어도 두 가지 구현 당신은 2
1

내가 인터페이스 물건에 cowork를 특히 다른 사람들을 위해, 디자인을 복잡하게 찾을 경우 기대합니다. 나에게 잘못 이해하지 마라. 인터페이스는 많은 것들을 위해 훌륭하지만, 대부분 둘 이상의 클래스가 공통 인터페이스를 공유하도록하려는 경우가 대부분이다. 필요한 절제와 함께 사용 - 당신은 당신이 갑자기 인터페이스를 필요로하는 상황에서 자신을 찾을 경우

는 ReSharper에서 같은 도구와 리팩토링은 바람 : 무엇과 마찬가지로

4

입니다. 자신에게 "필요하십니까?"이라고 자문하십시오.

5

인터페이스는 동작에 대한 계약을 설명합니다. 행동 패턴에 따라 일부 개체 집합을 처리해야하는 경우 개체의 구조를 간단하게 설명하는 경우 인터페이스가 유용합니다.행동 관련 객체를 생성하는 팩토리를 사용하거나 라이브러리의 일부에 대한 동작 계약을 설정하는 등 사용하기 좋은 이유가 필요하다고 생각합니다. 목적없이 인터페이스를 사용하면 라이브러리를 읽기/이해/유지하기가 어려울 수 있습니다.

1

이것은 .NET에서만 발생하는 것은 아니며 Java에서 이와 동일한 문제가 자주 발생합니다.

완전히 분명한 요구 사항이 아니라면, 인터페이스를 사용하지 않고 필요가 명확 해지면 간단히 리팩터링합니다.

실용적인 접근법은 단지을 작동시킬 수있는 가장 간단한 것을 이라고 말하고 아키텍처 우주 비행에 빠지지 않습니다.

5

간단히 말해서 프로젝트를 오버 인터페이스 할 수 있습니다. 상황이 실제로 추상 기본 클래스와 인터페이스를 요구할 때 고려해야합니다. 둘 다 비슷하지만 둘 다 See Here을 사용하는 것이 뚜렷한 장점이 있습니다. 일반적으로 사람들은 추상적 인 기본 클래스를 사용해야 할 때 인터페이스를 사용합니다. 객체 지향 (OO) 관점에서 볼 때 인터페이스는 방대한 클래스에 걸쳐있을 수있는 공통적 인 동작을 나열하는 데 사용해야합니다. 예를 들어 Move()라는 메서드로 IMove 인터페이스를 가질 수 있습니다. 이제 비행기, 자동차, 사람, 곤충 클래스를 가지고 있다고 상상해보십시오. 비행기와 자동차는 추상 차량 클래스에서 상속받을 수 있지만 여전히 IMove를 사용해야하며 곤충과 사람도 사용할 수 있지만 모두 이동을 다르게 구현합니다. 내가 알기 론, 자아가 포함되어 있습니다. 사람들은 인터페이스를 사용하여 클래스를 "그룹화"하는 경향이 있습니다. 실제로는 기본 클래스에서 처리해야합니다.

+1

네가 본질적으로 두 클래스의 인터페이스를 구현하는 동일한 메소드를 작성했다면 추상 기본 클래스가 필요하다. –

1

테스트 목적으로 인터페이스를 너무 많이 사용하지 않는 경향이 있습니다. 나는 오히려 그것이 내가 필요한 것만을 실천할 다른 대상과 테스트를 구축 할 때까지 개인적인 가치를 공개하고 /하거나 개봉 및 테스트하는 동안 클래스 및/또는 임시 방법을 공개 할 것입니다. 그런 식으로 변화를 가라 앉히기 위해 엉덩이에 고통을 느낀다.하지만 뭔가를 잊어 버렸을 때 검사가 알려줄 것이다.

3

오버 인터페이스가 가능합니다. 내가 작업하는 규칙은 응용 프로그램에 인터페이스가있는 경우이를 구현하는 클래스가 적어도 두 개 (또는 가까운 미래에 구현 클래스를 추가 할 것으로 기대되는) 있어야한다는 것입니다.

테스트 용 모의 객체를 생성해야한다면 mock 클래스와 실제 클래스가 공통 인터페이스를 구현하는 것이 인터페이스를 사용해야하는 타당한 이유입니다.

응용 프로그램의 모든 인터페이스를 자동으로 사용하지 않는 것이 좋습니다. 특히 필요한 경우 일반적으로 단일 클래스를 인터페이스로 쉽게 리팩터링 할 수 있기 때문에 특히 그렇습니다. 내가 볼 또는 누군가가 내가 인터페이스를 이해하지 못하는 사람을 발견 한 알이

인터페이스 행동

에 대한 계약을 설명하는 말을들을 때마다

+1

현대 리팩토링 툴의 장점은 인터페이스를 사용하여 미래에 사용할 수있는 유연성을 가질 필요가 없다는 것입니다. –

2

.

인터페이스 이 아닙니다. 불가능하다. 인터페이스 은 처방, 강제 또는 어떤 식 으로든 행동을 제한하지 않습니다..

인터페이스는 인터페이스에 대한 계약을 설명하므로이 이름이 사용됩니다. 그들은 행동을하지 않습니다.

인터페이스 메소드에 제공 한 이름이 구현 된 사람에게 필수적인 동작을 암시 할 수는 있지만 그럴 필요는 없습니다. 행동 계약이 없으며 앞으로도 계속 될 수 있습니다.

특정 유형의 동작이 필요한 경우이를 적용하기 위해 클래스를 사용해야합니다 (예 : 템플릿 패턴 사용) - 모든 동작이있는 곳입니다.

인터페이스는 디자인 구성으로 정기적으로 남용되고 있으며 그 이유 중 하나는이 오류에 대한 광범위한 믿음 때문입니다.

+0

_documented_ 인터페이스는 행동에 대한 계약을 기술 할 수 있다고 주장합니다. 계약을 반드시 이행하지 않고 계약을 기술 할 수 있습니다. 개발자는 여전히 문서를 준수 할 책임이 있습니다. –

관련 문제