• В каком типе переменной хранить (м\ж) пол?

    petermzg
    @petermzg
    Самый лучший программист
    По причине сумасшествия в современном обществе, "пол" лучше хранить в int и для значений использовать отдельную таблицу.
    Ответ написан
    2 комментария
  • Nodejs. Как создать файл с учётом структуры папок?

    Да, нужно создавать каждую директорию отдельно. если это лениво, то добрые люди написали модуль: https://github.com/substack/node-mkdirp
    Ответ написан
    Комментировать
  • Для чего нужны и что делают аллокаторы в С++?

    Аллокатор умеет выделять и освобождать память в требуемых количествах определённым образом. std::allocator -- пример реализации аллокатора из стандартной библиотеки, просто использует new и delete, которые обычно обращаются к системным вызовам malloc и free.

    Более сложный пример -- pool allocator. Раз системные вызовы дороги, почему бы на них не сэкономить? Выделим сразу 1 гигабайт памяти (к примеру), а дальше в аллокаторе будем выдавать память из этого пула и увеличивать указатель head (опять же, упрощенно). Реальное выделение памяти только одно, системных вызовов почти нет, ура-ура, программа ускорилась.

    Собственно, для этого и нужны аллокаторы, чтобы вставлять свое, крутое, нестандартное, выделение памяти в любое место. Большинство стандартных контейнеров их принимают.
    Ответ написан
    2 комментария
  • Как заставить C++ не деконструктить экземпляр класса лишний раз в конце цикла?

    Используйте передачу по ссылке:
    for (auto& neuron : neurons)

    Иначе при обходе цикла вы скопируете весь массив. А то, что конструктор вызывается только вначале, — очень странно, скорее всего, это ещё один баг. Можно увидеть всё объявление класса neuron (без реализации функций)?
    Ответ написан
  • Как отобразить статус выполнения systemctl start|restart|stop?

    @Aves
    Можно например
    $ sctl() { sudo systemctl "$@"; systemctl status "${@:2}" --lines 0 --no-pager 2>/dev/null; }
    $ sctl restart mongodb
    ● mongodb.service - High-performance, schema-free document-oriented database
       Loaded: loaded (/usr/lib/systemd/system/mongodb.service; disabled; vendor preset: disabled)
       Active: active (running) since Пт 2016-06-10 10:32:56 MSK; 13ms ago
     Main PID: 10048 (mongod)
        Tasks: 1 (limit: 512)
       CGroup: /system.slice/mongodb.service
               └─10048 /usr/bin/mongod --quiet --config /etc/mongodb.conf
    Ответ написан
    Комментировать
  • Какой из этих подходов в ООП лучше и как они называются?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    с самого начала у нас есть более-менее абстрактный класс


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

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

    Вот и вся разница. Далее вход идет инкапсуляция. То есть наше состояние должно быть изолировано внутри объекта, и доступ к нему напрямую из внешнего мира должен быть закрыт.

    Если мы хотим создать объект с каким-то состоянием по умолчанию - мы берем первый вариант (либо как в примере прописывваем прямо как значение свойства, либо сэтим в конструкторе).

    Если мы хотим создать "пустой" объект и уже потом определить его состояние - мы выбираем второй вариант. Как правило этот способ создает много побочных эффектов если не контролировать его, да и обычно это делают не потому что так правильно а потому что подругому не умеют (типичный пример - сущности доктрины. Многие просто не представляю себе как с ними работать без сеттеров).

    Если же мы хотим создать объект но он не может быть пустым, объект должен требовать начальное значение в момент создания. Тогда мы просто передаем значение в конструктор. Без этого значения (или с неправильным) мы не сможем создать объект. К примеру если у пользователя обязательно должен быть email и пароль имеет смысл "заставлять" разработчиков явно передавать их в конструктор объекта. Это эдакая вариация.

    А теперь попробуем первый и второй подходы вместе + третий кейс с обязательными параметрами:

    class User {
         private $id;
         private $email;
         private $password;
    
         public function __construct($email, $password) 
         {
               // это ваш первый пример только без наследования, оно не нужно
               // в нашей задаче идентификатор пораждается
               // при создании объекта самим объектом, состояние по умолчанию
               $this->id = Uuid::uuid4(); 
    
               // мы требуем входящие данные что бы задать начальное состояние
               $this->email = $email;
               $this->password = $password;
         }
    
         // мутация состояния, второй вариант.
         public function changePassword($password) 
         {
                $this->password = $password;
         }
    }


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

    Ну и да - зачем в вашем примере наследование и нейкий "абстрактный" класс - не понятно. Наследование это не принцип, это механизм для достижения полиморфизма подтипов. С ним нужно быть осторожно, особенно если с полиморфизмом не разобраться сначала.
    Ответ написан
    Комментировать
  • Это и есть полиморфизм?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Нет.

    Полиморфизм, как следует из названия, это когда что-то маскируется под что-то другое. Это свойство системы типов языка на котором вы пишите, он может позволять вам делать вещи, маскирующие свой внешний вид ("названия") но все же это не та же вещь. Ну и стоит заметить что у полиморфизма есть еще разные виды. Например:

    Параметрический полиморфизм. Это когда мы можем написать один код, с одним набором имен, которые работает с разными типами аргументов. Пример - шаблоны из C++ или дженерики в Java. То есть "имена" методов одинаковые, потому что они в одном экземпляре. Реализация одна, одно поведение. А вот аргументы могут отличаться.

    Ключевое отличие от ad-hoc полиморфизма, про который будет ниже в том, что наша реализация понятия не имеет что придет на вход. Может придти что угодно и с этим нужно будет работать, однако работать с любым типом мы будем абсолютно одинаково.

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

    Многие путают полиморфизм подтипов с наследованием, подменяя эти понятия. Без наследования мы конечно же не сможем достичь иерархии типов, но это больше механизм а не принцип.

    Ну и еще есть одно серьезное ограничение. Если мы хотим заменить в системе объект какого-то типа на объект подтипа (грубо говоря наследника), то система не должна сломаться. То есть "другое" поведение нашего подтипа должно быть совместимо в плане интерфейса с базовым типом. Об этом можно почитать загуглил "Принцип подстановки Барбары Лисков".

    Ad-hoc полиморфизм - это пожалуй самый интересный вид полиморфизма с которым можно долго холиварить. По сути при этом виде полиморфизма, у нас одинаковые имена, а поведение зависит от входящих аргументов. Пример - перегрузка методов в C++. Интересен этот вид полиморфизма в основном тем, что он не является "настоящим".

    При динамической системе типов не требуется никаких дополнительных возможностей вроде той же перегрузки методов для достижения ad-hoc полиморфизма. Тупо кидаем что хотим в функцию, а там уже if-ами рагребаем или же приводим к какому-то одному варианту. Отдельные конструкции нужны в языках со статической системой типов. То есть нам нужно еще на этапе компиляции кода знать какие именно типы могут приходить в наши методы, и в зависимости от оных вызывать тот или иной код.

    Среди PHP-разработчиков немало тех, кто мечтает увидеть в этом языке с динамической системой типов честную перегрузку методов как например в Java или C++. Просто так, потому что if-ы это плохо и лучше уж пусть они будут неявные на уровне компилятора/рантайма.

    Полиморфизм с приведением типов - еще один вид "не настоящего" полиморфизма. Мы "эмулируем" полиморфизм за счет того, что на уровне рантайма языка происходят касты действительного в желаемое. Например в PHP мы можем выставить у функции тайпхинтинг string, и можем внутри иметь одно и то же поведение для всех входящих аргументов. Передать же в качестве аргумента мы можем все что можно скастить в строку.

    Собственно, это очень похоже на параметрический полиморфизм по смыслу, но далеко не так гибко и не дает того контроля за системой.
    Ответ написан
    Комментировать
  • Почему node.js убивает while?

    Lynn
    @Lynn
    nginx, js, css
    https://github.com/nodejs/node/issues/6379

    Впрочем, писать с такой скоростью в терминал обычно не нужно, а если перенаправить вывод, то проблем нет.
    Ответ написан
    Комментировать
  • Как пробросить ip адреса?

    @res2001
    Developer, ex-admin
    Дожили. Гугл консультируется на тостере :)
    Ответ написан
    2 комментария
  • Почему наследование является нарушением инкапсуляции?

    petermzg
    @petermzg
    Самый лучший программист
    В комментариях к статье есть ответ.
    Ответ написан
    4 комментария
  • Стоит ли в программировании учитывать возможность экстренного обрыва выполнения сценария (например выключение электричества, поломки компьютера)?

    k12th
    @k12th
    console.log(`You're pulling my leg, right?`);
    Смотря насколько это критично. Если пользователь в результате потеряет деньги или два часа труда или не сможет зайти в свой аккаунт — надо думать, как обеспечить целостность при чтении в таких случаях.
    Параноить и заморачиваться нужно в меру.
    Ответ написан
    Комментировать
  • Регулярные выражения по строкам или несколько значений?

    zagayevskiy
    @zagayevskiy
    Android developer at Yandex
    Учите регулярные выражения. Ну, например: professorweb.ru/my/csharp/charp_theory/level4/4_10.php
    Вам нужен символ |
    P.S. Это я вам удочку вместо рыбы даю, если что
    Ответ написан
    2 комментария
  • Как определить функцию линейного графика?

    @Nc_Soft
    Нужна ли математика программисту? Конечно, нет, блин.
    (x-x1)/(x2-x1) = (y-y1)/(y2-y1)
    (x-0.5)/(0.75-05) = (y+85)/(0+85)
    y(x) = 340x - 255
    m.wolframalpha.com/input/?i=%28x-0.5%29%2F%280.75-...
    Ответ написан
    3 комментария
  • Как управлять сервером Node?

    sim3x
    @sim3x
    https://www.digitalocean.com/community/tutorials/h...

    запретить доступ
    nginx.org/en/docs/http/ngx_http_access_module.html

    Управление кешированием, сжатием
    nginx.org/en/docs
    Ответ написан
    Комментировать
  • Листинги к книге Карли Ватсона С#?

    @jackroll
    Сверхразум
    Серьезно, возьмите книжку по новее, Шилдта например. C# потерпел много фундаментальных изменений с 2005 года.

    u4w8miV.png
    Ответ написан
    Комментировать
  • Как получить html код страницы?

    @vilgeforce
    Раздолбай и программист
    cUrl в помощь, вполне вероятно в примерах есть готовый код.
    Ответ написан
    Комментировать
  • 2D игра [online]. Как всё организовать?

    LittleFatNinja
    @LittleFatNinja
    горе девелопер, любитель лютой садомии
    iWKad22.jpg
    Ответ написан
    Комментировать
  • Существует ли программируемая система мониторинга?

    saboteur_kiev
    @saboteur_kiev Куратор тега Программирование
    software engineer
    zabbix? nagios? monit?
    Ответ написан
    3 комментария