• Правильно ли я понял принцип инверсии зависимостей?

    @Akela_wolf
    Extreme Programmer
    Главная идея принципа инверсии зависимостей "детали зависят от абстракций, но не абстракции от деталей".
    В приведенном вами примере класс Main зависит от всего: от интерфейса INumberOperation и от обоих классов NumberOperation1, NumberOperation2. То есть тут принцип инверсии зависимостей вообще не работает. Никак.

    Проявляется же он в следующем примере. Пусть у меня есть некая абстрактная логика "прочитай число, выполни над ним операцию, запиши результат". Эта абстрактная логика (потому она и абстрактная) ничего не должна знать ни откуда она читает число, ни какую операцию над ним выполняет, ни куда и как записывает результат. Таким образом, у нас есть модуль, состоящий из
    interface NumberInput {
      int read();
    }
    interface NumberProcessor {
      int process(int a);
    }
    interface NumberOutput {
      void write(int a);
    }
    class Processor {
      private final NumberInput input;  
      private final NumberProcessor processor;
      private final NumberOutput output;
    
      public Processor(NumberInput input, NumberProcessor processor, NumberOutput output) {
        this.input = input;
        this.processor = processor;
        this.output = output;
      }
    
      void process() {
        output.write(processor.process(input.read()));
      }
    }

    Все. Модуль получился очень абстрактным и ни от кого никак не зависящим.
    Затем мы можем сделать реализации этих интерфейсов - они будут зависеть от нашего модуля логики (так как ссылаются на интерфейсы). И это полностью соответствует принципу инверсии зависимостей - детали зависят от абстракций.

    И наконец функция main, которая будет собирать все это в единое целое. Она самое конкретное что есть в нашей программе, так как она имеет дело с конкретными классами, экземпляры которых она создает. Поэтому она зависит от всех модулей - от модуля абстрактной логики и от модулей с реализациями интерфейсов. И тут принцип инверсии зависимостей тоже соблюдается - деталь (в какой именно конфигурации запускается программа) зависит от абстракции (абстрактная логики и конкретные реализации интерфейсов из которых выбирается именно та, которая будет использована)

    Этот принцип очень хорошо объяснен в книге Р.Мартина "Чистая архитектура", по крайней мере у меня все встало на свои места именно после прочтения этой книги.
    Ответ написан
    1 комментарий
  • Как выбрать из БД нужные поля в зависимости от результата LEFT JOIN?

    @BorisKorobkov Куратор тега MySQL
    Web developer
    Запрос правильный, именно так (с IFNULL) и надо.
    А чтобы не надо было так извращаться - нормализуйте таблицы.
    Ответ написан
    4 комментария
  • Мультизагрузка картинок с добавлением на сервер и в БД. Как сделать?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Лет ми гоогле ит фор ю: пишешь в адресной строке своего бразера три слова: Мультизагрузка картинок php и нажимаешь Ентер. На открывшейся странице будут ссылки на страницы, объясняющие, как делать мультизагрузку.

    После того как освоишь загрузку, пишешь в адресной строке своего бразера три слова: запись в БД php и нажимаешь Ентер.
    Ответ написан
    Комментировать
  • Какие есть варианты быстрого и безлимитного интернета?

    Jump
    @Jump
    Системный администратор со стажем.
    а здесь из интернета только Ростелеком и максимальная скорость 10 мбит/сек
    У ростелекома 10мбит? Это что АДСЛ?
    Вообще ростелеком обычно впереди всех по скорости - везде оптика, во многих случаях оптика в квартиру и гигабит во внутренню сеть и тарифы на 100-200мбит не проблема.

    Есть Yota с 4G за 1400 руб. и скоростью 15 мбит., а остаются ли ещё какие-то варианты?
    10мегабит по проводу лучше чем 50мегабит по радиолинку, будь то вайфай или 4г.

    Вообще 10мегабит должно хватать - торренты конечно печально качаются, а в плане серфинга и работы этого хватает.
    Ответ написан
    3 комментария
  • Зачем изучать несколько языков программирования(c++, java)?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Во-первых, гипотеза лингвистической относительности утверждает, что чем больше языков знаешь, тем гибче и богаче твой логический аппарат. По своему опыту могу сказать, что это правда. Например изучение Lisp'ов существенно расширило мои возможности в других языках. Но мой опыт и мнение не так авторитетны, как авторов всемирно известного бестселлера "Программист-прагматик" - Эндрю Ханта и Дэвида Томаса, которые пишут: «Изучайте по крайней мере один новый язык ежегодно. Разные языки решают одни и те же проблемы разными способами. Изучив несколько разных подходов, вы сможете расширить свой кругозор и не погрязнуть в рутине.»

    Во-вторых, рано или поздно профессиональный рост java-программиста, например, неизбежно приводит его к необходимости глубоко понимать работу компилятора и виртуальной машины, а это невозможно без знания C++, на котором они написаны.

    В-третьих, java-программист свободно лазающий за ответами в исходники JVM, способный дебажить сборщик мусора, писать JNI-библиотеки и использовать Compiler API для метапрограммирования имеет больше предложений работы и более выгодные условия.
    Ответ написан
    4 комментария
  • Как справиться с ошибкой [pool www] seems busy?

    VELIK505
    @VELIK505
    Руководитель департамента profitcentr.com
    pm.max_children = 900
    pm.start_servers = 95
    pm.min_spare_servers = 50
    pm.max_spare_servers = 150
    pm.max_requests = 600
    Ответ написан
    7 комментариев
  • Для чего используются геттеры и сеттеры в реальных примерах?

    IonDen
    @IonDen
    JavaScript developer. IonDen.com
    Суть геттеров/сеттеров - в создани буфера, который защитит объекты от грубого вмешательства во внутреннюю структуру. Вы как бы создаете свой API для пользования объектом и гарантируете, что если пользоваться им - все пройдет хорошо. Вы заранее планируете свойства переменных и защищаете их от излишнего вмешательства.

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

    Какие проблемы можно предотвратить?
    - запись в переменную другого типа данных
    - перезапись константы
    - затирание/перезапись метода
    - чтение не обработанных данных напрямую
    - чтения данных без разрешения
    - и т.д.
    Ответ написан
    Комментировать
  • Какие библиотеки, плагины и прочее для верстки вы используете в своих проектах?

    jasonOk
    @jasonOk
    Легче болтать, чем код писать
    Если вы не знаете, где искать, то загляните сюда: unheap.com
    Замечательный ресурс.
    Ответ написан
    Комментировать
  • Почему не работает оператор $in для подмассива в mongodb?

    Shutik
    @Shutik
    Погромист халявщик
    Давно не работал с монгой, но попробуйте - ['data.$.id' => ['$in' => [1, 2,3] ] ]
    Ответ написан
    3 комментария
  • Как создать такого бота в вк?

    @MrGaunt
    Есть готовый конструктор ботов с массовой рассылкой, фильтрами, ответами на команды.
    Ответ написан
    Комментировать
  • Почему не работает метод docs.save Vk api?

    tomnolane
    @tomnolane
    профессиональный разработчик
    я загружаю так (правда не на php, а на c#, но суть одна и таже):
    1) получаю сервер для загрузки:
    var json = JObject.Parse(VkRequest("https://api.vk.com/method/docs.getUploadServer?v=" + Vk.Version + "&access_token=" + Vk.AccessToken)); // выполняю без group_id, и в данном случае документы будут сохранены в моём аккаунте в документах .. если нужен group_id, то id указываем положительным

    парсю ответ и получаю url куда загружать
    2) загружаю файл на указанный url (обычным POST запросом), получаю json ответ и беру от туда file
    3) сохраняю и получаю как attachment:
    string request_path = "https://api.vk.com/method/docs.save?file="+file+"&title=999999999&tags=9999999999&v="+Vk.Version+"&access_token=" + Vk.AccessToken;
                
    var json = JObject.Parse(VkRequest(request_path)); // в json - уже мой attachment, который использую при отправке на стену


    п.с.
    Допустимые форматы: любые форматы за исключением mp3 и исполняемых файлов.
    Ограничения: файл объемом не более 200 МБ.
    Поле POST-запроса: file.
    Ответ написан
  • Как одноразовые уведомления реализованы в больших проектах?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Описанное Вами, ни что иное, как task-list автоматического менеджера, обслуживающего все аккаунты (на протяжении всего срока их существования).
    1. Составляется таблица всех задач (task-list) для одного аккаунта (эталон). По мере надобности - пул может меняться: добавляться, редактироваться или меняться абсолютно полностью.
    2. При создании нового аккаунта - ставятся авто-менеджеру эти задачи, применительно к новому аккаунту с отсчётом от срока активации аккаунта.
    3. При входе пользователя - авто-менеджер берёт задачу из пула, и если есть что исполнять - исполняет: экскурсия по интерфейсу, оповещение о нововведениях и т.п.
    Ответ написан
    Комментировать
  • Как одноразовые уведомления реализованы в больших проектах?

    webinar
    @webinar
    Учим yii: https://youtu.be/-WRMlGHLgRg
    если в сообщениях прослеживается определенная очередность, то можно иметь в таблице user доп поле типа integer, например stage и выводить сообщения. Относительно према, наверняка отдельная логика. Так как есть таблица с платежными данными и т.д. И есть отдельный компонент, который хранит логику соединения всего этого и формирования сообщения.
    Ответ написан
    Комментировать
  • Как остановить apache?

    sanchomaster
    @sanchomaster
    deployment engineer
    На debian 8 демон инициализации systemd
    systemctl stop apache2
    systemctl disable apache2
    Ответ написан
    Комментировать
  • Насколько правилен такой подход?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    В любой момент он может загрузить картинку, а затем тут же её убрать
    Это обычная работа со множествами.
    В момент сохранения сравниваем два списка: загруженные картинки (для текущей статьи) и находящиеся в статье.
    Лишние - удаляем из хранилища!

    UPD: Я храню медиа-контент в папке статьи:
    storage/articles/{article_id}/images/
    storage/articles/{article_id}/videos/
    storage/articles/{article_id}/sounds/
    storage/articles/{article_id}/3D/
    Ответ написан
    Комментировать
  • Как заменить совпадения в тексте?

    27cm
    @27cm
    TODO: Написать статус
    preg_replace_callback()

    $result = preg_replace_callback('/\d/', function ($matches) use ($db) {
        // Запрос к базе данных $db
        return $replace;
    }, '1 2 3');
    Ответ написан
    1 комментарий
  • PDO, обязательно использовать константы?

    @shagguboy
    нет.
    public bool PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR

    по умолчанию это строка, MYSQL с ними корректно работает. проблемы могут быть со сложными типами и/или региональными настройками. вроде формата даты по умолчанию, разделителя десятичных чисел и т.д.
    Ответ написан
    6 комментариев
  • Как правильно сделать удаление комментария?

    elevenelven
    @elevenelven
    Php Dev @ Amadeus
    Не берите данные об UserID из того что предоставляет пользователь.

    Берите из сессии или из объекта User (смотря какой у вас фреймворк, или CMS, или самописный движок)

    if( $comment->getUserId() === $_SESSION['user']['id'] ){
       //doDelete
    }else{
      Logger::log('Fraud attempt');
    }


    Хотя по формулировке вопроса я чувствую у вас нет привязки комментария к ID пользователя?
    Ответ написан
    2 комментария
  • Как правильно сделать удаление комментария?

    Taraflex
    @Taraflex
    Ищу работу. Контакты в профиле.
    При авторизации пишите id пользователя в сессию.
    При комментировании крепите id пользователя к комменту.
    При удалении берете id пользователя из сессии и сверяете его с id пользователя из коммента.
    Если совпадают - удаляете коммент.
    Ответ написан
    6 комментариев