2012-05-10 3 views
0

감안할 때 웹 서비스 방법 : 리팩토링그런 종류의 리팩토링에 어떤 감각이 있습니까?

public void FindSomeEntities(int? Id, string param1, int? param2, ...) 

:

public void FindSomeEntities(SelectionParameters selectionParameters) 

class SelectionParameters 
{ 
    public int? Id; 
    public string param1; 
    public int? param2 
    ... 
} 

는 장점 : 원래 웹 서비스 메서드에서

  1. 너무 많은 매개 변수는 하나의
  2. 경우 감소가 변경할 필요가 있습니다. 인터페이스를 변경할 필요가 없습니다. 방법의 전자 - SelectionParameters의 정의는

단점 :

  1. 클래스 SelectionParameters는 비즈니스 가치 못한 - 그것은 단지 도우미 클래스 등을 사용되는 그것은 하나의 방법으로 사용됩니다. 결과적으로 우리는 에 1 개의 매개 변수와 많은 일회용 클래스가있는 많은 메소드를 갖게 될 것입니다.
  2. 사실 인터페이스가 변경되었으므로이 변경 사항을 약간 더 푸십시오. .
+1

나는 리팩토링을 피하고 싶지만, ** 미래에 맨틀에 고통스러워 할 것이다.웹 서비스의 경우 imho는 더 간단하고 (int, string ...) 매개 변수는 덜 복잡한 (사용자 정의 "컨테이너"클래스) 매개 변수보다 낫습니다. – Alex

+0

그래서 나는이 질문을했다. 나에게는이 일에 대한 감각이 없기 때문에 나는 동료를 설득하려고 노력했다. – Dima

답변

2

이 리펙토링을 Introduce Parameter Object이라고합니다. 매개 변수가 자연적으로 서로 관련되어 있으면 특히 여러 매개 변수 목록과 함께 자주 사용되는 경우 좋은 방법입니다. 매개 변수의 동일한 (하위) 세트가 다른 웹 서비스에 의해 공유되고 있다고 생각하는 어떤 이유가있을 경우

2

당신이 말한 것처럼, 지원하는 클래스의 수는 유지 보수 및 다른 용도로 사용되지 않을 수 있기 때문에 이러한 종류의 리팩터링에는 많은 가치가 있는지 확신하지 못합니다.

매개 변수에 예를 들어 'ID'와 같이 별개의 목적이 있다면 매개 변수를 쉽게 식별 할 수 있도록 분리하여 유지하는 것이 현명 할 것이라고 생각합니다. 메서드 본문입니다.

당신의 PARAMS이 메소드 본문에 유사/동일한 기능을 수행하는 값의 단지 모음입니다 그러나, 당신이 같이 당신의 방법을 params 키워드를 사용하여 정의에서 볼 수 있었다 :

public void FindSomeEnteties(params object[] theParameters) 

은 상황에 따라 다르다 인덱스 0을 꺼내서 ID 등으로 처리하기 위해 배열을 파헤 치고 싶든, 또는 메소드가 전달 된 모든 매개 변수에 대해 동일한 작업을 수행하기를 원할지 여부를 결정할 수 있습니다.

0

,이 합리적이다.

당신이하지 않더라도, 어쨌든 당신은 defacto struct를 인자리스트로가집니다. 이 관찰은 우리의 PARLANSE 프로그래밍 언어에서 실현됩니다.이 프로그래밍 언어는 항상 '?'라는 함수에 대한 단일 인수를가집니다. (일종의 OO에서 "자기"와 같은). 이 인수에는 유형이 있습니다. 그것은 스칼라 또는 복합 변수 (int 또는 string)이거나 구조체 일 수 있습니다. 일반적으로 구조체 선언은 struct를 정의합니다. PARLANSE에서 다중 인수로 나타나는 것을 작성하면 암시 적으로 구조체가 정의됩니다. 인수 목록이 하위 함수에 전달되는 경우 하위 함수를 '?'로 간단히 호출 할 수 있습니다. 전체 인수 목록이 전달됩니다.

관련 문제