我有我的移动课程,它将定义玩家,敌人,移动设备...... 我有一个项目类,这是不言自明的......
为了示例,我们说有三个统计数据,
-> Strength
-> Dexterity
-> Intelligence
我计划在我的手机上提供这些统计数据,而在我的项目中,如果我的项目与0不同,那么它们就是我手机的修饰符。
我应该如何在课堂上存储这些内容?
应该是这样的:
MY_Item
{
var $stats_dex;
var $stats_int;
var $stats_str;
}
或者可能有另一个班级,"统计班"每个其他班级都会有......?
MY_Item
{
var $stats = new MY_Stats;
}
我的手机也一样吗?
因为在我的手机中,我也必须计算配备的物品......所以我最终会得到类似的东西:
class MY_Mobile
{
var $stats_dex;
var $stats_int;
var $stats_str;
var $modifier_stats_dex;
var $modifier_stats_int;
var $modifier_stats_str;
}
现在我正在使用第一个原型,但我已经对此感到不安......
答案 0 :(得分:0)
我认为一个简单的答案是,这就是方法派上用场的地方。如果您的业务规则是"移动设备的统计数据是原始统计数据和项目所做的所有修改的总和,那么我的建议是为移动设备和项目提供统计数据(稍后会详细介绍),然后为您的移动课程提供方法例如负责进行求和的getStat($statName)
。这可能被称为' facade'设计模式(您向外界呈现一个干净的界面,模糊项目修改统计数据的细节)。要彻底清除它,请将您的成员属性标记为受保护或私有,并且只允许该应用的其他部分使用该getter。
关于赋予多个类很多相同属性/行为的问题,有几个选项。最基本的(在这种情况下可能是错误的)是给他们一个共同的祖先,例如' statableEntity'。这是一个糟糕的选择,因为PHP是一种继承语言,并且statable不是您的类固有的。
第二个选择是PHP的一个名为Traits的相对较新的功能。这比类继承好一点,因为它开始感觉像多继承。如果行为在字面上完全相同,无论哪个类需要特征,这都是一个很好的选择。
第三种选择是使用界面。在此选项中,实现接口的所有类都需要具有相同的方法,但它们并不需要在方法体中使用相同的代码。当遵守界面的类可能希望以稍微不同的方式实现行为时,这是一个很好的选择。
我认为在你的情况下,我推荐界面,因为一个人的统计数据可能会以不同的方式响应上下文而不是项目上的相同统计数据(例如,可能是项目的当前值'因为该项目已经过时或者需要修复,或者某个人的统计数据随着饥饿等而变化,因此会减少统计数据。