我正在使用一个生成竞赛树的插件。
所以,我主要有两种类型的比赛,SingleElimination
和Playoff
在SingleElimination内部,我有2个案例,SingleEliminationWithPreliminaryRound
,SingleEliminationWithoutPreliminaryRound
,
所以,我尝试用这种方式组织我的代码:
-- 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)
所以,这个组织工作得很好,我避免了很多条件,并且总体上降低了复杂性,但是现在,我的方法在SingleEliminationCompetitorTreeGen
和PlayOffCompetitorTreeGen
都有重复。< / p>
所以,我觉得这是这种架构的极限,但我不知道应该如何让它发展。
任何想法都将受到赞赏!
答案 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+,但当然,您是最新的,对吧? ; - )