4

我正在使用codeigniter。

我有类订单,其中有一些方法,比如start_order(), close_order(),等等。

我对每种用户类型都有一个权限级别'admin','salesman','manager' ..

因此,相同的方法每次可能得到不同的实现。

所以,我的问题是:这被认为是 CI 的最佳实践:

1)在“订单”类中创建一个包含不同逻辑细节的大方法。或
2)根据需要在其他类中重复该方法。

我知道这听起来很明显,一个人应该选择第一选择。但是,当我这样做时,我最终得到了大量的代码块。所以,这就是为什么我要你的经验。

4

5 回答 5

7

事实上,一个人应该选择第一选择(“一个大方法”)并不明显。绝对应该避免这种情况。

一般来说,人们应该更喜欢小方法。每种方法都应该只做一件事,只做一件事,只有一个改变的理由,小而易读,从它的名字中可以明显看出它在做什么,等等。

您在问题中选择的措辞(“每次不同的实现”和“包含不同的逻辑细节”)意味着您正在谈论一种基于对象的某种状态执行不同操作的方法。

看一下名为Replace Conditional With Polymorphism的重构模式。当您有一个主要是大case检查或if/elseif确定该状态的链的方法时,通常会使用此模式。这个想法是您将每个实现提取到它自己的类中,该类覆盖基类上的方法。这些类将持有并了解状态,并且能够相应地应用正确的逻辑,而消费代码将只调用基类类型上的方法。

关于这种模式有很多信息和很多例子。

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

于 2012-04-30T16:04:37.490 回答
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
    }
}
于 2012-04-30T16:07:41.053 回答
1

因此,相同的方法每次可能得到不同的实现

因此,您希望拥有三种方法,一种用于每种实现。将所有可能的实现混合到一个大方法中会使其更难维护。你会有很多ifs和elses。

查看策略模式以了解如何以良好的实践方式使其工作。

于 2012-04-30T16:05:07.663 回答
0

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

于 2012-04-30T16:05:25.693 回答
0

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

您的代码看起来更好,更易读,当您需要查找和修复某些东西时,您不会迷路。

巨大的巨像方法是非常糟糕的习惯。

于 2012-04-30T16:09:18.717 回答