Я работаю в плагине, который генерирует деревья соревнований.
Итак, у меня в основном 2 вида соревнований, SingleElimination
, а также Playoff
Внутри SingleElimination у меня есть 2 случая, SingleEliminationWithPreliminaryRound
,SingleEliminationWithoutPreliminaryRound
,
для каждого типа соревнований у меня есть 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)
Итак, эта организация прекрасно работает, я избегаю многих условных выражений и в целом получаю меньшую сложность, но теперь у меня есть методы, которые дублируются в обоих SingleEliminationCompetitorTreeGen
а также PlayOffCompetitorTreeGen
например.
Итак, я чувствую, что это предел архитектуры такого рода, но я не знаю, как мне заставить его развиваться.
Любая идея будет оценена!
Может быть, вы могли бы использовать черту? В качестве примера у меня есть библиотека генерации форм, которая использует 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;
}
}
Затем в любом классе, который имел частные атрибуты $ и методы получения и установки, теперь просто скажите:
use Del\Form\Traits\HasAttributeTrait;
class Whatever
{
use HasAtttributesTrait;
// other code here
}
Теперь вы можете сделать это:
$something = new Whatever();
$something->setAttribute('href', $url);
Обратите внимание, что черты работают только с PHP 5.4+, но, конечно, вы в курсе, верно? 😉
Других решений пока нет …