我怎样才能模块化课堂设计?

时间:2013-02-05 02:57:11

标签: php class

我正在设计一个具有通用代码库的应用程序,但它的某些部分非常特定于某些购物车。由于其设计的推车数量增长,我发现自己添加到主类的方法越多。这使得课程变得相当庞大且笨拙。

如何模块化东西,以便加载主类的每个特定购物车都有自己的特定方法,只有在购物车制作和版本匹配时才会加载?

例如,假设我现在正以这种方式设置事物:

class Thingy {
    public function doStuffMagento16() {...}
    public function getMoreMagento16() {...}
    public function doStuffOpencart15() {...}
    public function getMoreOpencart15() {...}
    public function doStuffPrestashop12() {...}
    public function getMorePrestashop12() {...}
    public function doStuffXcart45() {...}
    public function getMoreXcart45() {...}
}

我如何让它看起来更像这样,这样方法只会重载主类中的默认值:

class Thingy {
    public function doStuff() {...}
    public function getMore() {...}
}

我真的在想我需要创建子类来扩展主类,并在调用主接口时自动加载它们,但我想确保这是最有效且易于维护的选项之前我试着......或者我应该走另一个方向。

2 个答案:

答案 0 :(得分:1)

这需要adapter pattern;您可以将特定的购物车界面调整为通用界面。

琐碎的例子:

/* existing cart implementation */
class CartFromVendorX
{
    public function addProduct( CartXProduct $product ) {}
}

/* existing cart implementation */
class CartFromVendorY
{
    public function pushProduct( CartYProduct $product ) {}
}

/* generic cart interface */
interface CartAdapterInterface
{
    public function addItem( $item );
}

class CartAdapterVendorX
    implements CartAdapterInterface
{
    protected $adaptee;

    public function __construct( CartFromVendorX $adaptee )
    {
        $this->adaptee = $adaptee;
    }

    public function addItem( $item )
    {
        /* transfrom generic $item to CartXProduct, for instance */

        $this->adaptee->addProduct( $product );
    }
}

class CartAdapterVendorY
    implements CartAdapterInterface
{
    protected $adaptee;

    public function __construct( CartFromVendorY $adaptee )
    {
        $this->adaptee = $adaptee;
    }

    public function addItem( $item )
    {
        /* transfrom generic $item to CartYProduct, for instance */

        $this->adaptee->pushProduct( $product );
    }
}

然后是消费客户的通用购物车:

class CartClient
{
    protected $cart;

    public function __construct( CartAdapterInterface $cart )
    {
        $this->cart = $cart;
    }

    /* rest of implementation that acts on CartAdapterInterface instance */
}

用法:

$cartAdapter = new CartAdapterVendorX( new CartFromVendorX() );
$client = new CartClient( $cartAdapter );

P.S。:您不一定要实现适配器,以便将原始实现传递给它们的构造函数。这样的事情也可以起作用:

class CartAdapterVendorX
    implements CartAdapterInterface
{
    protected $adaptee;

    public function __construct()
    {
        $this->adaptee = new CartFromVendorX();
    }

    public function addItem( $item )
    {
        /* perhaps transfrom generic $item first */

        $this->adaptee->addProduct( $item );
    }
}

然后它的用法将简化为:

$cartAdapter = new CartAdapterVendorX();
$client = new CartClient( $cartAdapter );

您可以根据实际的实施细节而有所不同,但这应该给您一个大致的想法。例如,您最终有可能最终为某些或所有原始购物车实现façade pattern,以及它,因为您可能希望将多个方法调用包装到一个原始实现中,适配器接口。

答案 1 :(得分:0)

创建一个基类,其中包含您知道的所有购物车通用的所有内容:

class Cart {

    function __construct(){

       $this->id = 1234;
       $this->item = 'basic_item';

    }

}

然后将extend班级改为另一个班级:

class anotherCart extends Cart {

    function __construct(){

       $this->item = 'another_basic_item';

    }

}

在此假设示例中,$this->id变量在CartanotherCart之间会很常见,但anotherCart会因$this->item更改而得到特殊处理。< / p>

以此附加功能为基础构建此概念条件和条件它应该可以帮助您简化甚至最抽象概念的使用。