我正在使用 CodeIgniter,但这个问题也适用于一般意义上。
我有一个带有列的交易表
item_name | type | date | price | document
我想在两个完全独立的情况下执行以下操作。
1)获取特定日期范围内的交易列表。2)获取特定日期范围内每笔交易的总价格。类型。
前者可以通过简单地使用带有 > datetimestamp 的 select 语句来实现
后者可以通过选择 SUM 并按类型分组来实现,同时就像实现任何所需的 where 条件,例如使用 > datetimestamp
虽然是一个简单的案例,但要实现这一点,我需要有两种方法,但是这两种方法的大部分(即 WHERE 子句)在两种方法中都是重复的。
就速度等而言,这并不重要,但这似乎是毫无意义的代码复制。
第二个例子如下。
我以前有一个方法get_data($ID)
可以根据传入的 ID 从表中获取一行。
因此,在一个单独的方法中,我会得到我的 100 个项目。返回一个数组,遍历它们并为每个调用 get_data。
这种设置意味着许多不同的方法可以从不同的来源获取不同的列表,然后仍然使用相同的 get_data 函数和循环来获取所需的数据。
这最大限度地减少了代码重复,但效率极低,因为它意味着循环加载大量数据项和数百个数据库查询。
在我当前的设置中,我只是在我的每个方法中加入数据表 - 代码重复但明显提高了效率。
最后一个例子如下
在 codeigniter 中,我可以有如下功能:
get_thing($ID)
{
$this->load->database();
$this->db->where('ID',$ID);
$this->db->get('table');
}
但是在其他情况下,我可能只想获取特定文件夹中的项目..因此使功能更通用的效果更好..例如
get_thing($array)
{
$this->load->database();
$this->db->where($array);
$this->db->get('table');
}
但是我可能想在两个不同的上下文中使用这个功能,例如用户页面和管理页面,管理员可以看到所有项目,甚至是未经验证的项目。我的代码现在变成:
get_thing($array,$show_unverified = false)
{
$this->load->database();
$this->db->where($array);
if($show_unverified == false)
{
$this->db->where('verified','YES');
}
$this->db->get('table');
}
正如您可能看到的那样,这很快就会失控,并且方法可能变得过于复杂、混乱和充满条件。
我的问题如下 - 减少代码重复的最佳实践是什么,以及如何将它们应用于上述情况?我花了好几个小时试图让我的代码更有效率,但我一无所获,因为我无法锻炼我真正应该努力实现的目标。
干杯