Структура Pair<F, S>

В ряде случаев бывает удобно использовать небольшие структуры, не содержащие методов. Однако не всегда хочется видеть у себя в коде множество одинаковых структур, предназначенных, к примеру, лишь для возвращаемых значений каких-либо методов.

C#:Select code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/// <summary>
/// Шаблонная структура, предназначенная для совместного хранения 2 классов.
/// </summary>
/// <typeparam name="F">Тип 1-го класса.</typeparam>
/// <typeparam name="S">Тип 2-го класса.</typeparam>
public struct Pair<F, S>
{
    public Pair(F first, S second)
    {
        First = first;
        Second = second;
    }

    public readonly F First;
    public readonly S Second;
}

Например, у вас есть метод M(p1, p2, p3, p4) и вы хотите, чтобы он возвращал результат в объектах типа A и B. Без использования каких-либо ухищрений, вы наверняка сделаете метод таким:

C#:Select code
public void M(P1 p1, P2 p2, P3 p3, P4 p4, out A a, out B b)

или таким:

C#:Select code
public A M(P1 p1, P2 p2, P3 p3, P4 p4, out B b)

или еще одним из множества некрасивых вариантов.

Некрасивость таких вариантов объявления метода можно сформулировать от обратного: «красивый» метод имеет только входные параметры и возвращает результат (единственный), как значение самого метода, таким образом даже при беглом взгляде на метод, всегда легко понять где входные параметры, а где выходные.

При помощи шаблонной пары, метод будет выглядеть так:

C#:Select code
public Pair<A, B> M(P1 p1, P2 p2, P3 p3, P4 p4)
{
    ....
    return new Pair<A, B>(a, b);
}

и его вызов можно будет назвать красивым:

C#:Select code
var result = M(p1, p2, p3, p4);
A a = result.First;
B b = result.Second;

Удачи!

Обсуждение на форуме: http://usings.ru/forum/viewtopic.php?t=4

admin опубликовано 2009-6-10 Рубрика: Паттерны | Метки: , ,

Один ответ Оставить комментарий

  1. #1drinian @ 2009-9-17 15:20 Ответ

    Более полно поддержка кортежей реализована в библиотеке Lokad — http://abdullin.com/shared-libraries/

Ответить

(Ctrl + Enter)