Проблема организации моих файлов с абстрактными классами и методами

Я работаю в плагине, который генерирует деревья соревнований.

Итак, у меня в основном 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 например.

Итак, я чувствую, что это предел архитектуры такого рода, но я не знаю, как мне заставить его развиваться.

Любая идея будет оценена!

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

Затем в любом классе, который имел частные атрибуты $ и методы получения и установки, теперь просто скажите:

use Del\Form\Traits\HasAttributeTrait;

class Whatever
{
use HasAtttributesTrait;

// other code here
}

Теперь вы можете сделать это:

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

Обратите внимание, что черты работают только с PHP 5.4+, но, конечно, вы в курсе, верно? 😉

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector