Злоупотребление перегрузкой типов для создания шаблонного кода в C # - PullRequest
0 голосов
/ 05 апреля 2009

В проекте, над которым я сейчас работаю, мы добавили класс-оболочку для доступа к объекту HttpSessionState. Проблема в том, что текущее решение означает, что вы должны написать некоторый код, чтобы обернуть функциональность. Я придумал следующее решение

/// <typeparam name="TKey">Class used for generating key into session state storage.</typeparam>
/// <typeparam name="T">Type of object to store.</typeparam>
public static class SessionManager<TKey, T>
{
    static SessionManager()
    {
        _key = typeof(TKey).ToString();
    }

    private static readonly string _key;
    public static string Key
    {
        get { return _key; }
    }

     // Other functions ... (Set, IsSet, Remove, etc.)

}

Теперь вы можете создать нужное хранилище, просто используя

using StringStore= Test.SessionManager<System.Boolean, System.String>;
using StringStore2= Test.SessionManager<System.Version, System.String>;

StringStore.Set("I'm here");
StringStore2.Set("I'm also here");

Код работает и хорош тем, что вы можете легко создать класс-оболочку (единственный оператор using), и все будет статичным. Однако код немного злоупотребляет системой типов, так что, может быть, это немного затеняет? Прежде чем я добавил его, я хотел получить некоторую обратную связь, поэтому вот вопрос:

Если вы обслуживаете указанную систему и столкнулись с приведенным выше кодом, вы бы

  1. Выследить и убить того, кто проверял файл?
  2. Быть немного раздраженным попыткой быть умным, но позвольте ей скользить?
  3. Думаете, это был хороший способ избежать стандартного кода?

Вы бы предпочли использовать инструмент генерации текста], например T4 ?

Спасибо за любые ответы,

Мадс

Ответы [ 2 ]

1 голос
/ 05 апреля 2009

Итак, вы используете дженерики для создания ключа для словаря. Я бы сказал, что это определенно не очень хорошая идея по нескольким причинам.

Первая причина заключается в том, что он нарушает рассуждения за ключом словаря. Ключ должен иметь некоторое значение для значения, которое он имеет. Почему вы храните строку в System.Boolean? Что означает System.Boolean? Означает ли это, что строка является истинной или ложной? Подобная путаница затрудняет поддержку кода. Я также подозреваю, что значение ключа используется при приведении строки в другом месте кода. Это явно неправильное смешение словарей и дженериков.

Вторая причина заключается в том, что сеанс является общим для сеанса пользователя. Таким образом, два совершенно разных сегмента кода, написанные двумя разными разработчиками, получают доступ к этой общей папке. Что мешает одному разработчику определить System.Boolean в качестве подходящего типа ключа для данных A в своем коде, а другой использует System.Boolean в качестве типа ключа для данных B в своем коде? Теперь первый разработчик ожидает A при доступе к этому сегменту, но получает B. Значимый, уникальный ключ предотвратит это.

0 голосов
/ 05 апреля 2009

Если использование System.Boolean по сравнению с System.Version просто для различения разных типов для получения отдельных экземпляров _key в систему, мой ответ будет где-то между # 1 и # 2. По крайней мере, прокомментируйте это и создайте несколько фиктивных типов (возможно, просто пустых интерфейсов), чтобы использовать вместо использования произвольных типов .NET.

Я говорю это как кто-то, чья основная работа была проверкой кода в течение последних 6 месяцев. Если вы работаете со многими другими людьми, которым необходимо понимать этот код, вам будет сложно понять и поддерживать, если вы хотя бы не дадите читателю некоторую подсказку.

...