Контакты

Наибольший вклад в теги

Все теги (57)

Лучшие ответы пользователя

Все ответы (936)
  • Сколько вообще принципов ООП, не только основных?

    qonand
    @qonand
    Software Engineer
    Принципы ООП это инкапсуляция, наследование, полиморфизм и абстракция. Остальные принципы просто выступают в качестве рекомендаций для создания более качественного кода в рамках ООП. Помимо S.O.L.I.D есть еще:
    • LOD
    • Inversion of Control
    • CQS
    • GRASP-паттерны (как по мне это все-таки больше принципы чем паттерны)
    Ответ написан
  • Почему Yii/Yii2 не подходит для крупных проектов?

    qonand
    @qonand
    Software Engineer
    Хоть Yii и создан в первую очередь как фреймворк для быстрой разработки приложений, ничего не мешает сделать на нем крупный проект. Как сказал oxidmod Yii ничего не навязывает разработчику, в этом его плюс и минус одновременно. Если проект реализовывают профессионалы - они спокойно его сделают на Yii качественно, если новички - они спокойно заговнокодят проект. Т.е. тут вопрос только в радиусе кривизны рук. Yii реже выбирают для крупных проектов чем тот же Symfony, т.к. с точки зрения бизнеса он более оптимальный, например:
    - в стандартной реализации Yii нацелен в первую очередь на скорость разработки, симфони - на качество. Соответственно в крупном проекте дешевле использовать Symfony со всеми его инструментами, чем реализовывать эти инструменты с нуля. Например, yii-шный ActiveRecord - хорош на простых проектах, но в сложных проектах он приносить больше проблем чем пользы, а в стандартной реализации никаких альтернатив ему не предусмотрено ...
    - Symfony накладывает определенные правила разработки для программистов, соответственно из за этого проще внедрять на проект новых разработчиков, не боясь что они заговнокодят.
    - в Yii низкий порог входа, соответственно "качество" многих разработчиков желает лучшего ...
    Ответ написан
  • У кого есть подборка крутых программистов PHP — блоги, каналы, соцсети?

  • Как получить последние 10 записей в active record?

    qonand
    @qonand
    Software Engineer
    все данные в базе хранятся в неупорядоченном виде, поэтому что такое "последние 10" известно только Вам и господу Богу. Для решения задачи, Вам нужно определить по какому признаку определяются последние записи и соответственно отсортировать данные по этому признаку, например:
    $latests = Project::find()->where(['status' => 1])->orderBy(['id' => SORT_DESC])->limit(10)->all();
    Ответ написан
  • PHP ООП. Где лучше использовать абстрактный класс, а где интерфейс?

    qonand
    @qonand
    Software Engineer
    У интерфейса и абстрактного класса разные назначения.
    Интерфейс ОПИСЫВАЕТ поведение объекта, которое будет использоваться другими объектами. Например, какому-нибудь Вашему классу необходимо использовать объект логгера.
    Интерфейс логгера в очень упрощенном виде может быть таким:
    interface LoggerInterface
    {
        /**
         * Логирование сообщения
         * 
         * @param string $message Текст сообщения, которое необходимо залогировать
         */
        public function log($message);
    }

    сам класс использующий логгер может выглядеть так:
    class A 
    {
        /**
         * @var LoggerInterface Объект используемого логгера
         */
        protected $logger;
    
        /**
         * Конструктор класса
         * 
         * @param LoggerInterface Объект используемого логгера
         */
        public function __constuct(LoggerInterface $logger)
        {
            $this->logger = $logger;
        }
    
        /**
         * Тестовый метод
         */
        public function test()
        {
            $this->logger->log('test message');
        }
    }

    Используя LoggerInterface в классе A, Вы грубо говоря говорите что переданный логгер должен уметь, а уметь он должен логировать сообщения с помощью метода log. Вы никак не уточняете как логгер должен уметь это делать, не уточняете какого класса он должен быть, не уточняете как он должен быть устроен.

    Абстрактный класс ЧАСТИЧНО РЕАЛИЗОВЫВАЕТ функционал. На примере того же логгера:
    abstract class Logger implements LoggerInterface 
    {
        /**
         * Сохранение сообщения 
         *
         * @param string $message Текст сообщения, которое необходимо залогировать
         */
        abstract protected function export($message);
    
        /**
         * Логирование сообщения
         * 
         * @param string $message Текст сообщения, которое необходимо залогировать
         */
        public function log($message) 
        {
    	$date = date('Y-m-d H:i:s');
    	$this->export($date. ': ' . $message);
        }
    }


    В данном примере абстрактный класс указывает КАК должен быть устроен механизм логирования: он непосредственно содержит реализацию механизма дополнения логируемого сообщения (например, датой) и говорит о том что любой потомок этого класса должен реализовать метод export для сохранения сообщения.

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

Лучшие вопросы пользователя

Все вопросы (7)