关于面向对象设计和包装器方法的建议

时间:2012-06-12 10:13:03

标签: php oop factory

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

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

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

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

我不太了解PHP如何在内部工作,但这是否有效?我的思维过程一直是因为我通常只有一个State对象的实例,所以在我的Factory类中使用方法包装器会更好,因为否则这些方法会包含很多大部分时间都没有使用的代码。但我不确定PHP如何在内部工作。

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

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

1 个答案:

答案 0 :(得分:3)

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

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


很少有关于你主题的想法

我得到的印象是,你做错了 tm 。以下是我在问题中所写的问题:

  • State类负责配置 OR “状态特定方法”吗?

    SRP之类的东西,它指出每个班级都应该承担一个责任。你也可以说,每个班级应该只有一个季节要改变。

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

    在面向对象的代码中,关键字extends表示类之间的 is-a 关系。拥有class Oak extends Tree是可以的,但是当你写class User extends Table时,它就完全疯了......有点侮辱。这由LSP涵盖(有关简化说明:look here)。

  • 您误解了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的实例,那么整个架构就会出现严重问题。最终会出现所有图层中都存在单个对象的情况,从而导致抽象中出现严重泄漏。你基本上只是隐藏了一个全局变量。