分享"统计"在许多班级之间


Sharing "stats class" between many classes

我有我的手机类,它将定义玩家,敌人,手机…我有一个项目类,它是自解释的…

为了便于示例,我们假设我们有三个状态,

-> Strength
-> Dexterity
-> Intelligence

我打算在我的手机上有这些统计数据,在我的物品上,如果我的物品上它们不同于0,它们因此是我的手机的修饰语。

如何在我的类中存储这些?

应该是这样吗:

MY_Item
{   
  var $stats_dex;
  var $stats_int;
  var $stats_str;
}

或者可能有另一个类,"Stats类",其他类也会有…

?
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;
}

现在我正在使用第一个原型,但是我已经对它感到不安了。

我认为一个简单的答案是,这是方法派上用场的地方。如果你的"业务规则"是手机的属性是原生属性和所有道具修改的总和,那么我的建议是同时给手机和道具添加属性,然后给你的手机类添加一个方法,比如getStat($statName),它负责做这个总和。这可能被称为"外观"设计模式(您向外部世界呈现一个干净的接口,模糊了项目修改状态的细节)。为了干净利落地完成这个任务,把你的成员属性标记为protected或private,并且只允许应用程序的其他部分使用getter。

关于给多个类许多相同的属性/行为的问题,有几个选项。最基本的(在这种情况下可能是错误的)是给它们一个共同的祖先,例如'statableEntity'。这是一个糟糕的选择,因为PHP是一种继承语言,可状态性并不是你的类所固有的。

第二个选择是PHP相对较新的特性,称为Traits。这比类继承要好得多,因为它开始感觉像是多重继承。如果无论哪个类需要这个trait,它的行为都是完全相同的,那么这是一个很好的选择。

第三种选择是使用接口。在此选项中,实现接口的所有类都需要具有相同的方法,但它们并不都需要在方法体中使用相同的代码。当遵循接口的类可能希望以稍微不同的方式实现行为时,这是一个很好的选择。

我认为在你的情况下,我推荐界面,因为一个人的状态可能会以不同的方式响应上下文,而不是一个物品的相同状态(例如,一个物品的当前状态值可能会因为物品"旧"或"需要修复"而减少,或者一个人的状态会随着饥饿而改变,等等)。