我正在使用codeigniter。
我有类订单,其中有一些方法,如start_order(), close_order(),
等。
我拥有每个用户类型'admin','salesman','manager' ..
所以,我的问题是:这被认为是CI中的最佳实践:
1)在'orders'类中创建一个包含的方法 不同的逻辑细节。或者 2)根据需要重复该方法 其他课程。
我知道一个人应该选择首选。但是,当我这样做时,我最终得到了大量代码。所以,这就是我要求你的经历的原因。
答案 0 :(得分:7)
事实上,显然 显然应该选择第一种选择(“一大方法”)。绝对应该避免这种情况。
一般来说,人们应该选择小方法。每个方法应该完成一件事而且只做一件事,只有一个理由可以改变,小而且可读,从名称中可以明显看出它在做什么等等。
您在问题中选择的措辞(“每次不同的实现”和“包含不同的逻辑细节”)意味着您正在谈论一种基于某种对象状态执行不同操作的方法。
看一下名为Replace Conditional With Polymorphism的重构模式。如果您的方法主要是一个大的case
检查或一个确定该状态的if/elseif
链,则通常会使用此模式。这个想法是你将每个实现提取到它自己的类中,该类覆盖基类上的方法。这些类将保存并了解状态,并且能够相应地应用正确的逻辑,消费代码只会在基类类型上调用该方法。
答案 1 :(得分:3)
您是说每个权限级别都有不同的类(如AdminOrder
,SalesmanOrder
等)?如果是这样,如果订单充分不同,最好在每个类中添加单独的方法。这样做称为方法覆盖,在面向对象的编程中很常见。举个例子:
class Order
{
function start_order()
{
// this method contains common code for all orders
}
}
class AdminOrder extends Order
{
function start_order()
{
// IF NEEDED: call start_order on Order. This is if you have common code that should be executed for ALL subclasses of Order
parent::start_order()
// Now implement code specific to an AdminOrder
}
}
答案 2 :(得分:1)
从那以后因此,每次相同的方法可能会得到不同的实现
你想要有三个方法,每个方法一个。将所有可能的实现混合到一个大方法中将使维护变得更加困难。你会有很多的ifs和elses。
查看Strategy pattern,了解如何以良好的实践方式开展此项工作。
答案 3 :(得分:0)
我认为最好创建一个基类order
,然后将其扩展为admin
,salesman
,然后你只需要覆盖不同的方法
答案 4 :(得分:0)
最佳做法是将大块逻辑拆分为单独的方法然后在需要的地方调用。
您的代码看起来更好,可读性更强,当您需要查找和修复某些内容时,您不会迷失。
巨大的巨型方法是非常糟糕的习惯。