使用抽象类和方法组织我的文件的问题

时间:2017-09-14 09:35:47

标签: php laravel abstract-class

我正在使用一个生成竞赛树的插件。

所以,我主要有两种类型的比赛,SingleEliminationPlayoff

在SingleElimination内部,我有2个案例,SingleEliminationWithPreliminaryRoundSingleEliminationWithoutPreliminaryRound

对于每种比赛类型,我有2种球员,球队和竞争对手,基本上,球队是竞争对手的集合。

所以,我尝试用这种方式组织我的代码:

-- TreeGen : (Abstract) All the common code, and the entry point

---- PlayOffTreeGen (Abstract extends TreeGen)

------ PlayOffCompetitorTreeGen (extends PlayOffTreeGen)

------ PlayOffTeamTreeGen (extends PlayOffTreeGen)

---- SingleEliminationTreeGen (Abstract extends TreeGen)

------ SingleEliminationTeamTreeGen (extends SingleEliminationTreeGen)

------ SingleEliminationCompetitorTreeGen (extends SingleEliminationTreeGen)

所以,这个组织工作得很好,我避免了很多条件,并且总体上降低了复杂性,但是现在,我的方法在SingleEliminationCompetitorTreeGenPlayOffCompetitorTreeGen都有重复。< / p>

所以,我觉得这是这种架构的极限,但我不知道应该如何让它发展。

任何想法都将受到赞赏!

1 个答案:

答案 0 :(得分:0)

也许你可以使用特质?作为一个例子,我有一个表单生成库,它使用DOMDocuments生成HTML(https://github.com/delboy1978uk/form)。

无论表单元素如何,所有这些HTML实体都可以设置属性,因此我最终得到了重复的代码。我通过创建HasAttributeTrait

解决了这个问题
namespace Del\Form\Traits;

trait HasAttributesTrait
{
    /** @var array $attributes */
    private $attributes = [];
    /**
     * @param $key
     * @return mixed|string
     */
    public function getAttribute($key)
    {
        return isset($this->attributes[$key]) ? $this->attributes[$key] : null;
    }
    /**
     * @param $key
     * @param $value
     * @return $this
     */
    public function setAttribute($key, $value)
    {
        $this->attributes[$key] = $value;
        return $this;
    }
    /**
     * @param array $attributes
     * @return $this
     */
    public function setAttributes(array $attributes)
    {
        $this->attributes = $attributes;
        return $this;
    }
    /**
     * @return array
     */
    public function getAttributes()
    {
        return $this->attributes;
    }
}

然后,在任何曾经拥有私有$属性和getter和setter的类中,现在只说:

use Del\Form\Traits\HasAttributeTrait;

class Whatever
{
     use HasAtttributesTrait;

    // other code here
}

现在你可以这样做:

$something = new Whatever();
$something->setAttribute('href', $url);

请注意,特征仅适用于PHP 5.4+,但当然,您是最新的,对吧? ; - )