[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: SOLID
Страницы: 1, 2, 3, 4
twin
Цитата (Arh @ 5.10.2015 - 08:00)
Другими словами "Нельзя переопределить метод" =)

Можно, почему нельзя то. Главное чтобы он тип данных не изменял. В примере же он переопределен. smile.gif Вот метод eatFood() пока с одним типом работал, все было гут. Это была простая строка. Преобразовали в верхний регистр и отправили в метод базового класса.
А потом тип дпнных изменился, стал ключем массива, откуда строка берется. Вроде так же передали строку, но если посредника исключить, базовый класс не может работать с ключами, у него и массва то нет. И всё рухнуло. Нарушился принцип.

Цитата (Arh @ 5.10.2015 - 08:00)
Получается класс кэш будет не настраиваемый

Не совсем понял, но мне кажется для этого абстракция должна подойти.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
chee
Цитата (Arh @ 5.10.2015 - 00:13)
Грубо говоря класс кэшеширования использует класс настроек что бы понимать куда и как кэшировать, но при этом класс настроек кэширует свои настройки с помощью класса кэша.

Создай объект конфигурации у которого не будет системы кэширования и передовай его в объект кэша. Настроеный объект кэша, передай уже в конфигурацию, которая работает с кэшем. То есть настройки кэша у тебя не будут кэшироваться, и будут настраиваться отдельно от все конфигурации.


interface Configuration
{

}


abstract class AbstractConfiguration extends Configuration
{
public $cache;

abstract public function get($name);
}

class ConfigurationCached extends AbstractConfiguration
{
public function get($name)
{
$value = $this->cache->get($name);

if (!is_null($value)) {
return $value;
}

return $this->load($name);
}
}


class ConfigurationWithoutCached extends AbstractConfiguration
{
public function get($name)
{
return $this->load($name);
}
}


class Cache
{
public $configuration;

public function get($name)
{
$this->tryInit();

return $this->fetch($name);
}

protected function tryInit()
{
// здесь используем настройки $configuration
}
}


$cache = new Cache;
$config = new ConfigurationWithoutCached;
$cache->configuration = $config;
$config2 = new ConfigurationCached;
$config2->cache = $cache;


Эту проблему нельзя обойти путем умного определения на то что мы вошли в рекурсию, так как это приведет к тому что объекты будут знать о друг о друге слишком много и о том как они работают. Потому лучше сделать вот такую вот подмену.

То есть, если сделать вот так, то это будет не правильно

class ConfigurationCached extends AbstractConfiguration
{
public function get($name, $useCache = true)
{
if ($useCache) {
$value = $this->cache->get($name);

if (!is_null($value)) {
return $value;
}
}


return $this->load($name);
}
}


$config = new ConfigurationWithoutCached;
$config->get('ip_cache', false);


Так как аргумент $useCache очень конкретно показывает нам, что внутри есть кэш и он явно влияет на отдаваемый результат, что в свою очередь нарушает принцип ООП - инкапсуляция.

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.