• Паттерн Repository и Active Record?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Что такое репозиторий? Это что-то что отвечает за хранение данных. Целиком и полностью. То есть вот простенький интерфейс простенького репозитория:

    interface UserRepository {
        public User getUser(UserID id);
        public void add(User user);
        public void remove(User user);
    }


    Где именно репозиторий хранит данные, в базе данных, в памяти, в файлах, на удаленном сервере с запросами через http - это все детали реализации. То есть репозиторий - это паттерн для того, что бы абстрагировать наш код от места хранения данных.

    Репозиторий который умеет только выборки делать - это не репозиторий. Это штука для выборок, Finder. Так же мы должны тут заметить, что "строками таблиц" является объект типа User, а репозиторий представляет собой абстракцию от таблицы (очень упрощенно. есть еще паттерн table data gateway который отвечает именно за одну таблицу, репозиторий же может хэндлить и связи между таблицами и вообще оперирует именно объектами предметной области а не их отображением на базу).

    Active Record же делает именно то, что говорит название. Это объект, который представляет собой одну строку из таблицы. Он сам может себя вставить, обновить или удалить из таблицы. Однако "найти себя" он не может к примеру, за это отвечает какой-то другой объект (мне нравится название Finder, поскольку это именно то что делает объект - ищет наши строки таблиц). Частенько для упрощения методы файдеров делаются как статические методы.

    По сути ActiveRecord есть ничто иное как упрощенная комбинация из Domain Object + Row Data Gateway.
    Ответ написан
    Комментировать
  • Что такое оверхэд (overhead)?

    @egorinsk
    Неизбежные накладные расходы.

    Например, программа, которую вы написали, делает полезную работу в течение 10 мс, но на запуск и завершение виртуальный машины Ява уйдет дополнительно 5 секунд, и эти 5 секунд будут оверхедом.
    Ответ написан
    2 комментария
  • Что значит оборачивание функции в скобки (function() { ... })?

    copist
    @copist
    Empower people to give
    Короткий ответ
    (function() { ... })()
    Это определение анонимной функции без параметров и непосредственный вызов её, так же, без параметров

    Длинный ответ
    Зачем оборачивать значение в круглые скобки?

    Оборачивание функции в скобки, так же как и оборачивание константы в скобки - это просто способ показать интерпретатору, что это значение внутри скобок может быть использовано как возвращаемое значение.
    var var_a = 5
    (var_a) /* или */ (5) // не является ошибкой, возвращает значение переменной или выражения
    function func_b() { }
    (func_b) /* или */ (function func_b() { }) // не является ошибкой, возвращает ссылку на функцию
    var var_c = { key: "val" }
    (var_c) /* или */ ({ key: "val" }) // не является ошибкой, возвращает объект
    var var_d = [ "one", "two" ]
    (var_d) /* или */ ([ "one", "two" ]) // не является ошибкой, возвращает массив


    Ну а раз (func_b) - это ссылка на функцию func_b, то значит её можно сразу же вызвать.
    A если (var_c) - это объект, то значит можно сразу же использовать его
    Аналогично (var_d) - это массив, то значит можно сразу же использовать его

    (func_b)() или (function func_b() { })() вызвать функцию
    (var_c).key или ({ "key": "val" }).key использовать объект
    (var_d)[0] или ([ "one", "two" ])[0] использовать массив

    Синтаксической ошибкой было бы использование функции, массива, объекта без скобок ( )
    function func_b() { }() ошибка "Unexpected token )"

    Хотя нет ошибки, по крайней мере в Google Chrome
    { key: "val" }["key"]
    ["one", "two"][0]

    Для чего вообще придумали самовызывающиеся функции?
    Для того, чтобы изолировать переменные и функции, чтобы они не попадали в глобальную область видимости.

    Сравни
    var a = "test"
    alert(a)

    по завершении этого блока переменная a болтается в глобальной области видимости

    и
    (function(){
        var a = "test"
    })()
    
    alert(a) // недоступно, потому что она была локальной переменной внутри анонимной функции


    Почему скобки ( ) пустые?
    В данном случае у функции function() { ... }нет формальных параметров, значит и вызывать можно без параметров.

    Но вообще в самовызывающуюся функцию можно передавать параметры. Это общая практика передачи ссылок на глобальные объекты:

    (function (w, d, $) {
       // некоторым нравится сокращать код путём использования коротких имён переменных
       w['fizz'] = "buzz" // вот так можно принудительно зарегистрировать
                           // глобальную переменную fizz
       $('body').css({background: 'red'}) // вот так можно работать с jQuery через привычную $
                           // даже если библиотека была загружена в режиме noСonflict
    }(window, document, jQuery))


    Некоторым не нравится длинный вариант проверки на undefined и они специально предусматривают лишний параметр, который не инициализируют

    (function (message1, message2, empty) {
        // это и есть проверка на undefined
        if (message1 === empty)
            alert('message1 is undefined')
        else
            alert('message1 = ' + message1)
    
        if (message2 === empty)
            alert('message2 is undefined')
        else
            alert('message2 = ' + message2)
    })("test") // вызвана только с одним параметром, значит второй по имени message2
    //  будет пустой, а третий empty специально ввели в качестве образца
    //  данных с типом "undefined", для служебного использования

    Зачем функция анонимная?
    Аналогично - чтобы не регистрировать её имя в глобальной области видимости, если она нужна один раз.
    Ответ написан
    7 комментариев
  • Как делать деплой с github на продакшен сервер?

    DmitryVoronkov
    @DmitryVoronkov
    Python Developer
    # Скачиваешь сайт себе на сервер
    your-server: ~$ git clone https://github.com/you/you_repo /your_path
    # И потом обновляешь
    your-server: ~$ cd /your_pth
    your-server: ~$ git pull
    Ответ написан
    2 комментария
  • Нормально ли использовать sprintf() для конкатенации строк в php?

    @Snewer
    С точкой (а при выводе лучше и с запятой) будет гораздо быстрее
    Ответ написан
    Комментировать
  • Переход с php5 на php7?

    orlov0562
    @orlov0562 Куратор тега PHP
    I'm cool!
    добавь после mysqli_query:
    $result = mysqli_query(...)
    ...
     if ($err = mysqli_error()) die($err);

    И напиши сюда ошибку, если такая имеется

    так же не видать функций соединения, возможно оно у тебя не создается, так что добавь еще проверку и на это
    include ("bd.php");
    if (!is_resource($bd)) die('No connection to database');
    Ответ написан
    Комментировать
  • В каком файле лежит шаблон списка записей на WordPress?

    Creamov
    @Creamov
    Senior Fullstack Software Engineer
    Вывод записей обычно есть сразу в нескольких местах:
    index.php
    archive.php
    category.php
    tag.php
    taxonomy.php
    search.php

    И их производные с {id} или {slug}, например:
    archive-news.php // slug
    category-123.php // id
    ... и т.д.

    Иерархию файлов темы в WP можно посмотреть тут: Wordpress Template Hierarchy. В разных нестандартных темах список записей может быть где угодно.
    Ответ написан
    Комментировать
  • Как преобразовать tsv ответ яндекс директ api в массив?

    Rattlesneyk
    @Rattlesneyk Автор вопроса
    Чуть-чуть доработал ответ Владимир Варламов
    Спасибо!
    $str = preg_replace("/Total rows:(.*)/", "", $str);  
    $str =  explode("\n", $str) ;
    unset($str[0]);
    unset($str[1]);
     
    foreach($str as $line){
    	if(!empty($line)){
        list($gn, $imp, $cl, $coast) = explode("\t", $line);
        $linearray = array(
            "AdGroupName" => $gn,
            "Imp" => $imp,
            "clicks" => $cl,
            "coast" => $coast,
        );
    	print_R($linearray);
    	}
    };
    Ответ написан
    Комментировать