Ответы пользователя по тегу ООП
  • Множественное наследование не нарушает ООП?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    И вот теперь я хочу получить класс реализующий поведение и Task и Node. Это нормально?

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

    Читаем про SOLID, в частности Принцип подстановки Барбары Лисков. Так же принцип единой ответственности, слабая связанность (low coupling) и высокое зацепление (high cohesion). По поводу реализации нескольких интерфейсов - скажем для композиции двух классов все будет ок, так как вы при этом мы не сломаем принцип единой ответственности, каждый компонент будет отвечать за свое и все будут счастливы. А класс который будет объеденять две реализаци интерфейсов будет просто проксировать вызовы в нужным инстансам.

    Множественное наследование норм... только высок риск что все это дело благодаря оному будет нарушено.
    Ответ написан
    4 комментария
  • Каковы ваши впечатления о книгах Мартина Фаулера?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Норм.

    p.s. Каков вопрос таков и ответ.
    Ответ написан
    Комментировать
  • Bison - как реализовать ООП?

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

    Грубо говоря, ООП это все то же старое доброе процедурное программирование. То есть, у вас есть структура данных и методы для этой структуры. То есть метод объекта это просто функция для которой можно задать контекст. Можно организовывать виртуальные таблицы для наследования и кучу всего еще. Это уже вам в зависимости от языка надо думать и от его поведения.
    Ответ написан
    5 комментариев
  • Как быстро войти в основы php?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Я думаю вам сразу можно начать с getjump.github.io/ru-php-the-right-way а дальше по мере необходимости обращаться к официальному мануалу.
    Ответ написан
    Комментировать
  • PHP. Упрощенный язык для записи регулярных выражений пользователями?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Пользователь пишет "*." equal " "


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

    шаблон "Interpreter"

    Чта?

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

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Интерфейс - никак. Объект реализующий интерфейс - легко. Поймите в чем разница и будет вам счастье.
    Ответ написан
    Комментировать
  • PHP ООП объект. Как сделать выборку объектов?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Вам нужно нормальную ORM подсказать? Doctrine ORM

    1) потому что вы не знаете нужно оно вам или нет. Это будет разруливаться позже, когда вы будете выводить статью. Возможно по вашей логике будет вывод полного содержания одной статьи и заголовки остальных. В любом случае это состояние объекта. По хорошему после "загрузки" объект должен быть в том состоянии в котором его "сохраняли". Как будто бы мы просто взяли из массива объект, добавленный ранее. Ну и да, за счет прокси классов та же Doctrine умеет загружать данные частично и все остальное по необходимости отдельными запросами.

    2) обычно это просто поле author, которое хранит объект User, которые уже знает о том что внутри. Но отношения между объектами у вас всеравно есть. То есть ORM должна будет при обращении к полю user подгрузить всю сущность.

    Мне кажется что вам еще рано думать о том как написать свою ORM.
    Ответ написан
    Комментировать
  • Как созадть интерфейс в JavaScript?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    JS динамический язык с утиной типизацией. Собственно как в Ruby или Python. Наследование в нем реализуется через объекты и прототипы объектов. То есть места интерфейсу тупо нету.

    Грубо говоря, если допустить наличие "классов" в JS, то интерфейсом будет как раз таки абстрактный класс, у которого реализация всех методов выбрасывает ошибку not implemented. Во всяком случае люди которые еще не отвыкли писать интерфейсы на все и вся в Python или Ruby так обходятся.

    Но вообще вы должны подчиниться правилам утиной типизации и делать как-то так:

    function can(obj, methodName) {
         return ((typeof obj[methodName]) == "function");
    }
    
    // вот так вот сурово мы подаем вместо объекта словарь!
    var dict = {
       quack: function () {
           console.log('Quack! Quack!');
       }
    }
    
    // метод требует объект реализующий метод quack
    function test(obj) {
        if(!can(obj, 'quack')) { throw "Object should implement quack method" }
        obj.quack();
    }
    Ответ написан
    4 комментария
  • Как правильнее переопределить метод родительского класса?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Что именно вам не понятно в фразе
    Declaration of User::isExists() should be compatible with that of GlobalClass::isExists()

    Ее можно трактовать как

    определение метода User::isExists() не должно отличаться от GlobalClass::isExists()

    то есть вы ломаете интерфейс, ваш метод у класса наследника делает явно что-то не то, что от него требуется.

    Учите принципы ООП и GRASP (можно по видио лекциям, тут нужно что бы объяснял кто-то).
    Ответ написан
    1 комментарий
  • (PHP5) Почему присваивание работает как клонирование?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Нету тут никакой магии с клонированием.

    Для начала давайте разберемся что хранит $instance. Хранит оно ССЫЛКУ на объект а не сам объект. При простом присвоении по значению происходит копирование значения переменной, а оно у нас просто ссылка на объект. В итоге у нас уже две ссылки на один объект.

    При присвоении переменной $reference значения по ссылке, у нас две переменные делят одно и тоже значение. А значение это - ссылка на объект.

    Когда мы затираем ссылку в $instance, то есть мы меняем значение оной, оно же меняется и у $reference так как они делят на двоих одно значение. $assigned же имеет свою ссылку на объект.

    $instance = new SimpleClass(); // количество ссылок на экземпляр SimpleClass - 1
    
    $assigned   =  $instance; // количество ссылок на экземпляр SimpleClass - 2
    $reference  =& $instance; // количество ссылок на экземпляр SimpleClass - 2
    
    $instance = null; // количество ссылок на экземпляр SimpleClass - 1


    Как только у нас не останется ссылок на экземпляр класса, сборщик мусора удалит объект.

    А что до клона - если бы объекты бы копировались, начался бы ад, так как объекты хранят другие объекты, которые могут делить между другими объектами... словом там слишком сложно все становится и пусть уж лучше программист это в __clone сам разруливает.
    Ответ написан
    1 комментарий
  • Каким способом можно получить параметры класса из любого участка кода PHP ?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Компонент security, который может предоставить доступ к инстансу текущего пользователя. Что бы не создавать все руками используйте Dependency Injection. Например PHP-DI. То есть если какому-то компоненту понадобился доступ к пользователю текущему - просто указываем в зависимостях у оного компонент security у которого есть метод getUser. В итоге если этот наш компонент понадобился где-то еще, мы уже его записываем как зависимость. Все что связано с ресолвом зависимостей ложится на плечи нашего DI контейнера.

    Подробнее можно узнать почитав про "принцип инверсии зависимостей".
    Ответ написан
    1 комментарий
  • Как организовать чередь с функцией вставки элементов на PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    php.net/manual/en/class.splqueue.php и ненужно велосипедов. Что до "вклинивать" элементы, может вам очередь с приоритетами нужна? Так и оно есть:
    php.net/manual/en/class.splpriorityqueue.php
    Ответ написан
    Комментировать
  • Зачем статическому классу обязательно прописывать метод конструктора?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Непонятно зачем вам тут вообще класс...

    Если пишите класс, не используйте статику. Вообще. Статические методы могут облегчать доступ к объекту, туда можно выносить какую-то простенькую логику инициализации (фабрики как статические методы) но просто так городить статику...

    Что до обязательного наличия конструктора - оно не обязательно. Проблема в статическом методе router, который имеет одно имя с классом и воспринимается как конструктор. Но конструктор не может быть статическим. Когда вы определяете явно конструктор - то проблема "исчезает"...

    PHP Fatal error: Constructor Router::router() cannot be static


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

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Посмотрите реализацию $rootScope а angular.js для реализации дата биндинга. Вообще этот фреймворк весьма неплохо написан и его исходники можно поизучать.

    А вообще наследование не так уж часто и нужно. Да и наследование в JS больше напоминает декорацию объектов.
    Ответ написан
    Комментировать
  • Как правильно использовать методы и атрибуты классов PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Потрудитесь для начала почитать документацию. И именно документацию а не статьи васи пупкина. Там даже на русском переведено (то что про ООП), и там очень даже неплохо раскрыты основы. Так же советую подключить википедию и почитать про "инкапсуляцию".
    Ответ написан
    Комментировать
  • Как распланировать классы для приложения а-ля pastebin.org?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    guesstype вообще не должно быть в базовом классе, ибо это не логично. Можно сделать в базовом классе абстрактный метод isMatches (просто пустой метод который выкидывает исключение) и в потомках перегружать его. Этот метод будет определять, подходит ли данный кусок кода под выбранный язык. Хотя еще лучше было бы в отдельный компонент эту логику запихнуть.
    Ответ написан
    1 комментарий
  • Как организовать инстанс класса вызванного через call_user_func ?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Почему вам так нравятся статические методы? Зачем вам тогда классы? Почему бы просто функции по неймспейскм не пораскидать?
    Ответ написан
  • Как наследовать свойство PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Почитайте о инкапсуляции. И совет - не делайте внутри классов exit или инициализацию подключения к базе. Ленивая инициализация намного удобнее.

    class OCIConnect
    {
      private $link = null;
      public function __construct($user, $pass, $host) {
            // fixme: это не стоит делать в конструкторе, лучше использовать ленивую инициализацию.
            $this->link = oci_connect($user, $pass, $dbHost);
            if (!$this->connect) {
                $m = oci_error();
                throw new Exception(sprintf('Connection error: %s', $m['message']));
            }
        }
    
        public function exec($sql) 
        {
             // exec sql
        }
    }


    class Agent
    {
            /**
            * @var $connection
            **/
            private $connection;
    
    	function __construct(OCIConnect $connection)
    	{
                   $this->connection = $connection;
    	}
            public static function getData($sql,$bind = null) {
                    // do something
                   $this->connection->exec($sql);
            }
    }
    Ответ написан
    Комментировать
  • Как лучше обрабатывать результат?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    2 вариант, но без публичны свойств - все по хардкору через геттеры сеттеры. В идеале даже заблокировал бы конструктор при помощи прокси-класса. А если совсем серьезно - взял бы Doctrine.
    Ответ написан
    1 комментарий