• Что делать, если нужно получить часть данных сущности?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    та еще зажигалка...
    1. "lazy loading" - в конструктор передаем обязательные к заполнению параметры, остальные данные подгружаем из базы по мере вызова методов т.е.
    public function getText(): string
    {
        if ($this->text === null) {
            $this->loadData();
        }
        return $this->text;
    }

    2. Использовать класс хэлпер, например, нужны breadcrumbs, создаем в хэлпере метод getBreadcrumbs в который передается массив Post объектов, метод извлекает данные из объектов и получает недостающие данные одним запросом сразу для всех постов.
    Ответ написан
    5 комментариев
  • Как сделать unit test метода в котором нужен заполненный массив?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    По-хорошему $this->solutions должно устанавливаться через конструктор, потому вам не составит труда заинжектить это состояние в тестируемый объект.

    Если у вас "пришлось", то можете заюзать некий хак, например через рефлексию/closure::bind установить состояние в тестируемый объект.

    Вот на скорую руку накидал (Разместите его в своем TestCase или прямо в тесте)
    protected function setPrivateProperty(object $object, string $propertyName, $value): void
    {
        $reflectionClass = new \ReflectionClass(get_class($object));
        $property = $reflectionClass->getProperty($propertyName);
        
        $property->setAccessible(true);
        $property->setValue($object, $value);
        $property->setAccessible(false);
    }


    ПРИМЕР
    Класс и метод, который нужно протестить и приватная переменная которого заполняется не через конструктор
    class System 
    {
        // Не важно, как оно будет заполнено, важно, 
        // что в методе мы проверяем некоторые значения  
        // и мы создадим ниже в тестах эти ситуации разными тест-кейсами
        private $solutions;
    
        public function checkRecords(): string
        {
            if (count($this->solutions) === 3) {
                return 'full';
            }
    
            if (count($this->solutions) === 6) {
                return 'overflow';
            }
    
            throw new IncorrectCountException('Incorrect solutions count.');
        }
    }


    Тесты
    public function testCheckRecordsFull(): void
        {
            // 3 элемента
            $data = [1, 2, 3];
            $system = new System();
            $this->setPrivateProperty($system, 'solutions',  $data);
    
            $status = $system->checkRecords();
    
            $this->assertEquals('full', $status);
        }
    
        public function testCheckRecordsOverFlow(): void
        {
            // 6 элементов
            $data = [1, 2, 3, 4, 5, 6];
            $system = new System();
            $this->setPrivateProperty($system, 'solutions',  $data);
    
            $status = $system->checkRecords();
    
            $this->assertEquals('overflow', $status);
        }
    
        public function testCheckRecordsIncorrectCOunt(): void
        {
            // сколько-то элементов, но не 3 и не 6
            $data = [1];
            $system = new System();
            $this->setPrivateProperty($system, 'solutions',  $data);
    
            $this->expectException(IncorrectCountException::class);
            $system->checkRecords();
        }

    Код тестовый, просто отобразить принцип, возможно у вас в классе зависимости -- нужно будет сделать моки и т.д. Тут некоторые повторения можно вынести в setUp().
    Также хочу обратить внимание, что тесты построены по принципу ААА (Arrange, Act, Assert).
    Как итог, 3 ситуации, все протестированы, методу не важно, как заполнлась приватная переменная, но вся его логика протестирована. Все легко и просто.
    Ответ написан
    7 комментариев
  • Возможно ли получить уникальный идентификатор файла?

    Полагаю, что если строить свою ИС (инф. сист.) поверх прослойки, работающей посредством FUSE, то все упростится.
    В своей нижележащей ФС можно назначать файлам UUID. Файл - это некий объект, с которым может быть ассоциирована такая служебная информация, как имя файла или URI, в общем виде, которые подвержены частым изменениям. Набор таких объектов хранить в некой СУБД (допустим, SQLite).
    При монтировании хранилища посредством FUSE в какую-нибудь директорию наружу будут видны как обычные файлы. При изменении имени файла меняется только служебная информация об объекте в хранилище. Хранилище может быть как локальное, так и удаленное. При удалении файла-документа в хранилище можно пометить объект как подлежащий утилизации или же просто удалению. При изменении версии файла-документа меняется содержимое объекта в хранилище. В служебной информации (meta data) можно также хранить хэш от содержимого.
    Ответ написан
    Комментировать
  • Есть ли будильник с поддержкой алгоритмов (своих условий)?

    @Raim
    Я пользуюсь Alarm Clock Xtreme Free. Помимо выставление нужного варианта работы будильника в течении недели, корректное подключение по Bluetooth (c динамикми или без). У меня слуховой апарат с bluetooth - будильник будет меня и немешает сигналом другим.
    Ответ написан
    Комментировать
  • Composer дает ошибку "Your requirements could not be resolved to an installable set of packages". Как разрешить?

    @krlljs Автор вопроса
    Нашел поднятую тему тут и тут, там и же и подсказка к разрешению:

    1. Проверить наличии расширения ext-xsl

    $ composer show --platform | grep ext-x
    $ composer show --platform | grep ext-xsl

    2. если в списки ext-xsl не будет, установи
    $ sudo apt-get install php5-xsl
    3. и добавляй зависимость в composer.json как require-dev, читай Require inline alias
    composer require --dev phpdocumentor/phpdocumentor dev-master

    4. чтоб ошибка больше не тревожила, следует так же добавлять зависимость на расширения, читай Platform packages
    composer require --dev ext-xsl "*"
    Ответ написан
    4 комментария
  • Как собственнику удержать клиентов при увольнении РОПа?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Как так он может увести клиентов? Он сможет создать аналогичные предложения для клиентов? Что это за предложения такие? Вы чем 10 лет то занимались (в плане услуг и сервисов)?

    Может вы имели в виду — может контакты увести? Тогда он скорее всего их уже увел (если намеревался)... Тут только остается подумать как сделать, чтобы следующий не увел. И подумать, как нейтрализовать урон... ниже написал способы — и для нейтрализации подойдут


    Если все же вы обычная торговая компания
    и за 10 лет не создали добавленной стоимости самой себе, ССЗБ

    Тут нужно думать как партизан:

    • выделить лояльных менеджеров и перевести на них ключевых клиентов... познакомить, ввести в курс дела (заодно пыль стряхнуть и что-нибудь продать) и честно предупредить о том, что ваш сотрудник уходит
    • сделать реструктуризацию (например сделать 2 отдела, 1й отдел — хантеры, которые только продают, 2й отдел только на поддержке, чтобы РОП остался в 1 отделе, а клиенты (не новые) были во втором) тут нужно подумать про ИТ-систему, но чисто бизнесово он (РОП) с этими клиентами не будет работать, во время этого нужно условие — затянуть РОП на работе некоторое время
    • не предлагать скидок и скидочных акций клиентам!
    • максимально гладко для РОП сделать переход (если вы собираетесь уволить, тк подточили под него все необходимое говно, то проблем не избежать)
    • вести уход максимально гласно — опубликовать везде про достижения РОП, сделать даже рассылку клиентам (только чтобы не было культа в «месседже»)
    • помочь РОП, да — помочь ему открыть бизнес или сделать его партнером (не в этой компании), а партнером на рынке... так многие крутые компании делают, тут большое поле для творчества, главное — друзья



    UPD: устроить в другую компанию на работу, поговорите с партнерами, может кому РОП нужен... выбейте условия даже получше своих....
    Причем это можно сделать настолько элегантно, что как-будто предложение настолько хорошо, что пора бы уйти...
    Ответ написан
    6 комментариев
  • Возможно ли сделать цельный фигурный блок с рабочим в нём overflow:hidden?

    Stalker_RED
    @Stalker_RED
    clip-path же.
    https://jsfiddle.net/t89nd42z/1 (тучку лучше в векторном редакторе нарисовать, не через path а при помощи дуг, например)
    Ответ написан
    8 комментариев
  • Как отлаживать javascript для ipad/iphone?

    crazy_leo
    @crazy_leo
    Frontend Developer
    Комментировать
  • Как провести подстановку в шаблон строки на js?

    lazalu68
    @lazalu68
    Salmon
    RegExp.template = /{(.*?)}/g;
    
    String.prototype.process = function(data) {
    	return this.replace(RegExp.template, (entry, word) => data[ word ]);
    }
    
    string = 'Меня зовут {name} и мой возраст {age}';
    user = {name: 'Lander', age: 33};
    
    string.process( user ); // 'Меня зовут Lander и мой возраст 33';
    Ответ написан
    2 комментария