如何使我的对象/类更具可移植性?

时间:2010-01-07 06:53:18

标签: php class object

根据我对面向对象编码的基本理解,在我的情况下,你想让你所有的课程彼此独立。我刚开始使用面向对象的应用程序,所以现在是我在早期阶段进行更改的好时机。

在这种情况下,我违反了这条规则或者你想要的任何规则。

我有一个会话类,它有一个设置方法,它允许我将变量设置为php会话,并且我有一个视图方法让我查看一个值已使用set方法设置的值。到目前为止,它可能听起来不错,但在我的网站的每个页面上,我都需要访问会话数据或会话对象。但是除了使用会话对象的每个页面之外,我还在所有需要会话值的类中使用它们。我相信这是我搞砸的地方,因为现在所有这些其他类都依赖于会话类。

关于这是否是错误的任何想法,如果是,我有什么方法可以避免它,但仍然可以访问其他类中的会话数据,并且仍然可以将我的类作为便携式插件播放到其他未来应用

4 个答案:

答案 0 :(得分:1)

这种关系称为依赖关系或耦合关系。您通常希望减少任何应用程序中的耦合(面向对象或不面向对象)。如何做到这一点可能是程序员最重要的技能,并不能真正归纳为一些规则。

但是,在最基本的情况下,您应该尝试区分基本依赖项和意外依赖项。前者是一个不可解决的问题,所以你不应该尝试。例如,如果您的所有页面都需要访问会话,那么您实际上无法帮助他们。但是,如果他们只需要一些时间,那么你可以尝试将你的应用程序考虑在内,以便解决这个问题。

另一个重点是最小化组件之间的接口。如果xX的子集而Y依赖于x,那么您不应该传递X。这通常是一个有改进空间的地方。

答案 1 :(得分:0)

考虑一下其他类需要什么才能在您的域模型方面发挥作用。会话数据是一个实现细节,不应影响您设计其他类的方式。会话对象可能有100个属性,但并非每个类都需要所有100个属性才能工作。他们不需要知道这些数据是存在于会话,cookie,平面文件,数据库还是地球外的卫星上。

我在设计课程时发现有用的优秀资源是this book,特别是第6章,“工作阶段”,用于你的问题。

答案 2 :(得分:0)

您可以添加一个抽象级别,使其WorkingClass> StoringMapper> SessionWorkingClass只调用StoringMapper。因此,您可以轻松地将存储过程“映射”到除Session之外的任何其他类(例如DatabaseSession),而不会对WorkingClass进行任何更改。

为了回应另一个问题,我写了一些代码:Advice on framework design

答案 3 :(得分:0)

一般来说,使用另一个类的一个类是纯粹的基本OO和你想要的。使用Interfaces是一种让您的具体逻辑孤立的方法,同时让其他类以统一的方式使用此组件。一种简单而常见的方法是使用工厂抽象工厂,而不是直接调用构造函数。您还应该看一下控制反转依赖注入(DI)范例。 Here's a rudimentary example可以帮助您解决问题(但请注意,作者在工厂和DI之间混淆)。

一个不复杂的解决方案是从Session类中提取接口。想一下调用者在会话对象中需要什么。然后在你的课堂上实现界面。您可能希望将此类设为 Singleton (在运行时只存在一个实现的类)。然后,创建一个实例化脚本组件的工厂。将会话实例传递给分解方法中的组件。