Пролил длинный "или" оператор условия в функцию C # - PullRequest
0 голосов
/ 02 мая 2011

Оригинал У меня есть функция условия IF в моем коде, см. Ниже:

 //check property and/or i.Prod and then show the popup
 void _incident_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) </i>
    {

       // MessageBox.Show(e.PropertyName); //Check what property name is


        /*
        if (_incident.ProductID == 182 ||_incident.ProductID ==1959 && _triggerPopup) //If product ID is 183 in incident 
        {
            MessageBox.Show("The GO Classic will soon be end of life, make sure you propose the customer to buy a new device and offer maximum 20% discount to reward his/her loyalty (NOTE: refurbished devices are not included in this offer).");
            _triggerPopup = false; //Do not pop up
        }*/


    }

В настоящее время нам нужно добавить больше ProductID в условие if, например еще 20 ProductID в условие if, код будет выглядетьбеспорядок и неопрятный.

Я думаю, что смогу построить функцию, чтобы немного изменить код;

if (checkProductID(_incident.ProductID)&& _triggerPopup) 
        {
            MessageBox.Show("The GO Classic will soon be end of life, make sure you propose the customer to buy a new device and offer maximum 20% discount to reward his/her loyalty (NOTE: refurbished devices are not included in this offer).");
            _triggerPopup = false; //Do not pop up
        }

    }
    protected Boolean checkProductID(int productID)
    {
        switch (productID)
        {
            case "182":
                return true;
                break;

        }
    }

Мне интересно, это правильный способ сделать это.Я пишу эту функцию checkProductID правильно?другой лучший способ сделать это?спасибо

Ура, Цин

Ответы [ 5 ]

2 голосов
/ 02 мая 2011

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

С учетом сказанного у вашего подхода есть несколько проблем.

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

Меньшая проблема заключается в том, что вы сравниваете целые числа со строками в вашем коде.Это, вероятно, просто ошибка в вашем примере кода, но вы должны знать, что это не очень хорошая идея.: -)

1 голос
/ 02 мая 2011

Я бы, вероятно, использовал свойства (вместе с перечислениями):

public enum ProductStates
{
  OutOfOrder=0,
  InStock=1,
  New=2
  ...
}

public class Incident
{
  public string ProductStatusMessage 
  {
    get
      {
        switch (this.ProductID)
         {
           case (int)ProductStates.OutOfOrder:
             return "This product will soon be out of order.";
             break;
           case (int)ProductStates.InStock:
             return "This product has a 10% discount!";
             break;
             ...
           default:
             return string.empty;
             break;
         }
      }
    ...
  }  

А в вашем коде:

if (!string.IsNullOrWhiteSpace(_incident.ProductStatus))
{
  MessageBox.Show(_incident.ProductStatusMessage);
}
1 голос
/ 02 мая 2011

а как же .Contains()?

int[] productIDs = { 5, 7, 10, 11 };

if (productIDs.Contains(_incident.ProductID))
{
}
0 голосов
/ 02 мая 2011

В основном да,

но: я предполагаю, что у вас есть основные данные продукта, доступные на данный момент, поэтому я бы добавил флаг к данным продукта. Затем вы можете управлять всем этим, поддерживая основные данные.

Магические числа + константы в коде довольно плохие.

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

НТН

Mario

0 голосов
/ 02 мая 2011

Так же, как идея, вы можете создать словарь Dictionary<int,bool>, где ключом является продукт, а затем проверить с помощью: dict.TryGetValue(... если товар классифицирован и классифицирован как истинный, или, может быть, лучше, если вам нужно просто хранить «хорошие» товары:

HashSet<int> goodProducts = new HashSet<int>();

тогда вы можете просто проверить, принадлежит ли продукт этому набору, используя goodProducts.Contains(_incident.ProductID)

...