【问题标题】:What's the best design for extra data on behaviour class?行为类额外数据的最佳设计是什么?
【发布时间】:2017-11-26 07:04:44
【问题描述】:

我有一个游戏,玩家可以完成一些任务。

我已将任务的行为部分与其 ORM 部分分开。 最终,任务的副本会保存在玩家文档的某个位置(对于这个特定问题来说并不重要)。

问题是,我不确定将我发送给客户端的额外信息放在哪里,这些信息对于行为本身来说不是必需的,但需要显示有关任务本身的玩家信息。

这是我的任务界面:

interface ITask
{
    /**
     * @param Player $player
     */
    public function init(Player $player);

    /**
     * @param PlayerAction $action
     */
    public function progress(PlayerAction $action);

    public function reset();

    /**
     * @return bool
     */
    public function isComplete();
}

这是我的抽象任务:

abstract class BaseTask implements ITask
{
    /**
     * @var int
     */
    public $id;

    /**
     * @var int
     */
    protected $currentValue;

    /**
     * @var int
     */
    protected $targetValue;

    public function __construct($targetValue)
    {
        $this->currentValue = 0;
        $this->targetValue = $targetValue;
    }

    /**
     * @param int
     */
    public abstract function setCurrentValue($current);

    /**
     * @return  int
     */
    public abstract function getCurrentValue();

    /**
     * @return int
     */
    public abstract function getID();

    /**
     * @param int
     */
    public abstract function setID($id);

    /**
     * @return int
     */
    public abstract function getTargetValue();

    /**
     * @param int
     */
    public abstract function setTargetValue($target);

    /**
     * @return boolean
     */
    public function isComplete()
    {
        if ($this->getCurrentValue() >= $this->getTargetValue())
        {
            return true;
        }

        return false;
    }
}

现在我需要决定如何放置额外数据,例如描述、标题、主题等...

  1. 我想了两个选择:我可以把它放在基础任务上 本身,但是如果我不需要它会发生什么?我只是离开它 空白的?感觉对我来说是个错误的地方。
  2. 我可以创建一个包装器 将举行任务的班级,但随后我将需要始终 调用包装器来完成任务,感觉有点像 错了。

寻找替代建议。

【问题讨论】:

    标签: php design-patterns orm


    【解决方案1】:

    您应该从 TaskBase 继承 CustomTask。

    如果您对继承有限制,请将附加字段封装到一个名为 TaskAdditionalInfoBase 的类中并关联到 TaskBase。

    然后各种类可以继承 TaskAdditionalInfoBase 以向任务呈现自定义的附加信息。

    【讨论】:

    • 但是,如果您只想按原样使用任务,而没有这些附加信息,您会怎么做?将它们留空是一种糟糕的设计,现在是这样吗?
    • 我在扩展时遇到的另一个问题是,如果我从 CustomTask 继承,但我想要从 CustomTask2 上的 CustomTask 扩展的类的相同行为...它将迫使我重复行为。
    • 主要思想是将您期望更改/替换的内容与您期望保持不变的内容分开,并为通用部分使用的更改组件签订合同。
    • 我明白你的意思。所以基本上我可以有一个 NullTask​​AdditionalInfo 因此我不必“浪费”空间。谢谢你的主意。我会尝试实现它。
    • 当然可以在没有额外数据或行为的情况下让关联为空。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多