哪种方法更好或者分离方法更好?

时间:2012-04-30 15:57:29

标签: php oop codeigniter

我正在使用codeigniter。

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

我拥有每个用户类型'admin','salesman','manager' ..

的权限级别 因此,相同的方法每次都可能得到不同的实现。

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

  

1)在'orders'类中创建一个包含的方法   不同的逻辑细节。或者 2)根据需要重复该方法   其他课程。

我知道一个人应该选择首选。但是,当我这样做时,我最终得到了大量代码。所以,这就是我要求你的经历的原因。

5 个答案:

答案 0 :(得分:7)

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

一般来说,人们应该选择小方法。每个方法应该完成一件事而且只做一件事,只有一个理由可以改变,小而且可读,从名称中可以明显看出它在做什么等等。

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

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

此模式有lots of information and lots of examples

作为@Gordon points out,这也称为Strategy Pattern

答案 1 :(得分: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
    }
}

答案 2 :(得分:1)

  

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

从那以后

你想要有三个方法,每个方法一个。将所有可能的实现混合到一个大方法中将使维护变得更加困难。你会有很多的ifs和elses。

查看Strategy pattern,了解如何以良好的实践方式开展此项工作。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

您的代码看起来更好,可读性更强,当您需要查找和修复某些内容时,您不会迷失。

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