2012-04-30 46 views
4

我正在使用codeigniter。哪个更适合做大一个方法或分离方法?

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

和我有针对每个用户类型'admin','salesman','manager' ..

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

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

1)大干方法包含 不同的逻辑细节的“订单”类。或
2)重复按 其他类所需的方法。

我知道这听起来很明显,应该去第一选择。但是,当我这样做,我结束了大量的代码块。所以,这就是为什么我要求你的经验。

+0

你可能看起来像你的设计看起来像设计问题。通常一种方法应该适合你的显示器屏幕,一个类最多可以有400行代码。 – AlexTheo

回答

7

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

通常,人们应该更喜欢小方法。每种方法都应该只做一件事,只做一件事,只有一个原因可以改变,小而易读,从名称上可以明显看出它在做什么,等等。

您在问题中选择的措辞(“每次不同的实现“和”包含不同的逻辑细节“)意味着你正在讨论一种基于某种对象状态来做不同事情的方法。请看看Replace Conditional With Polymorphism的重构模式。当你有一个方法主要是一个大的case检查或一个确定该状态的if/elseif链时,通常会使用此模式。这个想法是你将每个实现提取到它自己的类中,该类重写了基类中的方法。这些类将持有并了解状态,并能够相应地应用正确的逻辑,并且消费代码将仅调用基类类型的方法。

此模式上有lots of information and lots of examples

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

+0

+1因为我的回答比我想要的要好得多。 –

+0

因为Codeigniter允许你有像'管理','推销员'等控制器类。 如果我为每个控制器类按需要放置'start_order()'函数而不是继承?因为它们都继承了CI_Controller类,并且PHP5不允许多重继承? – adel

+0

@adel:你不应该需要多重继承。如果控制器类是需要使用策略模式的类,那么您应该能够创建一个继承自“CI_Controller”的基类控制器类,然后每个控制器都会从您的基础控制器继承(并且随后,从CI_Controller通过继承层次结构)。该基础控制器将具有抽象的'start_order()'。您可以在基本控制器中提供默认版本并允许覆盖,或者不提供版本并且需要覆盖。然后每个控制器都可以调用'start_order()'。 – David

1

因此同样的方法可每次

得到不同的实现从跟随你想有三个方法,每个实现。将所有可能的实现混合到一个大方法中会使其更难维护。你会有很多ifs和elses。

看看Strategy pattern了解如何以良好的实践方式完成这项工作。

0

我认为这将是最好创建一个基类order,然后将其延伸到adminsalesman和任何那么你只需要覆盖那些不同的方法

3

你是说你有一个不同的类每个权限级别(如AdminOrder,SalesmanOrder等)?如果是这样,如果顺序足够不同,最好在每个类中添加一个单独的方法。这样做被称为方法覆盖,在面向对象编程中很常见。举例如下:

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

最好的做法是将大块逻辑拆分成不同的方法然后在需要的地方调用。

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

巨大的庞然大物的方法是非常糟糕的habbit。

相关问题