2012-03-30 2 views
5

나는 동료 개발자의 코드를보고 거의 울었다. 메소드 정의에는 12 개의 인수가 있습니다. 내 경험으로 .. 이건 좋지 않아. 그것이 나라면, 나는 어떤 종류의 물건을 보냈을 것이다.많은 인수를 취하는 메서드를 만드는 더 좋은 방법은 무엇입니까? (10+?)

다른 방법으로/더 선호하는 방법이 있습니까? (즉,이를 수정하고 이유를 설명하는 가장 좋은 방법은 무엇입니까?)

public long Save (
    String today, 
    String name, 
    String desc, 
    int ID, 
    String otherNm, 
    DateTime dt, 
    int status, 
    String periodID, 
    String otherDt, 
    String submittedDt 
) 

내 가난한 변수 이름을 무시 - 그들은

+1

인수가 어떤 식 으로든 관련이 있습니까? 그렇다면 의미를 설명하는 객체에 그룹화하십시오. 희망이 도움이됩니다. –

+0

나는 이것이 합리적인 질문이라고 생각했다. – Cody

답변

5

언어에 따라 크게 달라질 수 있습니다. 컴파일 타임 유형 검사없이 언어 (예를 들어, 파이썬, 자바 스크립트 등) 당신은 (파이썬에서 일반적 : 당신이 인수로 전달 사전처럼 액세스 할 수 있습니다) 키워드 인수를 사용해야에서

또는 개체/사전을 수동으로 인수로 전달합니다 (자바 스크립트에서는 공통).

당신이 기술 한 "인자 hell"은 컴파일 타임 typechecking으로 특정 언어에 대해 "올바른 방법"을 사용하기도합니다. 왜냐하면 객체를 사용하면 typechecker에서 의미를 모호하게 만들 것이기 ​​때문입니다. 그런 다음 솔루션은보다 나은 언어 을 사용하여 개체를 인수로 패턴 일치시킬 수있는 컴파일 타임 typechecking을 사용합니다.

2

예, 사용 객체 예입니다. 또한이 정보가 모두 필요한 경우 기능이 너무 많이 수행 될 수 있으므로 더 작은 기능을 사용하십시오.

+1

그건 내가 생각한거야. 실제로는 테이블에 데이터를 삽입하는 것입니다. – Cody

1

기능이 얼마나 복잡한 지에 따라 다릅니다. 그 논쟁들 각각에 대해 사소한 일을한다면 그것은 아마도 분열되어야합니다. 그냥 통과하면 개체에 수집해야합니다. 그러나 테이블에 행을 만들면 큰 문제가 아닙니다. 귀하의 언어가 키워드 논쟁을 지원한다면 그것은 적은 거래입니다.

1

개체를 사용하십시오.

class User { ... } 
User user = ... 
Save(user); 

결정을 통해 새로운 매개 변수를 쉽게 추가 할 수 있습니다.

0

당신이 겪고있는 문제는 메서드 호출을보고 어떤 인수가 어떤 값을 받고 있는지 알 수 있다고 상상해보십시오. 이것은 자바와 같은 언어에서의 치명적인 문제입니다. 이름있는 인수를 전달하기 위해 키워드 인수 나 JSON 해시와 같은 것이 없습니다.

이 경우 Builder pattern은 유용한 솔루션입니다. 더 많은 물체, 총 3 가지이지만 설명하는 문제에 대한 더 이해하기 쉬운 코드로 연결됩니다. 따라서이 경우에는 세 개의 객체는 다음과 같은 것이다 :

  1. : 상태 엔티티, 일반적으로 불변 (즉, 게터 만)이 ThingBuilder
  2. : 팩토리 클래스가하는 것 엔티티를 만들고 해당 값을 설정 .
  3. ThingDAO : 작성자 패턴을 사용할 필요는 없지만 질문을 해결하십시오.

상호 작용

/* 
ThingBuilder is a static inner class of Thing, where each of its 
"set" method calls returns the ThingBuilder instance being worked with 
while the final "build()" call returns the instantiated Thing instance. 
*/ 
Thing thing = Thing.createBuilder(). 
       .setToday("2012/04/01") 
       .setName("Example") 
       // ...etc... 
       .build(); 

// the Thing instance as get methods for each property 
thing.getName(); 

// get your reference to thingDAO however it's done 
thingDAO.save(thing); 

결과는 명명 된 인수와 불변의 인스턴스를 얻을 수있다.

관련 문제