문제

다른 개발자들은 메소드에서 2~3개의 답변을 얻는 이 문제를 어떻게 해결하는지 궁금합니다.

1) 객체[]를 반환합니다.
2) 사용자 정의 클래스 반환
3) 여러 변수에 out 또는 ref 키워드를 사용합니다.
4) 간단한 Tuple<> 일반 클래스를 작성하거나 차용(F#)합니다.
http://slideguitarist.blogspot.com/2008/02/whats-f-tuple.html

현재 데이터 새로 고침을 수행하는 일부 코드를 작업 중입니다.새로 고침을 수행하는 메서드에서 (1) 새로 고침 시작 시간 및 (2) 새로 고침 종료 시간을 다시 전달하고 싶습니다.
나중에 세 번째 값을 다시 전달하고 싶을 수도 있습니다.

생각?이 주제에 대한 오픈 소스 .NET 프로젝트의 모범 사례가 있습니까?

도움이 되었습니까?

해결책

귀하의 질문은 앞으로 더 많은 데이터를 반환 할 가능성을 지적하므로 데이터를 포함하려면 자신의 클래스를 구현하는 것이 좋습니다.

이것이 의미하는 바는 더 많은 데이터를 수용하기 위해 변경 사항을 전달하는 객체의 내부 표현이 있더라도 메소드 서명이 동일하게 유지된다는 것입니다. 또한 가독성 및 캡슐화 이유에 대한 우수한 관행입니다.

다른 팁

그것은 결과가 무엇인지에 달려 있습니다. 그들이 서로 관련이 있다면, 나는 보통 커스텀 클래스를 만듭니다.

그들이 실제로 관련이 없다면, 나는 아웃 매개 변수를 사용하거나 메소드를 분할 할 것입니다. 방법이 관련없는 세 가지 항목을 반환하려는 경우 아마도 너무 많은 일을하고있을 것입니다. 이에 대한 예외는 웹 서비스 경계 나 "더 순수한"API가 너무 수다가 될 수있는 다른 것들을 통과 할 때입니다.

두 가지, 보통 4)

그 이상, 2)

Code Architeture Wise는 특정 변수가 다소 변경 될 때 항상 사용자 정의 클래스를 사용하여 갈 것입니다. 왜요? 클래스는 실제로 종종 사용되는 데이터 유형의 "청사진"이기 때문에 자체 데이터 유형을 작성하는 경우이 경우 자신의 데이터 유형을 작성하면 좋은 구조를 얻고 다른 인터페이스를위한 다른 프로그램을 돕는 데 도움이됩니다.

개인적으로, 나는 꺼내/ref params를 싫어하므로 그 접근법을 사용하지 않을 것입니다. 또한, 대부분의 경우, 둘 이상의 결과를 반환해야한다면 아마도 뭔가 잘못하고있을 것입니다.

실제로 피할 수 없다면, 당신은 아마도 맞춤형 클래스를 작성하는 장기적으로 가장 행복 할 것입니다. 어레이를 반환하는 것은 짧은 Teerm에서 쉽고 효과적이기 때문에 유혹적이지만 클래스를 사용하면 문제가 발생하는 것에 대해 크게 걱정할 필요없이 향후 반환 유형을 변경할 수 있습니다. 누군가가 반환되는 배열에서 두 요소의 순서를 교환하면 디버깅 악몽의 가능성을 상상해보십시오 ....

1 ~ 2 개의 추가 변수 인 경우 사용합니다 (예 : 함수는 실제 중요한 결과 인 BOOL을 반환하지만 로깅 목적으로 함수가 얼마나 오래 실행되는지를 반환 할 수있는 Out 매개 변수만큼 길다).

더 복잡한 것은 보통 사용자 정의 구조/클래스를 만듭니다.

C# 프로그래머가하는 가장 일반적인 방법은 별도의 클래스로 반환하려는 항목을 포장하는 것입니다. 이것은 당신에게 가장 많은 유연성을 제공 할 것입니다, IMHO.

때에 따라 다르지. 내부 전용 API의 경우 일반적으로 가장 쉬운 옵션을 선택합니다. 일반적으로 그게 나왔습니다.

공개 API의 경우, 사용자 정의 클래스는 일반적으로 더 의미가 있지만, 그것이 상당히 원시적이거나 함수의 자연스러운 결과가 부울 ( *.tryparse)이라면 out param을 고수 할 것입니다. 부울에 암시적인 캐스트로 사용자 정의 클래스를 할 수 있지만 일반적으로 이상합니다.

귀하의 특정 상황에서는 간단한 불변의 Dateange 클래스가 나에게 가장 적합한 것 같습니다. 기존 사용자를 방해하지 않고 해당 새 값을 쉽게 추가 할 수 있습니다.

새로 고침 시작 및 종료 시간을 다시 보내려면 DatareFreshResults라고 불리는 가능한 클래스 또는 구조물을 제안합니다. 가능한 세 번째 값이 새로 고침과 관련이 있다면 추가 할 수 있습니다. 구조물은 항상 가치로 전달되므로 힙에 할당 된 것은 쓰레기 수집 할 필요가 없습니다.

어떤 사람들은 사용합니다 KeyValuePair 두 값의 경우. 그래도 두 가지를 Key 그리고 Value. 그다지 설명이 아닙니다. 또한 다음을 추가하면 진지하게 이익을 얻을 수 있습니다.

public static class KeyValuePair
{
    public static KeyValuePair<K, V> Make(K k, V v) 
    { 
        return new KeyValuePair<K, V>(k, v); 
    }
}

유형을 만들 때 유형을 지정하지 않아도됩니다. 일반적인 방법은 유형을 유추 할 수 있으며 일반적인 클래스 생성자는 할 수 없습니다.

시나리오의 경우 일반 범위 {T} 클래스 (범위 유효성을 확인 함)를 정의 할 수 있습니다.

방법이 비공개 인 경우 보통 튜플을 사용합니다. 내 도우미 도서관. 공개 또는 보호 된 방법은 일반적으로 항상 분리 될 자격이 있습니다.

사용자 정의 유형을 반환하지만 클래스를 사용하지 말고 구조물을 사용하십시오 - 메모리 할당/쓰레기 수집 오버 헤드는 단점이 없음을 의미합니다.

2 인 경우 쌍.

2 명 이상의 클래스.

또 다른 해결책은 이름이 지정된 객체 참조 사전을 반환하는 것입니다. 나에게 이것은 커스텀 리턴 클래스를 사용하는 것과 거의 동일하지만 혼란이 없습니다. (그리고 RTTI와 반사를 사용하는 것은 역동적으로도 다른 솔루션과 마찬가지로 TypeSafe입니다.)

결과의 유형과 의미, 메소드가 비공개인지 여부에 따라 다릅니다.

개인 메서드의 경우 일반적으로 클래스 라이브러리의 Tuple을 사용합니다.

공개/보호/내부 메소드의 경우(예:비공개가 아님) out 매개변수나 사용자 정의 클래스를 사용합니다.

예를 들어, 실패 시 예외를 발생시키는 XYZ 메서드와 부울을 반환하는 TryXYZ 메서드가 있는 TryXYZ 패턴을 구현하는 경우 TryXYZ는 out 매개 변수를 사용합니다.

결과가 순서 지향적인 경우(예:처리해야 하는 고객 3명을 반환하는 경우) 일반적으로 일종의 컬렉션을 반환합니다.

그 외에는 보통 사용자 정의 클래스를 사용합니다.

메소드가 2 ~ 3 개의 관련 값을 출력하면 유형으로 그룹화합니다. 값이 관련이 없다면,이 방법은 너무 많은 일을 할 가능성이 높으며이를 여러 가지 간단한 방법으로 리팩토링 할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top