.net: Жестко закодированные условия или ЧТО?

У меня есть форма (form1), которая содержит простой раскрывающийся список (dropdown1) и 2 текстовых поля (textbox1) и (textbox2).

Сценарий таков: пользователь вводит некоторый код в текстовое поле1, а затем на основе того, что он ввел, «тип» кода появится в текстовом поле2. Я должен сказать, что textbox2 доступен только для чтения.

Основная часть сценария заключается в том, что только если textbox2.text равен некоторым конкретным значениям (типу), например «Полимерный, Шнур и Сиденье», выпадающий список1 должен отображаться в форме1 и заполняться некоторыми цветами - получить из БД-

Считаете ли вы, что жесткое кодирование этого условия является правильным решением? Если нет, каковы ваши предложения?


person odiseh    schedule 04.01.2011    source источник
comment
Что вы подразумеваете под «типом» кода? Вы имеете в виду тип объекта в коде?   -  person Devendra D. Chavan    schedule 04.01.2011
comment
Нет, я имею в виду Полимерный, Сиденье, Шнур О котором я говорил в своей теме выше   -  person odiseh    schedule 04.01.2011
comment
Нет, не жестко запрограммировано. Создайте простой файл конфигурации, чтобы вы могли легко добавлять/изменять/удалять типы, не касаясь кода.   -  person InsertNickHere    schedule 04.01.2011
comment
если textbox2 доступен только для чтения, не могли бы вы изменить его на метку?   -  person Beth    schedule 20.01.2011


Ответы (5)


Жесткое кодирование никогда не бывает хорошим, если то, что вы жестко кодируете, может быть изменено.

Например, вам нужно добавить новый тип, и вам нужно все пересобрать.

Мое предложение: сделайте сопоставление между кодами и типами настраиваемым, если можете.

person JohnIdol    schedule 04.01.2011
comment
Вы имеете в виду, что я должен сделать это в базе данных? - person odiseh; 04.01.2011
comment
это возможность, сохраните некоторые настройки конфигурации в БД, что определенно лучше, чем жесткое кодирование. Альтернативой является файл конфигурации, но это действительно зависит от того, сколько данных. Если это серьезная сумма, то идите db. - person JohnIdol; 04.01.2011

Такие правила жесткого кодирования никогда не бывают хорошими.

Я бы создал класс, похожий на

class Something
{
    public string Keyword;
    public string KeywordType;
    public List<string> ListOfItems;
}

Затем я бы заполнил список Чем-то из базы данных, XML-файла или чего-то еще, неважно из чего.

public List<Something> ListOfSomethings;

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

ListOfSomethings.Add(new Something("keyword","KeywordType",new List<String>{"Item1","Item2"});

Затем, когда они вводят что-то в textbox1, вы можете связать или зациклить ListOfSomethings, чтобы найти нужный элемент, и установить для textbox2 значение Something.KeywordType, а затем , если количество Something.ListOfItems > 0 затем добавьте элементы в поле со списком и сделайте его видимым.

person John Petrak    schedule 04.01.2011

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

например, в свой вспомогательный класс добавьте

public const string[] SearchTypes = new string[] { "polymeric", "cord", "seat" };

добавьте метод расширения, чтобы помочь вам

public static string ToJavaScriptArray(this string[] array) {
    string r = "";

    foreach(string s in array)
        r += String.Format("'{0}',", s);

    return r.TrimEnd(',');
}

а затем в своем javascript на той конкретной странице, которую вы хотите, вы можете легко добавить

var searchTypes = new Array(<%= SearchTypes.ToJavaScriptArray() %>);

и используйте массив javascript в своем коде, чтобы проверить, содержится ли «тип» в этом массиве, например

давайте добавим прототип, чтобы помочь нам

Array.prototype.has = function(obj) {
    return this.indexOf(obj) >= 0;
}

тогда

if( searchTypes.has( document.getElementById('textBox1').value ) { 
    // show dropdown        
}

Надеюсь, поможет.

person balexandre    schedule 04.01.2011

Предполагая, что у вас уже есть логика, определяющая тип кода в текстовом поле1, список можно включить как:

Сначала определите перечисление типов кода,


enum CodeType
{
    Polymeric,
    Cord,
    Seat
}

Затем включите/отключите список,


public void test()
{
    if (Enum.IsDefined(typeof(CodeType), textBox2.Text.Trim()))
    {
        listBox1.Enabled = true;
    }
    else
    {
        listBox1.Enabled = false;
    }

    //Alternative
    //listBox1.Enabled = Enum.IsDefined(typeof(CodeType), textBox2.Text.Trim());
}

Обратите внимание: если список скрыт ранее, вам нужно изменить свойство Visible, а не свойство Enabled списка.

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

person Devendra D. Chavan    schedule 04.01.2011

Как уже говорили другие, жесткое кодирование никогда не бывает хорошей идеей. Вы упомянули, что обращаетесь к базе данных для цветов, почему бы не иметь простую таблицу поиска в базе данных для сопоставлений кода/типа? Хотя это, вероятно, самое сложное решение, оно является наиболее надежным по ряду причин.

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

person DustJones    schedule 28.01.2011