Использование директивы для объявления псевдотипа в C#

Я унаследовал некоторый исходный код, который я только начинаю копать, и я обнаружил, что предыдущий владелец использовал директиву using в качестве псевдонима для List<T>, но я никогда раньше не видел такого конкретного подхода.

namespace MyNamespace
{
    using pType1 = List<type1>;
    using pType2 = List<List<type1>>;

     // classes here
}

Оба эти элемента довольно активно используются в коде, а также являются возвращаемыми типами нескольких ключевых методов в коде. Я понимаю, чего он пытался достичь, используя простое имя, а не повторяя List<type1> и List<List<type1>> снова и снова. Я обсуждаю, создавать ли реальный тип для замены операторов использования, но прежде чем я потрачу время, мне было интересно, есть ли какие-либо плюсы/минусы в сохранении текущей реализации.


person psubsee2003    schedule 08.12.2011    source источник
comment
Действительно редко можно увидеть такие обычаи. Именно в базах кода авторы обычно пытаются скрыть свое непонимание того, где могут быть полезны дженерики. Я видел такие вещи, как List<Dictionary<List<type1>, IEnumerable<Foo>>> :-) Даже если дать этому зверю имя, он все равно зверь.   -  person Darin Dimitrov    schedule 08.12.2011


Ответы (2)


Как правило, если структура данных представляет некоторый объект в модели предметной области вашего приложения, она должна иметь свой собственный тип; это делает код более ясным и понятным. С другой стороны, если вам просто нужен List<List<string>> для промежуточной обработки данных, нет никакой реальной пользы в создании для этого подходящего типа.

В вашем случае, поскольку первоначальный разработчик потрудился создать псевдоним для типа, логично, что он будет часто использоваться, что указывает на сценарий «представляет сущность». Если это так, определенно продолжайте и создайте новый тип для структуры (возможно, что-то более подходящее, чем голые списки, и обычно что-то определенное в терминах интерфейсов, а не конкретных классов, но это зависит от того, что вы на самом деле там моделируете).

person Jon    schedule 08.12.2011
comment
Спасибо, Джон ... твой ответ был для меня лучшим доводом в пользу сохранения текущей структуры. Я собираюсь реализовать свои собственные типы. Спасибо всем - person psubsee2003; 10.12.2011

Если эта конструкция используется так интенсивно, как вы говорите, я бы определенно заменил ее реальными типами (явно выписав список или создав новый тип). Если кто-то изменит одно из объявлений типа, например

using pType1 = List<type2WhichType1InheritsFrom>;

потому что он (она) думает, что базовая версия делает что-то лучше, не глядя на все места, где она используется, могут быть некоторые нежелательные побочные эффекты.

person Matten    schedule 08.12.2011
comment
На практике согласен с вами, но теоретически, если соблюдается замена Лискова, это не должно вызывать проблем. - person Daniel Elliott; 08.12.2011
comment
Со сменой авторов исчезает знание конкретных деталей реализации. Сказав это, я всегда стараюсь сделать свой код максимально удобным для сопровождения. У нас было несколько проектов, в которых оригинальные авторы покидали компанию и давали нам очень интересные конструкции кода только для того, чтобы гарантировать, что изменение одной строки сломает все приложение... Я ненавижу практику против теории :-) - person Matten; 08.12.2011
comment
@DanielElliott Разве это не идет в другом направлении? Если у меня есть List‹object›, я могу изменить его на List‹string› только в том случае, если нет места, где нестроковый объект добавляется в список. - person phoog; 08.12.2011