Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 练习大一法和分离法哪个更好?_Php_Oop_Codeigniter - Fatal编程技术网

Php 练习大一法和分离法哪个更好?

Php 练习大一法和分离法哪个更好?,php,oop,codeigniter,Php,Oop,Codeigniter,我正在使用codeigniter 我有一些类命令,它们有一些方法,比如start\u order()、close\u order()、等等 我对每个用户类型都有一个权限级别“管理员”、“推销员”、“经理”… 因此,相同的方法每次可能得到不同的实现 所以,我的问题是:哪一种被认为是CI的最佳实践: 1)在包含 不同的逻辑细节。或2)根据需要在中重复该方法 其他课程 我知道这听起来很明显,人们应该选择第一选择。但是,当我这样做的时候,我得到了大量的代码块。所以,这就是为什么我要问你的经验 事实上,第

我正在使用codeigniter

我有一些类命令,它们有一些方法,比如
start\u order()、close\u order()、
等等

我对每个用户类型都有一个权限级别
“管理员”、“推销员”、“经理”…

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

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

1)在包含 不同的逻辑细节。或
2)根据需要在中重复该方法 其他课程

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

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

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

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

请看一个名为的重构模式。当您的方法主要是一个大的
案例
检查或一个确定该状态的
if/elseif
链时,通常使用此模式。其思想是将每个实现提取到自己的类中,该类重写基类上的方法。这些类将保存并了解状态,并且能够相应地应用正确的逻辑,并且使用的代码将只调用基类类型上的方法

这个图案上有很多图案

正如,这也被称为

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

因此,您希望有三个方法,每个实现一个。将所有可能的实现混合到一个大方法中会使维护变得更加困难。你会有很多“如果”和“其他”


请看一下,以了解如何以良好的实践方式进行此操作。

我认为最好创建一个基类
order
,然后将其扩展到
admin
saller
然后你只需要覆盖不同的方法,你是说每个权限级别都有不同的类(比如
AdminOrder
salesmondorder
等等)?如果是这样,最好在每个类中添加一个单独的方法,如果顺序足够不同。这样做称为方法重写,在面向对象编程中很常见。例如:

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
    }
}

最佳实践是将大块逻辑分割成单独的方法,然后在需要时调用

您的代码看起来更好,可读性更好,并且在需要查找和修复某些内容时不会迷路


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

您可能会看到您的设计看起来像设计问题。通常情况下,一个方法应该适合您的监视器屏幕,一个类最多可以包含400行代码。因为Codeigniter允许您拥有诸如“admin”、“saller”等控制器类。。如果我根据需要为每个控制器类放置一个“start_order()”函数,而不是进行继承,会怎么样?因为它们都继承了类CI_Controller,PHP5不允许多重继承?@adel:你不应该需要多重继承。如果控制器类是需要使用策略模式的类,那么您应该能够创建一个从
CI\u controller
继承的基本控制器类,那么您的每个控制器都将从基本控制器继承(随后通过继承层次结构从
CI\u controller
)。该基本控制器将具有抽象的
start\u order()
。您可以在基本控制器中提供默认版本并允许覆盖,也可以不提供版本并要求覆盖。然后每个控制器都可以调用
start\u order()