阅读时间4分钟 (827字)

良好编码实践课程:不要重复自己

Lessons in Good Coding Practices: Don't Repeat Yourself

我是一个家长。这听起来有点像忏悔。但大多数认识我的人也知道我喜欢孩子。我现在有三个孩子,希望在不久的将来再添更多。我从做家长中学到了很多。我了解到孩子有一个奇怪的现象,除非我多次告诉他们,否则他们不会听到他们被告知的事情。这很有趣,因为它似乎并不总是这样,只有某些时候,通常是在他们需要做他们不太愿意做的事情时。我真的厌倦了重复自己。过一段时间后,这会变得相当讨厌。

好吧,所以现在每个人都想知道,这与编码和最佳开发实践有什么关系。今天我想谈谈“不要重复自己”的原则。

定义

维基百科将“不要重复自己”原则定义为以下内容

Every piece of knowledge must have a single, unambiguous, authoritative representation within a system. 

让我们将这个定义分解成一些易于理解的片段。然后让我们将其应用于代码。

每一条知识: 在开发中可以是类、函数,甚至是函数内的代码块。
单一、明确、权威的表现: 代码应该只存在一次,并且应该写得清楚。
在系统中: 在您的组件、模块、插件、应用程序等内部。

如果我们用这些片段重新编写定义,它看起来会更像这样

Any code written and used within your component should exist in only one location and be clearly written.

这听起来更有道理。现在我们已经有了对“不要重复自己”原则所涉及内容的良好工作定义,让我们看看一些如何在代码中实现这一点的例子。

糟糕代码的例子

function getSingleItem($id) 
{
   // assume all variables needed
   $query = $this->db->getQuery(TRUE)
            ->select($this->db->quoteName(array('i.*', 'c.name', 'a.something')))
            ->from($this->db->quoteName('#__myitems', 'i'))
            ->join('LEFT', $this->db->quoteName('#__categories', 'c') . ' ON (' . 
              $this->db->quoteName('i.category_id') . ' = ' . $this->db->quoteName('c.category_id') . ')')
            ->join('LEFT', $this->db->quoteName('#__attributes', 'a') . ' ON (' .
              $this->db->quoteName('a.item_id') . ' = ' . $this->db->quoteName('i.item_id') . ')')
            ->where($this->db->quoteName('i.item_id') . ' = '. (int) $id);
   $this->db->setQuery($query);
   $item = $this->db->loadObject();
}

function getManyItems($ids) 
{ 
   // assume all variables needed 
   $query = $this->db->getQuery(TRUE) 
            ->select($this->db->quoteName(array('i.*', 'c.name', 'a.something'))) 
            ->from($this->db->quoteName('#myitems', 'i')) 
            ->join('LEFT', $this->db->quoteName('#categories', 'c') . ' ON (' . $this->db->quoteName('i.category_id') . ' = ' . 
              $this->db->quoteName('c.category_id') . ')') 
            ->join('LEFT', $this->db->quoteName('#__attributes', 'a') . ' ON (' . $this->db->quoteName('a.item_id') . ' = ' . 
              $this->db->quoteName('i.item_id') . ')') 
            ->where($this->db->quoteName('i.item_id') . ' IN '. implode(',', $ids)); 
    $this->db->setQuery($query); 
    $item = $this->db->loadObject(); 
}

这段代码看起来相似吗?应该是。我是通过复制第一个函数并更改其中一行来创建第二个函数的。(提示:看看“where”子句)。那么,如果我不重复任何代码行而重新编写这段代码,它会是什么样子呢?这里有一个可能的例子。

更好的代码示例

function getSingleItem($id) 
{ 
   // assume all variables needed 
   $query = $this->getQuery(); 
   $query->where($this->db->quoteName('i.item_id') . ' = '. (int) $id); 
   $this->db->setQuery($query); 
   $item = $this->db->loadObject(); 
}

function getManyItems($ids) 
{ 
   // assume all variables needed 
   $query = $this->getQuery(); 
   $query->where($this->db->quoteName('i.item_id') . ' IN '. implode(',', $ids));
   $this->db->setQuery($query);
   $item = $this->db->loadObject();
}

function getQuery() 
{ 
   $query = $this->db->getQuery(TRUE) 
            ->select($this->db->quoteName(array('i.*', 'c.name', 'a.something'))) 
            ->from($this->db->quoteName('#myitems', 'i')) 
            ->join('LEFT', $this->db->quoteName('#categories', 'c') . ' ON (' . $this->db->quoteName('i.category_id') . ' = ' . 
              $this->db->quoteName('c.category_id') . ')') 
            ->join('LEFT', $this->db->quoteName('#__attributes', 'a') . ' ON (' . $this->db->quoteName('a.item_id') . ' = ' . 
              $this->db->quoteName('i.item_id') . ')');
   
   return $query;
}

为了避免在每个函数内部重写查询函数两次,我将重复的代码提取出来,编写成一个第三个函数,现在我可以从这两个函数中的任何一个中调用它。这似乎很简单。事实上,许多开发人员可能已经实施这种编码方式来使他们的代码更出色。

好处

为什么避免重复很重要?只编写一次代码有很多好处。当然,没有人喜欢浪费时间重复编写代码,但更重要的是,你减少了错误发生的机会。代码越少,失败的可能性就越小。我相信我们都有过那些找了一个小时或更长时间才发现问题,结果发现是一个遗漏的分号的时刻。我知道这种情况发生在我身上。还有其他好处。当你后来意识到你需要添加另一个表到查询中,因为你的客户需要从数据库中获取更多信息时,现在你只需要更新一个查询了!

我希望许多开发人员已经了解到这条“不要重复”的原则。如果这是一个新概念,恭喜你,你现在已经了解了编写DRY代码的含义。我希望从这个系列的开头就从一个简单的话题开始,虽然这并没有涵盖这个原则的每个技术细节,但它确实关注了这个原则的一个关键方面。在未来的版本中,我期待着探讨更多良好开发的原则。

 

发表在Joomla社区杂志上的某些文章代表了作者对特定主题的个人观点或经验,可能并不符合Joomla项目的官方立场。

0
优秀的编码实践:不要重复...
更多关于Joomla!认证的信息
 

评论

已经注册? 在此登录
还没有发表评论。成为第一个发表评论的人

通过接受,您将访问https://magazine.joomla.net.cn/外部第三方提供的服务