Ответы пользователя по тегу Программирование
  • Как реализуется принцип открытости/закрытости в случае "ветвления" расширений в Java?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    основной — наследование.


    Наследование типов а не классов. То есть через интерфейсы.

    В Java нет множественного наследования.


    В Java есть возможность делать композицию типов путем имплементации множества интерфейсов. А с учетом того что в Java8 у вас теперь есть возможность делать "дефолтные" имплементации методов в интерфейсах - у вас есть "правильное" наследование.

    Через некоторое время, этот класс захотят расширить по OCP — унаследуются, и сделают класс Бармен.


    А как потом быть если мы захотим сделать робота бармена? Я это к тому что "человек" не всегда будет являться базовым типом "бармена".

    В целом Dmitry Roo вам верно сказал. "Бармен" это профессия. Свойство человека. У человека может быть много профессий:

    class Human
    {
        Profession[] professions;
    }


    Таким образом мы можем крутить и вертеть как хотим.
    Ответ написан
  • Как выбирать направление архитектуры ООП приложения?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    и как отдельный класс-синглтон


    Зачем? Зачем сингелтон? Ответте на вопрос когда это нужно?

    Есть ли практики, которым следует придерживаться, чтобы сделать правильную и простую архитектуру?


    - Разделение ответственности - важный принцип инженерного дела в принципе.
    - Принципы SOLID - хорошо дают понять как работать с зависимостями и делать декомпозицию системы. Сильно пересекается с инкапсуляцией, полиморфизмом и разделением ответственности.
    - Паттерны GRASP - эдакая смесь принципов и паттернов, описывают нюансы цикла жизни объектов и их взаимодействия друг с другом.
    - Закон Деметры - про инкапсуляцию.
    - CQRS - подход по разделению операций записи и операций чтения. Естественно подход такой не работает если вам надо реализовать атомарную запись и чтение, но это минимальный набор задач.
    - Рефакторинг. Он нужен всегда. Его нужно делать по чуть-чуть когда видно что "уже мешает" или "можно было сделать лучше". Ну то есть это не переписывание всего и вся большими кусками, а маленькие изменения которые с течением времени эволюционно меняют архитектуру проекта. Возможно только если код покрыт тестами, это отдельная жирная тема.

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

    https://en.wikipedia.org/wiki/Category:Programming...
    Ответ написан
  • Чем отличается JDBC от ORM?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Для начала упростим JDBC до общего случая Data Access Object (DAO).

    Суть DAO сводится к тому, что у нас есть объект, инкапсулирующий в себе работу с хранилищем данных. Ну то есть весь SQL и все детали работы с хранилищем вшиты в него. Причем их может быть множество (не пихать же вообще всю работу с базой данных в один объект).

    Словом, основная задача DAO - предоставить механизм работы с базой данных скрывая детали внутри себя.

    ORM (Object-relational mapping) - это, если опять же упростить, общая идея конвертации "объектов" между системами с несовместимыми типами. Ну то есть как объекты из базы мэпятся на объекты.

    Если под ORM брать мощные реализации вроде Hibernate, то тут становятся очевиднее минусы конкретно этой реализации. А именно - работать это будет эффективно когда вам нужно построить объектную модель логики приложения, нежели модель данных. Такие подходы хорошо работают в приложениях с реально сложной логикой, где вам бы хотелось в коде передать суть того, как все работает в реальности. Например как именно происходит автоматизация бизнес процесса. С реальными объектами и т.д.

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

    Ну и в целом, ORM и DAO это весьма разные концепции, они о разных вещах. То есть у вас может быть использовано и ORM и DAO. Или ORM внутри использующее DAO... это не столь важно.
    Ответ написан
  • Как разобраться с инверсией зависимостей?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Что такое адаптер?


    Смотрите. Есть у вас например micro USB кабель. И есть дырка в новом макбуке - Usb type c. Друг в друга они, как вы понимаете, не втыкаются. И можно взять адаптер microUSB -> USB type-c.

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

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

    За счет этого достигается независимость.

    Что значит "принимает зависимость"?


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

    public function changePassword(string $password, PasswordEncoder $encoder)
    {
        $this->password = $encoder->encode($password);      
    }


    Это зависимость нашего метода. Он зависит от него. Диалог между объектами можно представить себе такой:

    - Слыш, поменяй пароль на этот
    - Оке, только хэшер паролей мне дай, мне очень надо
    - А какой тебе?
    - Да любой с этим типом
    - Ну ок. На вот пароль и хэшер. Делай дела.

    Что такое вообще эта зависимость?


    Зависимости - это все что мы используем чтобы сделать дела. Это не только библиотечки, но и просто классы, функци и т.д. Весь "сторонний" код с точки зрения нашего кода. И самое важное в том, что "нашим" кодом является тот, над которым мы работаем в данный момент времени, а не все что мы написали. Даже функции, которые есть в языке программирования из коробки являются зависимостями. Вот только от них вам не деться никуда особо, а потому с ними замарачиваться не стоит. Или если есть долговременная поддержка у библиотеки и она устаялась - тоже можно просто использовать. А вот если это поделка на гитхабе с 10-ю звездочками и там до сих пор нет ни одного релиза - но она вам вот очень нужна, возможные поломки в ней (а они рано или поздно будут) стоит "закрыть" адаптером что бы потом поменять на что-то получше или обновить без боли.
    Ответ написан
  • Как код склонения подогнать под счетчик?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    есть в ангуляре такая штука как ngPluralize. Можно копать в этом направлении.
    Ответ написан
  • Как стать Middle после Junior и Senior после Middle?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Сколько нужно мне проработать в организации чтобы стать Middle если сейчас я Junior?


    я видел людей которые за 5 лет в "организации" настолько остановились в развитии что как были джунами так и оставались.

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

    Вот и прикидывайте.
    Ответ написан
  • Должен ли программист знать ассемблер?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    1) Сам ассемблер знать не нужно
    2) нужно знать что ассемблер вообще есть и полезно хотя бы минимально представлять как оно там внутри все работает и что есть семантический разрыв. Ну то есть не сам ассемблер даже важен, а принципы как оно что там выполняется, что есть конвееризация и т.д. Кэш процессора, зачем он нужен и т.д.
    3) это не must have, это скорее факультативные штуки
    4) это нужно для тех кто занимается разработкой систем, для которых критична производительность (так или иначе при оптимизации приходится ковыряться в опкодах/байткоде/разбираться что там делают оптимизирующие компиляторы).
    5) это нужно для тех кто разрабатывает средства для дебага и профилирования.

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

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Ответ как бы напрашивается - не удалять а прятать для конкретных юзеров.
    Ответ написан
  • Как правильно создавать классы внутри объектов в javascript?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    реализовать подобие ООП в JavaScript


    Скажите где в аббривиатуре "ООП" вы видите слово "класс"?)

    Хочу например создать объект вот так:


    А зачем? "нэймспейсы"? Это не нужно если есть модули.

    Как мне создать конструктор внутри объекта Earth


    любая функция может быть использована как конструктор.
    Ответ написан
  • Как организовать работу оповещений на сервисе?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Думаю это не очень красиво.


    1) при изменении состояния объекта кидайте ивент об этом или явно вызывайте нотификатор
    2) нотификатор добавляет в очередь задачу (beanstalkd, rabbitmq, etc)
    3) очередь ответственна за отслеживание статуса задачи
    4) воркеры берут задачи из очереди и собственно занимаются отправкой.
    Ответ написан
  • У кого как организован процесс оценки работ по разработке?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Зависит от того что оценивается. В контексте начальной оценки может делать как тимлид так и кто-то из членов команды. Делигирование и все такое.

    Ну и сами задачи оценивают разработчики которые будут их делать.
    Ответ написан
  • Как лучше писать if условия?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    if (!(foo == bar && foo >= 1)) return false;

    подход называется "ранний выход", и призван он улучшить читабельность.
    Ответ написан
  • На чем проще программировать под windows?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    C# .NET для windows максимально эффективны. Если же вам нужна кросплатформенная разработка - уже можно думать.

    С другой стороны есть куча других вариантов, вроде html5 + js.
    Ответ написан
  • MVC: где хранить и создавать представления?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Мы сейчас про какое MVC? их много разных. Из вашего вопроса например можно сделать вывод о двух вариантах.

    Создать отдельный класс MainView, в котором будут храниться ссылки на все представления?


    Это напоминает MVC 1979 года выпуска. В этом случае контроллеры занимаются только тем что обрабатывают пользовательский ввод. А всем что касается представления занимается собственно View. Вьюшка тут у нас активна, в ней есть куча логики и бывает так что этой логики даже больше чем в модели. В нашем примере это будет тот самый MainView который будет работать напрямую с моделью и забирать нужное состояние из нее и сама себя обновлять по изменениям (или ButtonView - зависит от того чему мы хотим дать представление. Описание MVC не делает никаких ограничений сколько у вас может быть этих штуковин на скрин).

    Или хранить каждую ссылку отдельно в контроллере?


    Это больше напоминает mediating controller MVC. Этот подход был придуман с целью убрать зависимость вьюшки от модели. По сути вьюшка становится пассивной. Теперь контроллер решает когда ее обновлять и как вообще ее рендрить.

    Так что определитесь что вам нужно. Подозреваю что все же второе потому как первое никто не использует активно уже лет 20.
    Ответ написан
  • Софт для автоматического построения uml?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Это умеют все серьезные IDE (VisualStudio, Jetbrains CodeLion и т.д.)
    Ответ написан
  • Как точно подсчитать время создания программного продукта?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    это примерно то же самое что научиться абсолютно точно предсказывать погоду на месяцы вперед.

    Есть хорошая мантра:

    таски на 4 часа мы делаем за 4 часа, таски на 8 часов мы делаем за 12, таски на 16 часов мы делаем за 24, таски на 40 часов мы не делаем никогда.

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

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    composer

    Как при этом вынести настройки под конкретный сайт?


    Просто вынесите настройки, они же в git не хранятся. Если планируете автодеплой налаживать - то все различия в ENV переменные и разруливать все на уровне CI-сервера (у меня например так разруливается, по джобе на сервер, что бы все секьюрные штуки спрятать и не хранить при этом в GIT-е)
    Ответ написан
  • Имеет ли смысл начинать с Си?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Плюсы:

    Си это сила. У него пока нет конкурентов в системном программировании (разве что rust подкрадывается и D, но они чуть на другие вещи ориентированы).

    Минусы:

    Сегодня Си это специфика. Это либо системное программирование (разработка драйверов, низкоуровневых вещей, баз данных, интерпритаторов, компиляторов) либо микроконтроллеры и т.д. Так же есть определенные задачи для которых критически важна производительность, там и ассемблер иногда используют, но скоро перейдут на FPGA.

    То есть знание Си = знание архитектуры комьютера, а это уже неплохо и пригодится. Сам же язык относительно простой и много времени на его изучение не потребуется.

    Если же вас интересуют более мэйнстрим вещи вроде web или мобильная разработка - проще сразу брать какой-нибудь современный динамический язык (python, javascript) и радоваться жизни.
    Ответ написан
  • Как идёт взаимодействие между PHP/MySQL/Apache?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    то я вовсе не понимаю зачем нужен Apache (говорю именно о нём, т.к. ни о чем другом не слышал).


    Гуглим про HTTP

    Сейчас геморрой есть, чтобы поставить всё это и сконфигурировать, надо разбираться.


    Вам сейчас достаточно тупо php поставить. php.net/manual/ru/features.commandline.webserver.php Apache вам не нужен.
    Ответ написан
  • Где найти паттерны "правильных" частей системы?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Вот проектируя большой проект с нуля ты уже оперируешь не паттерновыми объектами а частами систем


    Паттерны - это то что должно получаться на выходе, ими не проектируют. Просто ты можешь например сказать своему коллеге "слушай, для проверки прав на выполнение действий тут пожалуй RBAC слишком примитивно и неудобно... давай запилим механизм воутеров - тупо цепочка обязанностей которая возвращает Да, нет или не знаю" и коллега поймет как оно примерно должно выглядеть. А не пытаться впихнуть паттерн просто так.

    Большие проекты начинают проектировать с более высокого уровня. Сначала принимают решение о том, какое разделение на слои у нас будет (для проектов со сроками жизни ~10+ лет имеет смысл позагоняться и вводить гексагональную архитектуру, для проектов со сроками жизни <= строк поддержки фреймворка можно не сильно париться), какие компоненты можно выделить, а уже потом дробить эти большие компоненты на компоненты поменьше.

    Затем уже приступать к проектированию каждого отдельного компонента на уровне классов.

    Так же если у нас сложная предметная область - проектируют модель предметной области. Обычно тут "паттерны" сами собой получаются тупо при снижении связанности между объектами.

    > Собственно вопрос: существует ли сборник всех этих лучших практик?

    вне контекста не бывает лучших практик, есть просто практики. В этом плане можно например Фаулера почитать, он очень качественно описывает практики, их плюсы и минусы.

    В целом же я бы рекомендовал вам познакомиться поближе с принципами SOLID и GRASP. Последнее мало кто знает, но понимание, например, что такое высокое зацепление, сильно влияет на то, как вы будете проектировать систему.
    Ответ написан