Ответы пользователя по тегу ООП
  • Как создавать объект с большим количеством свойств?

    qonand
    @qonand
    Software Engineer
    Обязательные параметры стоит задавать в конструкторе класса - это позволит обеспечить обязательность их указания, опциональные с помощью геттеров и сеттеров. Кроме того стоит пересмотреть действительно ли все обязательные поля являются обязательными - или некоторые все таки нет + по возможности параметры стоит упаковать в объекты-значения
    Ответ написан
  • Смысл интерфейса (не GUI) и зачем он вообще нужен?

    qonand
    @qonand
    Software Engineer
    Т.е. могу сделать вывод, что интерфейс в сущности своей, предназначен скорее для удобства и организации в структурах различных классов, т.е. дать им общее, но реализуемое в каждом по своему, при этом, обязать реализовать именно все, что указано в интерфейсе.

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

    qonand
    @qonand
    Software Engineer
    Узнал от(значительно) более опытного коллеги, что использование статических методов считается нарушением принципов ООП.

    Ну как бы основной принцип ООП построение программного кода на основе объектов. Что такое объект? это некая сущность имеющая состояние и имеющая методы работающие с этим состоянием. Любые статические компоненты - относятся не к объектам а к классу.

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

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

    Что будет занимать больше памяти и как вообще в обоих случаях будет работать сборщик мусора?

    Какая разница? Это экономия на спичках в которой нет смысла

    Что будет работать быстрее?

    Все зависит от компилятора

    Есть ли у статического варианта какие-то подводные камни, например, при вызове из нескольких потоков?

    Статический метод от глобальной функции отличается только тем что он привязан к классу. Делайте выводы...
    Ответ написан
    2 комментария
  • Книги по ООП (не для начинающих)?

    qonand
    @qonand
    Software Engineer
    почитайте книгу Бертрана Мейера "Объектно-ориентированное конструирование программных систем" - это пожалуй на сегодняшний день одна из самых содержательных книг по ООП
    Ответ написан
    Комментировать
  • Легкий вопрос по теории ООП. Создание экземпляра класса в этом же классе?

    qonand
    @qonand
    Software Engineer
    Создавать то можно, насколько это правильно - зависит полностью от конкретной задач. Если хотите более подробного ответа - опишите детальнее задачу
    Ответ написан
    Комментировать
  • Как использовать ооп на практике?

    qonand
    @qonand
    Software Engineer
    Вот выучил я что такое классы, объекты, наследование и т.п. А как его использовать на практике не пойму(когда php выучил также было)...

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

    Есть два своих проекта написанных процедурно, но хотелось бы их под ооп переделать. А как процедурный код превратить в ооп'шный я хз.

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

    qonand
    @qonand
    Software Engineer
    И нужно через супер класс одним махом выводить содержание всех листов в наследниках

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

    qonand
    @qonand
    Software Engineer
    Предположим, мне надо создать класс D, в котором M1 содержит реализацию класса A, а метод M2 реализацию класса B.

    Подобные проблемы возникают как правило из-за неверно спроектированных классов, в частности когда классы "берут на себя слишком много". Вам стоит описать хотя бы в общих словах что у Вас за классы и методы
    Ответ написан
    1 комментарий
  • Правильно ли я использую класс?

    qonand
    @qonand
    Software Engineer
    Бегло посмотрев:
    1. Зачем в классе объявлены публичные атрибуты id и text если они нигде не используются?
    2. Вы везде используете $db->prepare, но локальная переменная $db не инициализирована. В этом коде Вы должны обращаться к атрибуту класса, т.е. $this->db->prepare
    3. Зачем в каждом методе делать проверку эту проверку
    if($stmt->execute(array($text))){
       return true;
    }else{
       return false;
    }

    но какой в ней смысл если $stmt->execute и так возвращает boolean, проще написать просто
    return $stmt->execute();
    4. Да и вообще в случае возникновения ошибки лучше что бы метод не false возвращал а исключение бросал, а клиенты класса уже на него как-то реагировали
    5. В методе getAll у параметра $id лучше поставить значение по умолчанию null
    Ответ написан
    1 комментарий
  • Как из конструктора класса вернуть массив?

    qonand
    @qonand
    Software Engineer
    Само по себе наличие классов еще не означает что Вы применяете ООП-подход. Ваш код как и сам вопрос говорит о полном не понимании ООП-парадигмы. Поэтому лучше разберитесь с ней, почитайте соответствующие статьи/книги, вместо того что бы "с ходу" писать кучу подобного кода. Не хотите разбираться - тогда вообще не стоит строить проект на объектах и всем что с ними связано
    Ответ написан
    Комментировать
  • Правильно ли использовать метод который не создан в данный момент?

    qonand
    @qonand
    Software Engineer
    Да это вполне нормальный подход с точки зрения ООП. Если бы Вы привели код можно было бы дать более подробный комментарий
    Ответ написан
    Комментировать
  • Зачем нужны абстрактные свойства?

    qonand
    @qonand
    Software Engineer
    Вы изначально не верно сформулировали вопрос - поэтому и не понятна его суть. Что такое свойства класса? Свойства класса - это характеристики которые его описывают. Для примера возьмем обычный класс стека, какие свойства у него есть?
    1. Он хранить в себе множество объектов
    2. У него есть информация о количестве хранимых объектов, реализуемая как правило с помощью атрибута(поля) класса
    3. У него есть возможность получение объекта по принципу "Первый вошел - последний вышел", реализуемая как правило с помощью метода

    Судя по комментариям, Вы спрашиваете про атрибуты(поля) класса - компоненты которые, описывают хранимые данные. Абстрактные атрибуты имеют такое же предназначение как и абстрактные методы, т.е. их задачи:
    - декларировать наличие атрибутов которые должны обязательно присутствовать в дочерних классах
    - "перелаживать" подробности реализации на дочерние классы. Стоит не забывать что атрибуты классов, как и методы, так же могут иметь разную реализацию - их данные могут храниться в памяти либо вычисляться на лету (и некоторые языки программирования соответственно предусматривают такие варианты реализации)
    Ответ написан
    Комментировать
  • Почему нельзя наследоваться от класса БД?

    qonand
    @qonand
    Software Engineer
    Уж извините, никого не хочу обидеть, но подобное желание наследоваться от всего подряд и отсутствие понимая почему так нельзя делать говорит о полном не понимании концепции ООП. Полноценно ответить на Ваши вопросы не возможно - не хватит поста, тут целую лекцию можно написать. Да и ответы породят только дополнительные вопросы. Поэтому лучше уделите недельку другую - и прочтите пару книг по ООП, и сразу все станет на свои места..
    Ответ написан
    Комментировать
  • Нужно ли объявлять свойство db в классе?

    qonand
    @qonand
    Software Engineer
    Есть класс базы данных. Статичный синглтон.

    Синглтон это не очень хорошо ... почему - можно просто погуглить этому посвящено не мало материалов
    Нужно ли при создании новых классов создавать свойство db protected и внутри класса работать с db->, а не в DB::

    Ну тут все зависит от того как Вы будете передавать объект базы данных в конкретный экземпляр. Если будете например использовать какую-нибудь инъекцию зависимостей, тогда само собой нужно записывать объект базы в свойство класса. Если же Вы планируете в классах делать что-то типа такого $this->db = DB::getInstance() то особого профита это даст (кроме незначительного повышения читабельности кода), а вот количество используемой памяти увеличит (за счет выделения дополнительных ссылок на объект базы данных)
    Ответ написан
    4 комментария
  • Отношение расширения и обобщения между классами это одно и тоже?

    qonand
    @qonand
    Software Engineer
    Расширение, обобщение и наследование это случаи одного и того же отношения "is a".
    В общем наследование - это повторении дочерним классом структуры и функциональности родительского
    Расширение - это частный случай наследования, при котором дочерний класс не только получает компоненты родительского но и еще реализовывает собственные компоненты
    Обобщение - это выделение у нескольких классов общего предка, от которого можно наследоваться
    Ответ написан
    7 комментариев
  • Вопрос организации архитектуры. Производительность или поддерживаемость?

    qonand
    @qonand
    Software Engineer
    Не стоит зацикливаться на принципах и слепо им следовать. Выбирать между производительностью и поддерживаемостью всегда стоит исходя из особенностей проекта. Стоит задуматься насколько вообще важна поддерживаемость в конкретном проекте и насколько ее могут ухудшить решения улучшающие производительность. Если проект мелкий или разрабатывается как какое-то временное решение, тогда маловероятно что производительный код сильно ухудшить поддерживаемость. Если же проект большой и в будущем в него будут активно вноситься изменения - стоит предпочесть поддерживаемость производительности
    Ответ написан
    Комментировать
  • ООП в C# c точки зрения Алана Кея?

    qonand
    @qonand
    Software Engineer
    1) Всё является объектом

    Да с точки зрения "чистого" ООП все является объектом, в том числе и скалярные величины. Согласен с Станислав Макаров что эта концепция в реальном мире сомнительна...

    2) Вычисления осуществляются путём взаимодействия (обмена данными) между объектами, при котором один объект требует, чтобы другой объект выполнил некоторое действие. Объекты взаимодействуют, посылая и получая сообщения. Сообщение — это запрос на выполнение действия, дополненный набором аргументов, которые могут понадобиться при выполнении действия

    Изначально объекты действительно общались с помощью обмена специальными объектами-сообщениями. Но со временем такой подход заменили на вызовы методов (что и выражено в современных языках программирования). Если Вы вдумчиво вчитаетесь в описание термина "сообщение" то поймете что точно таким же образом можно и охарактеризовать работу метода.

    3) Каждый объект имеет независимую память, которая состоит из других объектов

    Речь идет здесь о том что данные содержащиеся в объекте принадлежат только ему (т.е. они не глобальные) и ничто не может их изменить/прочитать без запроса к самому объекту. Соответственно каждый объект имеет какие-то свои собственные данные.

    4) Каждый объект является представителем класса, который выражает общие свойства объектов (таких, как целые числа или списки)

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

    5) В классе задается поведение (функциональность) объекта. Тем самым все объекты, которые являются экземплярами одного класса, могут выполнять одни и те же действия

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

    6) Классы организованы в единую древовидную структуру с общим корнем, называемую иерархией наследования. Память и поведение, связанное с экземплярами определённого класса, автоматически доступны любому классу, расположенному ниже в иерархическом дерев

    Да тут речь идет о наследовании - но это не означает что прям каждый класс должен быть от чего-то унаследован. Этот пункт вообще говорит о том что стоит использовать наследование и преимущества которые оно дает
    Ответ написан
    Комментировать
  • Не всегда же называть методы глаголами?

    qonand
    @qonand
    Software Engineer
    судя по всему у Вас методы устанавливают значения соответствующих свойств.
    Для таких методов принято формировать названия с префиксом set, например: setEvent (установить событие), setDate(установить дату)

    Что касается приведенного фрагмента: это базовый класс Yii фреймворка, а сам по себе код этого фреймворка желает лучшего, с точки зрения соответствия различным практикам программирования. Давайте забудем что это за фреймворк, забудем все что описано в документации по нему, и посмотрим на этот код просто с точки зрения ООП, глазами человека не привязанного к какому-то конкретному инструменту. Например, возьмем метод alias(). Что мы можем сказать о этом методе? Мы можем сказать что в этом методе что-то делается с псевдонимом. Но что конкретно делает этот метод? за что он отвечает? Исходя из его названия - мы ничего о этом сказать не можем, т.к. такое название неочевидно.
    Ответ написан
    4 комментария
  • Как заменить switch case паттерном стратегия?

    qonand
    @qonand
    Software Engineer
    Для выбора стратегии switch не используется. Объект необходимой стратегии просто передается в класс. Пример можно посмотреть например здесь
    Ответ написан
    1 комментарий
  • Как правильно разделить классы в ООП PHP?

    qonand
    @qonand
    Software Engineer
    так вот вопрос в следующем, можно ли в одном файле хранить 2 класса? Насколько это правильно?

    Нет. это не правильно. Ссылки на стандарты описывающие это привел Дмитрий Энтелис
    1. Файл database.php - в нем хранится клас и функции для работы с БД.
    2. Файл run.php - там хранятся функции для работы с с каждой строкой из БД (можно сказать основной файл)
    3. Файл api.php - функции сторонних сервисов, необходим для run.php
    4. Файл config.php - ну тут все понятно чисто переменнные для работы
    5. Файл index.php - основной который запускает и объединяет все.

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

    использование ООП не всегда уместно, все зависит от конкретной задачи. но знание ООП практически везде обязательно
    Ответ написан
    Комментировать