哪种方法更好,使用一个大的方法还是分开多个小的方法?

4

我正在使用Codeigniter。

我有一个订单类(Orders),其中包含一些方法,如 start_order(),close_order() 等。

每个用户类型都有不同的权限级别,例如'admin','salesman','manager' ..

因此,同一方法可能每次都要实现不同的操作。

我的问题是:在CI中哪种方式被认为是最佳实践:

1) 在 'orders' 类中编写一个大方法,其中包含不同的逻辑细节。 或
2) 根据需要在其他类中重复该方法。

虽然第一种选择似乎是显而易见的,但当我这样做时,我最终得到了庞大的代码块。这就是为什么我要询问您的经验的原因。


您可能会认为您的设计存在设计问题。通常一个方法应该适合您的显示屏,一个类最多应该包含400行代码。 - AlexTheo
5个回答

7
事实上,选择第一种方法(“一个大的方法”)显然并不明智,这应该绝对避免。
一般来说,应该倾向于使用小型方法。每个方法应该仅做一件事情,并且仅有一个原因需要改变,要小而易读,从其名称中可以明显地知道它在做什么等等。
你在问题中选择的措辞(“每次不同的实现”和“包含不同逻辑细节的实现”)暗示着你正在谈论一个方法,它根据某些对象的状态完成不同的任务。
看一下重构模式替换条件表达式为多态。当您有一个主要是通过大型case检查或if / elseif链来确定状态的方法时,通常会使用此模式。这个想法是将每个实现提取到自己的类中,该类覆盖基类上的一个方法。这些类将保存和了解状态,并能够相应地应用正确的逻辑,消费代码只需调用基类类型的方法。

这个模式有大量的信息和大量的示例

正如@Gordon指出的那样,这也被称为策略模式


由于Codeigniter允许您拥有诸如“admin”、“salesman”等控制器类。如果我根据需要为每个控制器类放置一个“start_order()”函数,而不是进行继承,那该怎么办呢?因为它们都继承自类CI_Controller,而PHP5不允许多重继承? - adel
@adel:你不应该需要多重继承。如果控制器类是需要使用策略模式的类,那么你应该能够创建一个基础控制器类,它继承自CI_Controller,然后每个控制器都会从你的基础控制器继承(并且随后通过继承层次结构从CI_Controller继承)。那个基础控制器将有抽象的start_order()。你可以在基础控制器中提供默认版本并允许覆盖,或者不提供版本并要求覆盖。然后每个控制器都可以调用start_order() - David

3
你是说你针对每个权限级别都有不同的类(例如AdminOrderSalesmanOrder等)吗?如果是这样,最好在每个类中添加一个单独的方法,如果订单有足够的不同之处。这样做被称为方法重写,在面向对象编程中很常见。例如:
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
    }
}

1
因此,同一方法每次可能会有不同的实现。
由此可见,您需要拥有三种方法,每种方法对应一种实现。将所有可能的实现混合到一个大方法中将使维护变得更加困难。您将有很多的if和else。
请查看策略模式,了解如何以良好的实践方式使其工作。

0

我认为最好创建一个基类order,然后将其扩展为adminsalesman或其他类,这样你只需要覆盖不同的方法即可。


0

最佳实践是将大块逻辑拆分为单独的方法,然后在需要时进行调用。

这样你的代码看起来更好,更易读,当你需要查找和修复某些问题时也不会迷失方向。

庞大的方法是非常不好的习惯。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接