У меня небольшая проблема. У меня есть часть мониторинга приложений в структуре, которая используется несколькими приложениями.

Прямо сейчас у меня есть такая функциональность:

public enum Vars
{
   CPU,
   RAM
}

public void Add(Vars variable, object value)
{
   [...]
}

Переменная, которая используется как параметр в методе Add, будет использоваться как имя записи в базе данных. Теперь у меня появилось требование, чтобы приложения могли указывать собственные переменные вне фреймворка. Поскольку вы не можете наследовать от перечисления, это вызывает некоторые проблемы.

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

Возможность 1:

public void Add(enum variable, object value)

Этот метод принимает все виды перечислений, поэтому пользователи могут использовать перечисления Vars, а также перечисления, которые они определили сами. Проблема с этим решением: возможно, что пользователи будут использовать одни и те же имена как в .. приложении, так и во фреймворке. Я не могу различать два перечисления со значением «CPU» (Framework может хранить процентные значения как «CPU», приложение может сохранять использование процессора как «CPU»).

Возможность 2:

Второй метод будет классом вместо перечисления, например:

public class Vars
{
    public const string CPU = "CPU";
    public const string RAM = "RAM";
}

Из минусов тут: 1. Больше писать. 2. Мне нужно было бы определить параметры как строки:

public void Add(string variable, object value);

Это также может привести к неправильному использованию (приложения, которые добавляют строки напрямую, вместо определения класса, наследуемого от Vars).

Любые мысли о том, как определить модель, которая:

  • Может быть унаследовано (для расширения значений значениями, специфичными для приложения)
  • Может использоваться как параметр
  • Гарантирует, что нет двойных (= одно и то же значение) записей?
1
cb_dev 11 Фев 2014 в 16:27
Ознакомьтесь с stackoverflow.com/questions/ 9232488 /…
 – 
Paul Zahra
11 Фев 2014 в 16:35

1 ответ

Лучший ответ

Контекст не совсем понятен, но как насчет создания класса

public class Vars
{
    public static Vars CPU = Vars.Get("CPU", 1);
    public static Vars RAM = Vars.Get("RAM", 2);

    //You can keep one of the params, name or id
    private Vars(string name, int id)
    {
        ...
    }

    public static Vars Get(string name, int id)
    {
        //check if id or name exists in static dictionary, and return that instance or create new one
    }
}


public void Add(Vars variable, object value);

Теперь пользователь может создать любой параметр и перейти к методу,

Vars newVar = Vars.Get("MyNewParam", 10);

Вы можете легко проверить, является ли переданный параметр тем, о котором вы знаете

Метод Get возвращает тот же экземпляр, если параметры совпадают

3
Arsen Mkrtchyan 11 Фев 2014 в 16:46
Вы также можете улучшить этот фрагмент, добавив проверку на уникальность в конструкторе. Добавьте статический HashMap<string> и добавьте туда все значения name. Если значение уже существует, может быть сгенерировано исключение.
 – 
Impworks
11 Фев 2014 в 16:35
@Impworks, заметил что после поста и уже редактировал, спасибо :)
 – 
Arsen Mkrtchyan
11 Фев 2014 в 16:39