1

我有一个包含配置以及一些特定于状态的方法的 State 类。我还有一个工厂类,我从中继承了我的 MVC 类,它也引用了这个 State 对象。这确保我所有的 MVC 对象都具有特定的与状态相关的功能。例如,我的 State 类包括设置和读取缓存或会话的方法。

我的 Factory 类有许多只是包装器的方法,如下所示:

public function myFunction($data){
    $this->State->myFunction($data);
}

想法是这些方法是在 Factory 中定义的,但实际上是由 State 对象执行的。这允许我在编写代码时调用: $this->myFunction();而不是包含 State 的较长的。

我对 PHP 内部的工作方式知之甚少,但这有效吗?我的想法是,因为我通常只有一个 State 对象实例,所以在我的 Factory 类中包含方法包装器会更好,因为否则这些方法将包含很多大部分时间不使用的代码。但我不确定 PHP 在内部是如何工作的。

有时我可以有十几个具有父工厂类的对象,并且它们都引用同一个 State 对象。在 Factory 中定义包装器方法是否有效,只需调用 State 的方法,而不是直接处理 State?还是我只是为整个系统增加了额外的开销?

我的想法是,如果 Factory 只是一个可继承的类并包含许多功能的包装器,那么我可以更有效地简化开发。如果您继承的类具有包装器而不是方法中完全定义的代码,它会节省内存吗?

4

1 回答 1

3

不,这样的包装器没有性能优势。实际上,您得到的只是性能的极小损失。

更重要的是,这种方式隐藏了依赖关系,这可能会使代码的维护变得更加困难。


关于你的话题的一些想法

我的印象是你做错了tm。以下是我对您在问题中所写内容的看法:

  • 该类是否State负责配置“状态特定方法”?

    有这样的东西SRP,它指出,每个类都应该有一个单一的责任。你也可以说,每个班级应该只有一个赛季可以改变。

  • 为什么你的“MVC 类”从Factory类继承?

    在面向对象的代码中,关键字extends表示类之间的is-a 关系。拥有它是可以的class Oak extends Tree,但是当你写作时class User extends Table,这完全是精神错乱......而且有点侮辱。LSP涵盖了这一点(为了简化解释:看这里)。

  • 你误解了Factory模式的目的。

    工厂是一种创造模式。这意味着,工厂的目的是返回对象实例。State您应该将其注入每个创建的结构中,而不是继承一些提供对实例的访问的方法。

    class Factory
    {
        protected $state = null;
    
        public function __construct( $state )
        {
            $this->state = $state;
        }
    
        public function create( $name )
        {
            $instance = new $name( $this->state );
            return $instance;
        }
    }
    

    这将具有额外的好处,即Factory创建哪个实例的所有结构共享同一个State实例。

  • 似乎您正在尝试让全局状态考虑您的代码库

    如果您的应用程序中的每个人都需要访问 的实例State,那么整个架构就存在严重问题。您最终会遇到所有层中都存在单个对象的情况,从而导致抽象的重大泄漏。您基本上只是隐藏了一个全局变量。

于 2012-06-29T00:04:31.130 回答