编码最佳实践课程:不要重复
我是父亲。这听起来有点像忏悔,但认识我的人都知道我喜欢孩子。目前,我有三个孩子,并且希望不久的将来还有更多的孩子。做父母让我学到了很多。我特别学到了一个奇怪的现象,那就是我的孩子们只有在我说很多遍之后才会听我说的。这很奇怪,因为这似乎并不总是这样。实际上,这只有在他们需要做一些他们不是很愿意做的事情时才会发生。这非常累人,过一段时间后,总是需要重复就会变得非常烦人。
好吧,现在你可能想知道这与编码和最佳开发实践有什么关系。今天,我想与您探讨“不要重复自己”(DRY)的概念。
定义
维基百科将“不要重复自己”原则定义为如下
Dans un système, toute connaissance doit avoir une représentation unique, non-ambiguë, faisant autorité.
让我们分解这个定义以便更容易理解。然后我们将将其应用于代码。
所有知识:在开发中,这可以是类、函数,甚至是函数内部的代码块。
唯一、无歧义、权威性的表示:代码应该只出现一次,并且应该以清晰的方式编写。
在系统中:在你的组件、模块、插件、应用程序等中。
如果我们将这些文本片段重新写成我们自己的话,这可能会看起来像这样
Tout code écrit et utilisé dans votre composant ne doit être présent qu’en un seul endroit et doit être clairement écrit.
这听起来更有逻辑性,不是吗?现在我们已经有了对“不要重复自己”概念的工作定义,让我们看看在代码中的应用实例。
糟糕代码示例
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; }
不是为每个函数重新编写一次函数 'query',而是提取了重复的代码,并编写了一个新的第三个函数,现在可以从任何一个函数中调用它。这看起来很简单。事实上,许多开发者已经实施这种做法来优化他们的代码。
优点
为什么避免重复如此重要?
编写代码一次的好处有很多。当然,没有人愿意浪费时间去重复写相同的代码,但更重要的是,您降低了出现错误的风险。代码越少,潜在的错误点就越少。我相信,就像我一样,您已经花费过几个小时试图解决一个问题,最后才发现是缺少一个分号。我知道,这也会发生在我身上。还有其他好处。当您后来发现需要添加另一个表到查询中,因为您的客户需要从数据库中获取更多信息时,您现在只需要更新一个查询!
我希望许多开发者已经意识到了“不要重复自己”的原则。如果您对这一概念完全陌生,恭喜您,现在您已经知道如何编写“DRY(不要重复自己)”代码了。
我希望从这个简单的主题开始这个新的系列,即使在这里我没有涵盖这个原则的所有技术细节,我也专注于它的本质。
我迫不及待地想在下几章中向您展示其他良好的开发原则。
在 Joomla 社区杂志上发表的一些文章代表了作者对特定主题的个人观点或经验,可能与 Joomla 项目的官方立场不一致。
通过接受,您将访问由 https://magazine.joomla.net.cn/ 之外的第三方提供的服务
评论