良好编码实践课程:不要重复自己
我是一位家长。这听起来有点像忏悔。但了解我的人也知道,我喜欢孩子。我现在有三个孩子,希望不久的将来还能有更多。从做家长中,我学到了很多东西。我了解到,孩子有一个奇怪的现象,除非我反复告诉他们,否则他们不会听到他们被告知的事情。这很有趣,因为它似乎并不总是这样,只有在某些时候才会这样,通常是在他们需要做他们不太想做的事情的时候。我真的厌倦了反复说同样的话。过一段时间后,这会变得相当烦人。
好了,现在每个人都在想,这与编码和最佳开发实践有什么关系。今天我想谈谈“不要重复自己”的原则。
定义
维基百科将“不要重复自己”原则定义为如下
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)的原则。如果你是第一次接触这个概念,恭喜你,你现在已经了解了编写DRY代码的含义。我想从这个简单的主题开始这个系列,虽然这个主题并没有涵盖这个原则的所有技术细节,但它确实关注了这个原则的一个重要方面。在未来的版本中,我期待着探讨更多优秀开发的原则。
在Joomla社区杂志上发表的一些文章代表了作者对特定主题的个人观点或经验,可能与Joomla项目的官方立场不完全一致
通过接受,您将访问由https://magazine.joomla.net.cn/之外的第三方提供的服务
评论