Ответы пользователя по тегу ООП
  • Почему нельзя переопределить construct при наследовании?

    mr_T
    @mr_T
    Web-разработчик
    Потому что при наследовании нельзя изменять доступность функции. Если нужен синглтон, то ты по определению не сможешь унаследоваться от класса с открытым конструктором. А сделано это для того, чтобы объект любого класса, унаследованного от данного, гарантированно обладал всеми функциями родителя, в частности и возможностью создания новых объектов. Иначе теряется смысл наследования.
    Ответ написан
    7 комментариев
  • Плохая ли это идея конфигурировать классы/сервисы с помощью замыканий, а не, например, массивов?

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

    trait ClosureConfigurable {
        public function configureWith(Closure $closure) {
            $closure($this);
        }
    }


    Таким образом конструктор не будет содержать дополнительный код, а логику работы примеси можно будет безболезненно менять и дополнять (например, ставить замыкания в очередь, передавать им дополнительные параметры, сделать условную конфигурацию и т.п.).
    Ответ написан
    1 комментарий
  • Что такое нарушения принципов ООП?

    mr_T
    @mr_T
    Web-разработчик
    3 заветных слова: наследование, инкапсуляция, полиморфизм. По ним можно много нагуглить.
    Элементарный пример нарушения принципа инкапсуляции - объявление public поля класса. Нужно все поля делать private, а доступ к ним организовывать через методы доступа типа get..., set... или как-то более прозрачно, если позволяет язык (__get, __set в php, свойства в C#). По наследованию и полиморфизму накосячить уже сложнее, так как этого не позволит синтаксис скорее всего. Хотя кто знает, какие у человека есть скрытые возможности...
    Ответ написан
    2 комментария
  • Как с помощью метода задать значение переменной в скрипте php?

    mr_T
    @mr_T
    Web-разработчик
    Вообще лучше сделать это через __set, __get, чтобы не было некрасивых записей типа $obj -> set/getName, а просто обращаться к name так, как будто это поле объекта. Ну а sanitize нужно вызывать как static::sanitize. Только добавь к методу sanitize static. А, ну и обязательно нужно сделать PRIVATE $name, а то смысл инкапсулирования теряется.
    Ответ написан
    Комментировать
  • Где почитать про ООП на JavaScript?

    mr_T
    @mr_T
    Web-разработчик
    Для начала нужно понимать, что аббревиатура ООП в JavaScript имеет не ту интерпретацию, которую можно увидеть в классическом описании. Там есть и инкапсуляция, и полиморфизм, и наследование, но при этом не существует (О_о) классов.
    Отвечая на вопрос: статьи нужно искать в гугле по запросам JavaScript + наследование прототипов || замыкания || конструктор. А лучше взять книжку Флэнагана JavaScript: The Definitive Guide.
    Ответ написан
    7 комментариев