逻辑编程帮助 - II

时间:2010-09-03 15:53:31

标签: php logic

A

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

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
}

您可以选择哪种更好的逻辑?

上下文: 我相信这应该是什么无关紧要。我的意思是,这是一个合乎逻辑的问题。 :■ 不知道在这里写什么...... :(

这是一种形式:一些输入来自数据库,另一些来自输入字段。 我们在这里进行一些比较。

A 上下文: 如果来自数据库的值为空,并且输入字段A和B 非空,请执行添加到数据库

B 上下文: 如果来自数据库的值非空,并且输入字段A和B 为空,请执行从数据库中删除。< / p>

C 上下文: 如果来自数据库的值非空,并且输入字段A !等于 infoA或输入字段B 不等于数据库值infoB则, 添加到数据库

请指教。 MEM

2 个答案:

答案 0 :(得分:1)

几个问题:

  • C确实是添加,还是更新?
  • 你真的需要将inputA和inputB与infoA和infoB的处理联系起来吗?

一般来说,我会通过以下方式重构:

  • 将添加/删除决策拆分为单独的process_input函数,该函数只处理一对输入/信息对象。
  • 将添加/删除活动拆分到他们自己的函数中,这些函数将处理数据的基本空处理。

逻辑的唯一简化是,根据输入数据是否为空,决定调用add()或remove()仅 。这才是真正需要的。 add()和remove()函数执行自己的数据验证,以确保操作对提供的数据有效。

这种重构演示了两种重要的编程技术:

  • DRY(不重复自己)原则......我们不应该多次检查一个对象的空()。
  • SRP(单一责任原则) - 每项操作只应做一件事。
    • 输入处理程序负责将输入数据与现有信息数据配对,然后调用process_input。
    • process_input函数仅负责决定是否需要执行add()或remove()操作。
    • 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);

答案 1 :(得分:1)

我认为展开条件并使用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-maybe-delete-update?determine-update-or-delete?)