Как преобразовать вложенный тернарный оператор во вложенные операторы if-else? - PullRequest
3 голосов
/ 15 марта 2019

Я с трудом пытаюсь преобразовать следующий код C # в оператор if-else, чтобы понять бизнес-логику.Кто-нибудь может мне помочь, проверив, в порядке ли мое преобразование?

Код:

dateInit = objInstance == null ? (DateTime?)null:
                objInstance.DateAnt == null ?
                    objInstance.DatePost > otherObjInstance.DateCon ?
                        (DateTime?)null :
                        objInstance.DatePost :
                objInstance.DateAnt;

Мое преобразование:

if (objInstance == null)
{
    dateInit = (DateTime?)null;
}
else
{
    if (objInstance.DateAnt == null)
    {
        if (objInstance.DatePost > otherObjInstance.DateCon)
        {
            dateInit = (DateTime?)null;
        }
        else
        {
            dateInit = objInstance.DatePost;
        }
    }
    else
    {
        dateInit = objInstance.DataAnt;
    }
}

1 Ответ

6 голосов
/ 15 марта 2019

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

Во-первых, приведения к null не нужны в форме if.(Оператор ?: имеет определенные ограничения на типы, которые могут появляться в следствии и альтернативных позициях, что приводит к тому, что разработчики вставляют приведения.)

Во-вторых, операторы if неоправданно вложены.Все это можно выразить гораздо более наглядно:

if (objInstance == null)
  dateInit = null;
else if (objInstance.DateAnt != null)
  dateInit = objInstance.DataAnt;
else if (objInstance.DatePost > otherObjInstance.DateCon)
  dateInit = null;
else
  dateInit = objInstance.DatePost;

Бизнес-логика более понятна из этой версии, чем ваша версия, я думаю.

Мы можем сделать это преобразование, используя два правила.Первое:

if (x)
  X
else 
{
  if (y)
    Y
  else
    Z
}

- это то же самое, что и

if (x)
  X
else if (y)
  Y
else
  Z

, что проще на странице.

И второе:

if (x)
{
  if (y)
    Y
  else
    Z
}
else
  NX

- это то же самое, что и

if (!x)
  NX
else 
{
  if (y)
    Y
  else
    Z
}

И теперь мы снова в первом случае и можем еще больше упростить.

Путем многократного объединения этих правил вы можете упростить множество сложных if-else утверждений.

...