Ответы пользователя по тегу ООП
  • Интерфейс при наследовании метода: как правильно сделать?

    Adamos
    @Adamos
    Есть базовый класс User, от которого наследуются другие классы, например Admin.

    Зря. Админ - это не разновидность пользователя, это вполне определенная роль на сайте, связанная с конкретным пользователем. Наследование здесь не имеет смысла, логика администрирования сайта и пользователя сайта не пересекаются.
    Ответ написан
    9 комментариев
  • Классы и ООП: зачем, а главное - когда использовать, а когда нет?

    Adamos
    @Adamos
    Простая аналогия разницы между процедурщиной и ООП.

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

    Так вот, после определенного объема и сложности работать с "книжкой" (например, найти конкретную таблицу и сверить ее данные) тяжко даже автору.
    Ответ написан
    Комментировать
  • Как действительно поможет ООП в реальной программе?

    Adamos
    @Adamos
    ООП позволит держать в голове только нужный кусок кода, над которым сейчас работаешь. Потому что его взаимосвязи с другими кусками кода аккуратно выстроены, понятны и минимальны.
    Естественно, чтобы этого добиться, нужно не читать курсы и смотреть мультики, а писать, выкидывать написанное и постепенно научиться писать так, чтобы выкидывать не пришлось.
    Ответ написан
    Комментировать
  • В чем разница между 'фабричным методом' и 'простой фабрикой'?

    Adamos
    @Adamos
    В вашем же примере единственное назначение класса фабрики - создание подклассов в одном методе.
    А классы с фабричным методом умеют свой функционал ПЛЮС могут вернуть себя единообразным для всех них образом. Причем этот самый метод getMobile может заодно участвовать и в других методах того же класса, когда ему понадобилось создать клона, например.

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

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

    Adamos
    @Adamos
    Делите ТЗ на модули, определяете их внешние интерфейсы (то, что одни модули могут запрашивать у других), стараетесь их минимизировать.
    Например, модуль авторизации и аутентификации - это много всего внутри, но снаружи - только общие данные юзера (для вывода) и возможность узнать, авторизован он или нет. Если реализованы права пользователей - то прочим модулям совершенно не нужно знать, как именно (например, принадлежит ли пользователь к какой-то группе). Им нужно узнать, есть ли у него конкретный уровень доступа к конкретному модулю или нет.
    Когда определились с модулями - делаете внутри каждого из них аналогичное разбиение на классы: сначала интерфейс, потом потроха.
    И только перейдя к реализации каждого класса, можете обернуться на свою процедурщину и посмотреть - есть ли код, который можно оттуда использовать как сырье для методов класса.
    Ответ написан
    Комментировать
  • Как понять структуру классов (объектов) в CMS?

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

    Adamos
    @Adamos
    На пальцах: когда вы открываете РНР-страницу, веб-сервер выделяет память и запускает в ней ваш скрипт. Когда вы открываете другую страницу - выделяется другая память. Никакого взаимодействия "на лету" между ними нет и быть не может.
    Ответ написан
  • В чем отличие возвращаемого массива от объектов?

    Adamos
    @Adamos
    Немного опыта и больших проектов - и понимание, чем
    function f(array &arr)
    хуже, чем
    function f(KnownObject o)
    станет простым и естественным.
    Тем более, что даже в простых проектах можно долго искать причину, по которой не работает
    echo $arr['namе'];
    Сомневающимся предлагаю определить, в чем проблема последнего примера.
    Ответ написан
    7 комментариев
  • Классы, объекты, шаблоны - как правильно!?

    Adamos
    @Adamos
    Как именно я должен хранить данные конфига?!

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

    Да, внутренняя часть делается через ограничение protected / private
    Если это будет класс, нужно ли в данном случае использовать конструктор?

    Если данные, например, хранятся в базе и один раз считываются из нее в кэш, из которого уже и отдаются по каждому запросу - логично сделать это в конструкторе. Если у вас просто простыня РНР-массива, обращение к которому ничего не стоит - он может быть статикой, и методы тоже. Но лучше сразу предполагать, что все может измениться и сделать пустой конструктор и нестатические методы даже в этом случае. Чтобы потом не переписывать те классы, которые обращаются за данными.
    Ответ написан
    Комментировать
  • Пожалуйста оцените мое убогое ООП?

    Adamos
    @Adamos
    Во-первых, трудно поверить, что нет кучи готовых решений, разбирающих лог Апача.
    Так что задание, очевидно, учебное, на использование языка и понимание, что такое ООП.
    Так вот, ООП в РНР - это чтобы один раз сделать грязную работу, и больше в нее не заглядывать, используя готовый и по возможности очевидный интерфейс класса.
    У вас же одноразовая портянка, в которой даже имена файлов жестко прописаны в коде, убогие комментарии вместо PHPDoc и вообще ощущение, что ООП вы начали заниматься вчера и считаете его просто возможностью загнать побольше функций в один класс.
    Ну, и результат соответствующий. Вам нужно не исправить это решение, вам нужно позаниматься ООП в РНР некоторое время и прийти к соответствующей парадигме в мышлении. А этот класс можете просто выкинуть.
    Ответ написан
    4 комментария
  • Как правильно писать на ООП?

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

    Простейший пример - jQuery.cookies. Кукисы в браузере хранятся неудобно для редактирования, но это проблемы внутри черного ящика, снаружи их быть не должно. Снаружи вам надо поставить куку и прочитать куку. С коротким списком возможных свойств. Вот это класс и реализует, вполне успешно. Буквально одним методом.
    Мог бы этот метод быть простой процедурой? Да, конечно. Но как раз это - неважно.
    Ответ написан
    2 комментария
  • Как уменьшить связанность классов?

    Adamos
    @Adamos
    Точка не должна знать, какие у приложения настройки и в какой контейнер ее запихнули.
    Это контейнер должен уметь выдать список того, что в него запихнули, а рендер - знать настройки.
    Вы слишком много логики засунули внутрь классов, от которых требуется только хранение координат и пар (или списков) точек. Вот и мучаетесь теперь с ними.
    Ответ написан
    2 комментария
  • Чистый код: блоки try/catch. Стоит ли так делать?

    Adamos
    @Adamos
    Я бы сказал, применимость такого правила сильно зависит от того, приходится ли вам, читая обработку исключений, лезть в код того, что их вызвало.
    Если код выплевывает исключения, которые полностью понятны без чтения этого кода - можно его завернуть в функцию и убрать с глаз долой.
    Если же исключительные ситуации связаны с самой логикой метода, то размазывание этой логики по разным функциям просто нелепо.
    Ответ написан
    Комментировать
  • Что почитать и на чем потренироваться, не могу перейти от процедурного к ооп?

    Adamos
    @Adamos
    Практика. Решайте задачи, не давая себе писать ни строчки вне объектов. Теория суха...
    Ответ написан
    3 комментария
  • Почему в C++ нужно строить всю программу на ООП (длинный вопрос)?

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

    Adamos
    @Adamos
    Нет, так делать не стоит.
    Вы таким наследованием нарушаете L в SOLID.
    Ответ написан
    2 комментария
  • Как "красиво" проинициализировать свойство объекта?

    Adamos
    @Adamos
    Просто реализуйте $options и $price отдельными классами.
    В Product добавьте члены соответствующих классов и в Product используйте только их обобщенную логику. Все, что может различаться - внутрь самих классов.
    Ответ написан
  • Где найти нормальный пример сериализации С++?

    Adamos
    @Adamos
    Имхо, нормальная сериализация класса для С++ - это прописанный в этом классе метод serialize() и конструктор этого класса, принимающий данные в том формате, в котором их выдает этот метод.
    Любые другие варианты - прямая дорога к граблям.
    Ответ написан
    8 комментариев
  • Наследование классов?

    Adamos
    @Adamos
    class Str_Indef: public Stroka
    {
    public:
        using Stroka::Stroka;
    }

    При условии, что у вас компилируется С++11. До этого в С++ наследования конструкторов не было вовсе.
    Ответ написан