• Набросал структуру классов учебного сайта доски объявлений, как еще лучше распределить функционал?

    Не всегда нужно пихать всё в один класс, да, только если класс Organization разрастается нужно его бить на логические куски с наименьшим количеством зависимостей, типа отдельный класс HrDepartment и т.п. а не делать рядом OrganizationService и пихать логику туда
  • Набросал структуру классов учебного сайта доски объявлений, как еще лучше распределить функционал?

    h0w4rd,
    тут думаю дело уже код стайла и прочих параметров

    Тут дело семантики и того что "достать переменную из объекта" и "установить переменную в объекте" это старая добрая процедурщина а не "ООП"
  • Набросал структуру классов учебного сайта доски объявлений, как еще лучше распределить функционал?

    Антон Р., Не совсем сами геттеры зло. Вопрос в том, зачем вы их получаете. Если вы через геттеры достаете данные для отображения на UI - ну ок, терпимо, хотя можно делать отдельные классы с данными для этого.
    Если у вас есть логика зависящая от этих данных(т.е. if($obj->getField === *smth*) {...} - у вас нарушена инкапсуляция, у вас повышается связность(coupling), и эта логика, этот if, должен находиться внутри класса с данными

    А как пользователь например сам себя зарегистрирует?

    А что значит сам себя зарегистрирует? Регистрация = создать пользователя, то есть в каком-то кординирующем сервисе(в котором нет логики) будет
    $user = User::createWithNameAndPass($name, $passHash);


    Вот вы можете сами себя принять на работу в стороннюю организацию?

    Мм.. на работу принимает организация человека а не человек сам себя, потому
    $organizationBranch->hire($user);
    Или $hrDepartment->hire($user);

    P.s. tell don't asc это хороший тезис чтобы его загуглить, при слабом английском даже блог Фаулера нынче можно читать благодаря чудесам современного Гугл переводчика
  • Набросал структуру классов учебного сайта доски объявлений, как еще лучше распределить функционал?

    Касается всего: зачем, к примеру называть метод "changeUserName" если можно просто "setName" или "setNickname" ну или "setUsername".

    Потому что мы просим объект произвести какое-то действие а не устанавливаем значение переменной. Какие переменные нужно поменять объект сам решит. Инкапсуляция, все дела.
    (Геттеры и сеттеры - зло). См. TellDontAsk
  • Логика пополнения и вывода денег, не слишком ли заморочено?

    В платежных агрегаторах разве нет уже своего антифрода?

    Есть, у тех что на виду точно, всё-равно это обсуждается при интеграции.

    Чтобы зарегистрироваться в моем сервисе, необходимо обязательно привязать телефон через смс на реальный, не виртуальный номер, либо установить 2FA. Будут ли они этим заморачиваться, чтобы проверять работоспособность карт?

    Купить симку на вокзале не проблема, так что почему бы и нет?)

    Выводить средства только на тот счёт с которого они были внесены довольно популярная практика.

    А вот это:
    Если пользователь по какой-то причине больше не имеет возможности использовать свой счет с которого было пополнение, то он может пополнить с другого и в таком случае выводить он сможет тоже только на него

    Как то сомнительно на первый взгляд. Чекнул баланс, увидел 1000$, закинул 10$, вывел 1000$?
    Такие случаи всё-же обычно рассматриваются индивидуально через поддержку сервиса
  • Что можно почитать про создание ORM?

    Большой вопрос что вы подразумеваете под ORM, т.к. у всех разное определение, хотя по сути любая штука которыя смаппит реляционные данные на объекты со ссылками уже будет зваться ORM )
    Как разберётесь - можно уже будет задавать более конкретные вопросы.

    Если речь идёт о штуках типа Hibernate/Doctrine etc., нужно понимать что это крупные и очень сложные проекты, я бы сказал что они слабо подходят для разбора неопытными в обращении с ними программистами, но если начинать потихоньку, наверное, почему бы и нет. Декомпозируйте задачу.

    Чтобы в общих чертах представлять их работу можно начать с разбора паттернов UnitOfWork, Identity map, и др.
    Либо смотреть реализации конкретных компонентов
  • Как вы проектируете классы в ООП и их взаимодействие?

    Антон Р., По вашему скрину.
    1. Наследование. Без него можно обойтись в большинстве случаев, оно создаёт жесткую привязку между классами, и частенько может привести во первых к тому что после изменения базового класса у вас сломается куча дочерних классов(т.е. каскадные изменения которых нужно избегать), во вторых к тому что у вас появится большие иерархии наследования, а классы внизу этой иерархии с 5-ю родителями банально не нуждаются в той куче функционала которую они отнаследовали, когда код использующий эти классы начнёт использовать ещё и методы из пяти родителей всё превратиться лишь в неподдерживаемую лапшу.
    Тут нужно будет осваивать понятия Coupling/Cohesion, это по сути самые основные, самые сложные глубокие и важные принципы в дизайне системы.

    Ну нужно сейчас разбираться в этой простыне. Просто почитайте про композицию(composition over inheritance), это не сложнее чем наследование, и имейте ввиду что возможно это то что вам нужно, а не "extends".

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

    Например
    spoiler
    <?php
    
    class VendorValidator {
        public function validateJson(string $json): bool
        {
            return (bool)random_int(0,1);
        }
    }
    
    class MyValidator {
        /**
         * @var VendorValidator
         */
        private $validator;
    
        public function __construct(VendorValidator $validator)
        {
            $this->validator = $validator;
        }
    
        public function validate(string $json): bool
        {
            $result = $this->validator->validateJson();
            
            if($result === false) throw new \Exception('InvalidJson');
            
            return $result;
        }
    }


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

    Вот, гляньте ещё доклад на русском, он простой и полезный - https://www.youtube.com/watch?v=pu0EXQvoaCc , от этого автора ещё можно найти доклад "Связать и Развязать".

    2. Трейты. Трейты в PHP это просто копирование кода между классами. Это вовсе не решает проблему DRY, это лишь позволяет менять в одном месте код который реюзается кучей классов.

    Есть два типа дублирования:
    а) Случайное дублирование кода - в двух местах оказался одинаковый код, но это два независимых класса, и когда логика поменяется в одном классе, не факт что она поменяется вдругом. От такого дублирования не нужно избавляться, тем более трейтами

    б) Дублирование логики - в двух классах находится одинаковый единый логический кусок, который меняется одновременно во всех классах. Это значит что у этой логики должен быть другой владелец, она принадлежит не этим классам, не нужно её копировать везде с помощью трейтов.
    Воспользуйтесь, опять же, композицией - принимайте в ваш класс сервис который умеет делать эту логику, и вызывайте его. Это позволит отвязать реализацию наших классов от этой логики, и если в 1 из 10 случаев в логике будут изменения, мы поменяем лишь класс сервис который передадим в конструктор нашего класса.

    3. Не верьте анонимусам с Тостера(в т.ч. мне), не доверяйте всем подряд статейкам на Хабре, Медиуме, разбирайтесь какую проблему решаете, не следуйте слепо трендам. Используйте всю информацию и все советы на свой страх и риск :)
    Более достоверные источники - книги известных авторов

    p.s. Есть кейсы с дефолтной реализацией интерфейсов через трейты, может быть удобно, но тут важно хорошее разделение на интерфейсы, и факт что внешние классы не зависят и не знают что методы реализованы через трейты, они зависят лишь от интерфейса. Суть в том что мы не будем прыгать по трейтам и по кусочками представлять как там что работает. Зависим только от интерфейса.
  • Как пройти собеседование на Junior разработчика?

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

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

    Я про то, что современная трактовка ООП это те же процедуры обернутые в классы. А чтобы научиться писать хороший код нужно смотреть что-то более конкретное.

    А умников которые вещают что для ООП обязательно наследование(встречаются такие на этих ваших Тостерах да Хабрах) вообще банить нужно из интернета

    Антон Р.,
    как тогда без знания что у Юзера есть какие то данные выводить их?

    А может не нужно их, данные, вытаскивать то, а использовать их там же где лежат?)

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

    Антон Р., Для того чтобы вещать про ООП рекрутерам для устройства на работу хватит заучить определения Инкапсуляции Наследования и Полиморфизма, интересуется вопросом глубже 1 из 100, как бы это не было печально )

    но простите, как тогда учиться ООП если учебный проект у тебя простой и там всё отлично живёт на процедурке?

    Да никак, просто развиваться постепенно в чуть более приземлённых темах, я про них уже написал выше.
    Есть два типа людей - первые думают что знают ООП, вторые уже понимают что не знают, и всё :)

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

    Антон Р., ООП это мода. Как какой-нибудь REST или Agile, люди ведутся на моду, видят в этом серебрянную полю, начинают ускоренно внедрять модные штуки себе, и начинают пугать всех остальных тем что у них всё плохо аля "Как это у вас не ООП!? Всем нужно ООП!", люди не понимают зачем, но начинают внедрять, естественно менять свой стиль мышления и привычки никто не хочет, потому пытаются лишь учесть какие-то формальности чтобы обозвать своё творение модным словом X.

    В итоге приходят к такому, как говорил Страуструп, силлогизму: «X — это хорошо. Объектная ориентированность — это хорошо. Следовательно, X является объектно-ориентированным»

    То есть - про обмен сообщениями забыли, про оригинальные идеи децентрализации забыли. Зато вспомнили что там было слово class - добавим и себе слово class, и продолжим писать процедуры - профит. Привычкам не изменили, модными стали.

    читал где-то что настоящее ООП это когда объекты, образно говоря, "обмениваются сообщениями".

    Да, это из оригинального определения от Алана Кея, сейчас это вылилось скорее в Actor Model, и про это есть в вышеприведённом докладе )
  • Как вы проектируете классы в ООП и их взаимодействие?

    Антон Р., Если хорошо с Английским - гляньте видео https://www.youtube.com/watch?v=fhOHn9TClXY
    Там Джо Армстронг(Создатель Erlang интервьюирует Алана Кея, человека который ввёл термин ООП).

    А так вы правы - нету истинного ООП. Термин сильно размыли и однозначного определения у него нет, чтобы учиться писать нормальный код нужно разбирать более приземлённые принципы и практики. Частенько про ООП кричат те, кто зазубрил какую-нибудь тупую статейку на хабре аля "ООП для шестиклассников", научился наследовать всё подряд а сам даже разницу между ООП и Процедурами не объяснит
  • Как вы проектируете классы в ООП и их взаимодействие?

    Антон Р., Развивайтесь по более фундаментальным вещам, прочитайте книги Боба/Фаулера, разбиретесь с coupling/cohesion, Stable Dependencies Principle, если процедуры в классы запихать у вас как и у многих получаться процедурщина на классах сдобренная наследованием и геттерами/сеттерами, а не ООП )
  • Как вы проектируете классы в ООП и их взаимодействие?

    Проектирование это инкрементальный процесс. Нельзя взять не зная будущих требований описать всю архитектуру программы, тем более абстракции, интерфейсы.

    Так вот - в чем вы обычно проектируете? На бумажке (как я :)), в каких-то специальных программах которые создают UML-диаграммы или просто " в уме"?

    Проектируйте в тестах(я про tdd) :)

    p.s. На самом деле кажется, что вы пытаетесь решить какую-то проблему, но видите загвоздку не в том месте )
  • Архитектура Entities в Doctrine, Symfony 4 - кто может помочь?

    symnoob, Админка и апишки это не отедельные приложения, а разные вьюшки одного приложения. Разделять приложение на 3 через UI - изначально крайне плохая затея, и изначально плоха любая затея связанная с раздленениям на модули/контексты/приложения, которые используют одни и те же данные и одну и ту же логику(у вас Entity судя по вопросу лишь голая структура данных)
  • Какие фундаментальные труды можно почитать по основам веб-технологий?

    Crash, Фундаментальные труды - https://en.wikipedia.org/wiki/List_of_RFCs :)
    А так, проще поэтапно разбираться в интересующих вас темах, можете искать книжки по ключевым словам от по отзывам
  • Плоха ли описанная архитектура, для laravel?

    vitaly_74,
    а как решить такую проблему - одного огромного ресурса (например у меня будет 50 моделей для связи с 50 таблицами в бд), но нужно обязательно понимать что логики в них вообще не будет. заносить их в соотвтетсвующие модули - точно нельзя.

    Т.е. у вас есть множество данных которые пользователи системы могут заполнять/сохранять/просматривать, но в системе нету Бизнес-логики которая зависит от этих данных, нету смысла деражать их там же где лежит логика?

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

    Необычная ситуация если там прям 50 моделей, возможно их все можно в единый модуль вынести. Это, опять же, не станет проблемой если логики там нету.
  • Плоха ли описанная архитектура, для laravel?

    vitaly_74, Абсолютно нормальная практика, только количество зависимостей нужно минимизировать между пакетами, но они будут.
    Выносить весь код от которого зависит более одного пакета в отдельную общую папку так себе идея, потому что в итоге у вас в приложении будет один огромный пакет(эдакий Common/Core/Shared или что-то подобное) от которого зависят все
  • Как интегрировать Doctrine 2 в 1С-Битрикс?

    Чем удобнее?

    Доктрина мало того что не для db first предназначена(прикрутить то можно, просто профита не будет), так ещё и мешаться будет, создав кучу костылей.
    Если вам нужно crud по базе сгенерировать возьмите eloqunt какой

    Да и вообще - https://www.google.com/search?q=generate+admin+pan...
    Под ваше описание можно даже код не писать