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