Справка по программированию логики - II - PullRequest
2 голосов
/ 03 сентября 2010

A

if (  ( empty($infoA) || empty($infoB) ) && ( !empty($inputA) && !empty($inputB) )  ) 
{
  //add
}

B

if (  ( !empty($infoA) || !empty($infoB) ) && ( empty($inputA) && empty($inputB) )  )
{
  //remove
}

C

if (  ( !empty($infoA) || !empty($infoB) ) && ( ($inputA != $infoA) || ($inputB != $infoB) )  ) 
{
  //add
}

Итак, чтобы не повторять сложение, мы можем:

if (A || C) 
{
  //add
}
elseif(B) 
{
 //remove
}

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

Контекст: Я считаю, что это не имеет значения, что это должно делать. Я имею в виду, это логичный вопрос. : s Не уверен что тут написать ...: (

Это для формы: некоторые входные данные будут поступать из базы данных, другие - из полей ввода. Здесь мы проводим некоторые сравнения.

A контекст: Если значение из базы данных пусто , а поля ввода A и B НЕ пусто , добавьте в базу данных .

B контекст: Если значение из базы данных равно НЕ пусто , а поля ввода A и B пусто , удалите из базы данных .

C context: Если значения, поступающие из базы данных, являются НЕ пустыми , И поле ввода A ! Равно infoA или поле ввода B НЕ равно значение базы данных infoB, тогда выполните добавить в базу данных .

Пожалуйста, совет. MEM

Ответы [ 2 ]

1 голос
/ 03 сентября 2010

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

Вот мой дубль

// check if to update in DB or not

$value = db_adapter::get_var($sql);
if (empty($value))
{
  if (!empty($field_A) && !empty($field_B))
    add($field_A, $field_B);  

} else 
// you can roll the following block up into a function
{


  if (empty($field_A) && empty($field_B))
    remove($field_A, $field_B);
   else {
      if ($field_A != $value)
       update($field_A);  
     else if ($field_B != $value)
       update($field_B);
   }

}

Каждое из остальных можно свернуть в функцию; Я этого не сделал, потому что не могу придумать ничего логичного, чтобы вызвать блок кода в блоке else (process-возможно-delete-update? Define-update-or-delete?)

1 голос
/ 03 сентября 2010

Несколько вопросов:

  • Действительно ли C добавляет, или это обновление?
  • Вам действительно нужно связать обработку ввода A и ввода B с infoA и infoB?

В общем, я бы изменил это следующим образом:

  • Разделение решения добавить / удалить в отдельную функцию process_input, которая обрабатывает только одну пару объектов ввода / информации.
  • Разделение операций добавления / удаления в их собственные функции, которые будут обрабатывать основные пустые обработки данных.

Единственное упрощение логики состоит в том, что решение для вызова add () или remove () принимается только в зависимости от того, пустые данные или нет. Это все, что действительно нужно. Функции add () и remove () выполняют собственную проверку данных, чтобы убедиться, что операция действительна для предоставленных данных.

Этот рефакторинг демонстрирует два важных метода программирования:

  • Принцип СУХОГО (не повторяйте себя) ... мы не должны проверять empty () на объекте более одного раза.
  • SRP (принцип единой ответственности) - каждая операция должна выполнять только одно.
    • Обработчик ввода отвечает за сопоставление входных данных с существующими информационными данными и затем вызывает process_input.
    • Функция process_input отвечает только за решение о том, нужно ли нам выполнять операцию добавления () или удаления ().
    • Каждая из функций add () и remove () отвечает за свою собственную отдельную операцию, которая может быть протестирована в отрыве от остальной части кода

(Извините, мой php ... он немного ржавый)

function remove($data)
{
    if (empty($data))
        return;

    // Do remove operation
}

function add($data)
{
    if (empty($data))
        return;

    // Do add operation
}

function process_input($input, $info)
{
    if (empty($input))
        remove($info);
    else
        add($input);
}

process_input($inputA, $infoA);
process_input($inputB, $infoB);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...