Наследование vs Агрегация
У нас с Long завязался идеалогический спор на тему ООП
Есть 2 класса.
Мое мнение что в данной реализации это выглядит как: человек сидящий внутри холодильника и полученную еду распихивающий по полкам. Вместо того чтобы открывать его и класть куда надо.
Long говорит что тут как агрегация так и наследование можно применить, но наследование удобнее.
Я же считаю что это грубейшее нарушение основ ООП. Кто прав?
У нас с Long завязался идеалогический спор на тему ООП
Есть 2 класса.
PHP:
/**
* Класс TheRegistry.
*
* Реализует паттер Registry - хранилище. Данный класс должны использовать все остальные
* классы системы, которым необходимо хранить данные.
*
*/
class TheRegistry{
/**
* Хранилище данных.
*
* В переменной сохраняются данные в виде элементов ассоциативного массива:
* - ключ - идентификатор сохраняемых данных;
* - значение элемента - сами данные.
*
* @var array
*/
protected $store = array();
/**
* Метод, реализующий сохранение данных $object с пометкой $label.
*
* В качестве данных могут выступать различные типы объектов, разрешенных в PHP.
*
* @param string $label Метка данных.
* @param resource $object Данные для сохранения.
*/
public function register($label, $object) {
if(!isset($this->store[$label])){
$this->store[$label] = $object;
}
}
/**
* Удаляет данные, сохраненые с меткой $label.
*
* @param string $label Метка данных.
*/
public function unregister($label) {
if(isset($this->store[$label]))
{
unset($this->store[$label]);
}
}
/**
* Возвращает данные, сохраненые с метой $label
*
* @param string $label Метка данных.
* @return resource Сохраненые данные.
*/
public function get($label) {
if (is_array($label)) {
$tmp = &$this->store;
foreach ($label as $v) {
if (!isset($tmp[$v])) {
return false;
}
else {
$tmp = &$tmp[$v];
}
}
return $tmp;
}
elseif(isset($this->store[$label])){
return $this->store[$label];
}
return false;
}
/**
* Проверяет установлены ли данные для метки $label.
*
* @param string $label Метка данных.
* @return boolean
*/
public function has($label) {
if (is_array($label)) {
$tmp = &$this->store;
foreach ($label as $v) {
if (!isset($tmp[$v])) {
return false;
}
else {
$tmp = &$tmp[$v];
}
}
return true;
}
elseif(isset($this->store[$label])){
return true;
}
return false;
}
}
/**
* Класс, описывающий подставку под маркеры
* Реализует паттерн Singleton (предполагается, что на доске имеется только одна
* подставка под маркеры) и использует паттерн Регистр.
**/
final class cMarkersBox extends TheRegistry {
/**
* Ссылка на $this.
*
* Используется для реализации паттерна Singleton
*
* @static
* @access private
*/
static private $thisInstance = null;
/**
* Конструктор для реализации паттерна Singleton.
* @access private
*/
private function __construct() { }
/**
* Метод создания Singleton.
*
* Метод создает и(или) возвращает единственный объект класса cMarkersBox.
*
* @return cMarkersBox
*/
static public function getInstance() {
if (self::$thisInstance == null) {
self::$thisInstance = new cMarkersBox();
}
Log::add('Повесили на доску подставку для маркеров');
return self::$thisInstance;
}
/**
* Добавляет на полочку новый маркер
*
* @param cMarker $m
*/
public function addMarker(cMarker $m) {
parent::register( $m->getColor(), $m );
Log::add('Добавили маркер цвета ' . $m->getColor() . ' и типа ' . $m->getType());
}
}
Long говорит что тут как агрегация так и наследование можно применить, но наследование удобнее.
Я же считаю что это грубейшее нарушение основ ООП. Кто прав?