메소드에서 2 개의 값을 반환해야합니다. 내 접근 방식은 다음과 같습니다.
- 이 두 값을 유지하는 데 사용될 두 개의 필드로 내부 클래스를 만듭니다.
- 그 클래스 안에 메소드를 넣다
- 클래스를 인스턴스화하고 메소드를 호출하십시오.
메소드에서 변경 될 유일한 것은 결국 2 개의 값을 인스턴스의 필드에 지정한다는 것입니다. 그런 다음 해당 객체의 필드를 참조하여 해당 값을 지정할 수 있습니다.
좋은 디자인과 그 이유는 무엇입니까?
메소드에서 2 개의 값을 반환해야합니다. 내 접근 방식은 다음과 같습니다.
메소드에서 변경 될 유일한 것은 결국 2 개의 값을 인스턴스의 필드에 지정한다는 것입니다. 그런 다음 해당 객체의 필드를 참조하여 해당 값을 지정할 수 있습니다.
좋은 디자인과 그 이유는 무엇입니까?
답변:
나는 다음 줄을 따라 이것을 주장 할 것이다.
요약하자면,이 "데이터 객체"를 데이터와 행동을 모두 포함하는 본격적인 클래스로 바꿀 수 있는지 알 수있을 것입니다. 추가 설명으로 상태가 한 번 설정되므로 클래스를 변경할 수 없게 할 수 있습니다. 불변으로 설정하면 잘못 설정되거나 나중에 수정되는 것을 방지하는 데 도움이됩니다 (예 : 필드 중 하나를 null로 설정하고 전달 함).
편집 : Patkos Csaba가 올바르게 지적했듯이 여기에 적용되는 원칙은 단일 책임 원칙입니다 ( SRP )입니다. 만들려는 클래스에는 실제로 하나의 책임이 있어야합니다 ( 변경 이유 ). 이 설계 지침은 두 필드가 단일 클래스에 속하는지 여부를 파악하는 데 도움이됩니다. Wikipedia 예제를 고수하기 위해 클래스는 보고서 유형으로 간주 될 수 있으며,이 경우 SRP를 준수하지만 추가 정보 없이는 설명하기가 어렵습니다.
Python과 같은 다른 언어로 제공되는 Tuple의 개념이 있습니다.
쉽게 재사용 할 수있는이 일반화 된 클래스의 인스턴스를 반환 할 수 있습니다.
public class TypedTuple<L, R> implements Serializable {
private static final long serialVersionUID = 1L;
protected L left;
protected R right;
protected TypedTuple() {
// Default constructor for serialization
}
public TypedTuple(L inLeft, R inRight) {
left = inLeft;
right = inRight;
}
public L getLeft() {
return left;
}
public R getRight() {
return right;
}
}
create()
생성자에서 형식 매개 변수를 지정하지 않아도되도록 일반적인 정적 메서드 를 사용하는 것이 좋습니다. 또한이 클래스의 이름 은 2 튜플의 값만 나타낼 수 있기 때문에 Pair
대신 클래스 이름을 Tuple
지정합니다.
이 수업은 다른 수업에서 책임을지고있는 것으로 보이며,이 디자인이 훌륭하지 않다고 생각합니다.
다중 값을 반환하는 메서드의 경우 오히려
또는
두 번째 옵션의 예 :
public Class FooBarRetval {
private String foo;
private int bar;
public FooBarRetval (String foo, int bar) {
this.foo = foo;
this.bar = bar;
}
public String getFoo() {
return foo;
}
public int getBar() {
return bar;
}
}
메소드의 여러 리턴 값을 자체 클래스 / 구조에 넣는 것은 종종 요청 및 응답 에 대한 하나의 클래스가 있는 메시지 기반 시스템 에서 사용됩니다 . 이에 대한 예로는 SOAP (Simple Object Access Protocol)가 있습니다.
좋은 디자인과 그 이유는 무엇입니까?
최소한 꽤 흔합니다. 이것이 좋은지 나쁜지는 특별한 사용 사례에 달려 있습니다.
BitInteger[] java.math.BigInteger.divideAndRemainder(BitInteger val)
. 배열의 반환 값으로 2 개의 정수를 반환합니다.