2012-12-19 5 views
8

인터페이스를 구현하여 사람들이 우리의 핵심 기능을 확장 할 수있는 프레임 워크를 작성하려고합니다. 아래는이 인터페이스에 대한 간단한 예제입니다.메서드 매개 변수와 매개 변수 개체

public interface MyInterface 
{ 
    IData GetData(string p1, char p2, double p3); 
} 

최근에, 우리는이 인터페이스 (내가 따라 암호를 해독하지 말아야 알고 있지만, 사실은 우리가 아직이 인터페이스를 구현하는 모든 제 3 자이없는 것입니다을 수정하기로 결정했습니다, 그래서 우리는 기회가 이 인터페이스를 올바르게 구현하기위한 "do-over").

소프트웨어가 제대로 작동하려면이 인터페이스에 2 개의 매개 변수를 추가해야합니다. 우리가 생각하는 두 가지 방법은 다음과 같이 서명에 추가됩니다

public interface MyInterface 
{ 
    IData GetData(string p1, char p2, double p3, bool p4, DateTime p5); 
} 

또는하여

public class MyParameters 
{ 
    public bool p4 { get; set; } 
    public DateTime p5 { get; set; } 
} 

같은 매개 변수 개체를 만드는 등 같은 방법의 끝 부분에 추가 :

public interface MyInterface 
{ 
    IData GetData(string p1, char p2, double p3, MyParameters p4); 
} 

나는 어떤 방법으로 진행할 지 "가장 올바른"지침을 찾고 있습니다. 두 범주 모두에서 찬반 양론을 볼 수는 있지만, 편견이 나를 잘못된 길로 인도하는 것은 원하지 않습니다.

내 주요 관심사 중 일부는 다음과 같습니다 소프트웨어의

  • 확장 성 - 나는 사용자가
  • 유지 보수성 인터페이스를 구현하여 나는 아직 생각하지 않은 일을 할 수 있어야합니다 - 이상적으로, 나는
  • 청소 API 다시 GetData의()를 호출을 담당하는 코드를 만지지 필요가 없습니다 싶습니다 - 제 3 자 개발자가 싫증이 나다 내가 할에 도착 솔루션을하지 않으을

이 문제에 대한 지침을 얻기 위해 온라인에서 묻는 질문을 모르겠습니다. 나는 대답이 "의존적이다"(p1-p5가 GetData() 함수의 목적과 얼마나 관련이 있는지 등), 누군가가 나를 평가할 때 도움을 요청해야하는 질문 목록을 가리킬 수 있다고 생각한다. 한 솔루션이 다른 솔루션보다 나은지 여부

관련 : Post 1 Post 2

답변

2

날이 대답을 해보자. 의이 옵션을 평가하자 : 아래의 인터페이스

public interface MyInterface 
{ 
    IData GetData(string p1, char p2, double p3); 
} 

가 고장

1) 경우

a)와 전혀 사용하지 않아야합니다, 당신은 그것을 다시 작성하기 위해 구현을 강제해야한다. 따라서 메소드 정의를 변경하십시오.

public interface MyInterface 
{ 
    IData GetData(something else); 
} 

B)하지만 당신은 단지 새로운 정의를 사용하는 사용자를 장려 할 필요는, 당신은 첫 번째가 사용되지 않습니다를 말하는 새로운 과부하를 만들 수 있습니다.결합 된 경우

새로운 정의에 대해
public interface MyInterface 
{ 
    //xml to tell them this is deprecated. 
    IData GetData(string p1, char p2, double p3); 
    IData GetData(string p1, char p2, double p3, and whatever); 
} 

는, 사람이 모델에 대해 모르고 줄 수있는 원 스톱 솔루션이 없다,하지만 당신은 자신에게 물어,

나는) "은 매개 변수 자체가 하나의 개체를 나타낼 수 있습니다 "현실 세계에서 매개 변수의 단위가 하나만있는 것을 의미합니까?"그렇다면 그렇게하십시오. 그렇지 않다면하지 마십시오. 나는 당신이 이런 종류의 딜레마에 빠졌을 때 추상적 인 수준에서 생각하는 것에 의지해야한다고 생각합니다. 나는 클럽 활동에있어 어떤 점이 확실하지 않다. bool p4DateTime p5. 실제 생활에서 뭔가를 나타내는 매개 변수를 사용해야합니다. 그것들의 조합이 의미가 없으면 그대로 두십시오. 그러한 논리적 사고 방식에 그러한 클럽 활동을 맡기는 데 더 많은 성공을 거둘 것입니다. 다른 프로그래머에게 정의를 남기고, 자신의 작업을 쉽게하기 위해 메소드 서명을 매우 논리적이어야합니다.

2) 클래스가 단순히 데이터 집합을 보유하는 것보다 많은 일을 할 수 있습니까? 클래스는 여기에서 옵션이어야합니다.

3) 클래스 정의 만 제어하고 구현하지 말아야합니까? 이 경우 입력의 공개 인터페이스를 정의하고 구현을 고객에게 맡깁니다.

IV) 내 인터페이스를 수정하면 기존 구현이 손상되지 않아야합니까? 오버로드하는 것이 좋습니다.

두 가지 선택이 있지만 서명을 평평하게 두거나 클럽에 남겨 두라고 말합니다. 클럽없이

1)

a) 적은 코드, 다른 층의 감소.

b) 다른 클래스를 공개 할 필요가 없습니다. 클럽 활동으로

2) :

가) 함수에 갈 수있는 모델의 더 나은 이해를 제공 - 당신의 의도는 분명하다.

b) 새로 형성된 클래스를 구성하기 위해 선택적 세부 사항을 추가해야하는 경우 나중에 쉽게 확장 할 수 있습니다. 당신이

public interface MyInterface 
{ 
    IData GetData(Input p1); 
} 

는 이제 부울과 날짜 시간과 같은 선택 사항을 추가 할 수 있습니다 클래스

class Input { 
    string p1; char p2; double p3; 

    public Input(string p1, char p2, double p3){ 
    } 
} 

및 인터페이스를 가지고 있다고 할 수 있습니다. 그들은 선택적이므로 생성자를 int로 강제 설정하지 않아도됩니다. 여전히 동일한 생성자를 사용할 수 있으며 필요한 경우 생성자 외부에서 수정할 수있는 권한을 사용자에게 부여 할 수 있습니다.

class Input { 
    string p1; char p2; double p3; bool p4; DateTime p5; 

    public Input(string p1, char p2, double p3){ 
    } 
} 

인터페이스는 여전히 동일 할 수 있습니다. 내가 말했듯이 이런 종류의 것을 끌어내는 자극은 슬프게도 당신의 모델에 달려 있습니다. 즉, 그룹화가 의미를 가질 수있는 경우 클래스 또는 인터페이스로 설정합니다 (논리를 제어 할 사람에 따라 다름).

2

왜 모든 길을 갈은 :

public Interface IParameters 
{ 
    string p1 {get; set;} 
    char p2 {get; set;} 
    double p3 {get; set;} 
    bool p4 { get; set; } 
    DateTime p5 { get; set; } 
} 

public interface MyInterface 
{ 
    IData GetData(IParameters p); 
} 
+0

매개 변수 유형에 대한 인터페이스가있는 것은 좋지만 인터페이스가 버전 화 될 수 없다고 생각하면 API가 확산되면 더 이상 추가 할 수없는 기능 (예 : 하나 이상의 매개 변수 추가)이 기존 유형을 손상시키지 않고 매개 변수 유형에 추가됩니다. 코드. –

관련 문제