21

Re: Задача на 5

Корочше задача має зайву складність. Клас Dealer можна спростити до вигляду

class Dealer {
 
    public $name = null;
 
    public function __construct($name) {
      $this->name = $name;
    }
 
    public function getName() {
      return MemoryCache::load($this->name, function () {
        return strtolower($this->name); //point 1
      });
    }
 
    public function getUName() {
      return MemoryCache::load($this->name, function () {
        return strtoupper($this->name); //point 2
      });
    }
 
  }
 
  $dealer = new Dealer('funivan');
  echo $dealer->getName() . "\n";
  echo $dealer->getName() . "\n";
  echo $dealer->getName() . "\n";
  echo $dealer->getUName() . "\n";
  echo $dealer->getUName() . "\n";
  echo $dealer->getUName() . "\n";

А знаючи ключ кешу, елементарно видати кеш.

22

Re: Задача на 5

З ключем може будь хто в кеш засунути дані і потім по ключу отримати. А тут суть в тому що б помізкувати і почитати документацію ;)

Подякували: leofun011

23

Re: Задача на 5

funivan написав:

З ключем може будь хто в кеш засунути дані і потім по ключу отримати. А тут суть в тому що б помізкувати і почитати документацію ;)

Мізкувати треба над чимось розумним. Не розумно розв'язувати лише "по складному", коли є елементарний розв'язок.

24

Re: Задача на 5

ktretyak написав:

Мізкувати треба над чимось розумним. Не розумно розв'язувати лише "по складному", коли є елементарний розв'язок.

Мізкуйте над чим хочете)) Хто не хоче розв’язувати цю задачу хай пише в іншу гілку :)

ktretyak написав:

Не розумно розв'язувати лише "по складному", коли є елементарний розв'язок.

Скажу одне слово: головоломки.

25

Re: Задача на 5

ktretyak написав:

Корочше задача має зайву складність. Клас Dealer можна спростити до вигляду

class Dealer {
 
    public $name = null;
 
    public function __construct($name) {
      $this->name = $name;
    }
 
    public function getName() {
      return MemoryCache::load($this->name, function () {
        return strtolower($this->name); //point 1
      });
    }
 
    public function getUName() {
      return MemoryCache::load($this->name, function () {
        return strtoupper($this->name); //point 2
      });
    }
 
  }
 
  $dealer = new Dealer('funivan');
  echo $dealer->getName() . "\n";
  echo $dealer->getName() . "\n";
  echo $dealer->getName() . "\n";
  echo $dealer->getUName() . "\n";
  echo $dealer->getUName() . "\n";
  echo $dealer->getUName() . "\n";

А знаючи ключ кешу, елементарно видати кеш.

Це знову невірне рішення :) $this->name буде однаковим що у getName, що у getUName, тому і ключ буде один.

26

Re: Задача на 5

TwiStar написав:

Це знову невірне рішення :) $this->name буде однаковим що у getName, що у getUName, тому і ключ буде один.

Так. Але важливіша суть, яку я хотів показати. Я мало часу приділяв щоб аналізувати цей код. Його елементарно привести до кондиційного стану.

Натомість ваше рішення працює так як це захотів побачити funivan, але суть вашого рішення - це костиль.

Якщо не можна створити задачу, де її потрібно вирішувати саме так, то значить вона робить щось не те...

27

Re: Задача на 5

ktretyak написав:

Якщо не можна створити задачу, де її потрібно вирішувати саме так, то значить вона робить щось не те...

Не всі задачі створюються для того що б десь їх використовувати. Де ви використовуєте кубік рубік ?
Це для того що б ознайомитись з можливостями мови. Якщо ви знаєте про рефлексію і шарити як за допомогою неї можна витягувати певні дані з анотацій або з будь яких інших джерел тоді це круто. Не обов’язково що ця задача має бути втілена в життя і юзатись у проекті.

Суть кешу всі прекрасно знають і ніхто ніколи не передає ключ кешу через конструктор у такому форматі як ви зробили)) Це ж смішно.
Як мінімум можна використовувати для кешу __METHOD__ константу ))

Подякували: quez, leofun012

28

Re: Задача на 5

Ви праві, що багато задач, які в житті можуть ніколи і не знадобитись але корисні як тренувальні.

Тільки це зовсім не означає, що будь-яка задача може стати тренувальною. Їх треба придумувати так, наче вони взяті з реального життя.

Стосовно мого "смішного рішення", то повторююсь - я приділяв йому замало часу щоб щось можна було готове взяти і використовувати. В мене є своя набагато цікавіша задача - як вводячи дані в два поля, можна створити довільну ієрархію даних (ну майже довільну)

29

Re: Задача на 5

ktretyak написав:

В мене є своя набагато цікавіша задача

Спробуйте створити тему на форумі) ми з радістю постараємось її вирішити)

30

Re: Задача на 5

Мій варіант без Reflection.
Докинув лічильник щоб було видно, що функції виконуються тільки один раз

Прихований текст
<?php
class MemoryCache {
    private static $cache = [];
    static function load($param) {
        $backTrace = debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT, 2)[1];
        $key = md5(serialize($backTrace['object']).$backTrace['function']);

        if (!array_key_exists($key, self::$cache)) {
            self::$cache[$key] = $param();
        }

        return self::$cache[$key];
    }
}

global $i;
$i=0;
class Dealer {
     
    public $name = null;
 
    public function __construct($name) {
      $this->name = $name;
    }
 
    public function getName() {
      return MemoryCache::load(function () {
          global $i;
          $i++;
        return strtolower($this->name); //point 1
      });
    }

    public function getUName() {
      return MemoryCache::load(function () {
          global $i;
          $i++;
        return strtoupper($this->name); //point 1
      });
    }
  }


  $dealer = new Dealer('funivan');
  echo $dealer->getName() . "\n";
  echo $dealer->getName() . "\n";
  echo $dealer->getName() . "\n";
  echo $dealer->getUName() . "\n";
  echo $dealer->getUName() . "\n";
  echo $dealer->getUName() . "\n";

echo $i;
Подякували: leofun011