Public или private по умолчанию, что выбрать?

На одном из проектов я встретил интересное мнение. Весь код в проекте должен быть максимально открыт по умолчанию. Т.е. мы делаем все методы и поля public, а final нигде не ставим. Мотивировано это было сложностями дальнейшей поддержки:

Если я захочу наследовать класс, а там метод private, мне придется изучать код, чтобы понять, зачем его сделали private и могу ли я сделать его публичным.

Это мнение было очень необычным для меня, и я решил выяснить: действительно ли приватные поля и методы принесут больше проблем, чем публичные.
Давайте напишем класс с лишним публичным методом и посмотрим, насколько просто его будет поддерживать.

interface FooInterface {
  public function foo();
}

class Foo implements FooInterface {
  public function foo() {
    // do stuff
    $this->bar();
    // do stuff
  }

  public function bar() {
    // do stuff
  }
}

April 30, 2023
Около 2 мин
Как делать не надо #1. Несуществующие поля трейтов

Этой статьей я открываю рубрику из практики "Как делать не надо". В ней будет код из реальных проектов, из которого я уберу все отсылки к самим проектам. И, конечно, разъяснение: почему так делать нельзя, и как бы поступить стоило.

Итак, первый пациент. Внутри трейта используются поля его наследников. То есть, что-то такое:

trait Foo
{
    public function bar(): string
    {
        return $this->field . self::CONSTANT . $this->method() . true;
    }
}

Примечание

Или даже хуже, $this->{$attribute}. Но это уже совсем ни в какие ворота не лезет, т.к. шанс схлопотать 500ю ошибку поднимается почти до 100%.


April 23, 2023
Около 1 мин
Пример настройки xDebug в докере

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

Пример настройки xDebug в докере

January 21, 2023
Около 3 мин
IT-пузырь лопнул?

Год назад при смене работы я даже не стал публиковать резюме. Действовал я так из предыдущего опыта: каждый раз, открывая резюме в общий доступ, приходилось очень много общаться с компаниями, с которыми у нас заведомо ничего не могло получиться. Поэтому я спросил у знакомых, какие компании сейчас ищут разработчиков, постучался в парочку и нашёл отличное место. Позже, правда, выяснилось, что мы с этой компанией друг другу не совсем подходим, и я уволился. Уверен, что если бы я открыл резюме, мне бы снова, как и за пару лет до того, пришлось бы откапывать себя из откликов эйчаров. Лично для меня с тех пор ситуация сильно изменилась.

IT-пузырь

January 10, 2023
Около 2 мин
Неуловимая 502, или как сеньоры не могли найти ошибку

Какие ошибки в программировании страшнее всего? Я бы выделил два типа:

  • те, из-за которых бизнес теряет много денег
  • и те, которые встречаются реже всего.

Почему первые - понятно сразу, а что со вторыми? Дело в том, что чем реже мы встречаем какой-то тип ошибок - тем сложнее понять, чем они вызваны.
Так случилось и у меня на работе. Однажды утром тестировщики заметили, что часть запросов бэкенду возвращала ошибку 502 (Gateway Timeout). Эта ошибка тормозила релиз, и за неё взялись все старшие разработчики и devops-инженер. Поначалу считали, что эту ошибку возвращает Nginx, и бэкенд не при чём. Через некоторое время поняли, что виноват всё-таки PHP. На что только не грешили: отключали BlackFire, меняли настройки OpCache, пробовали разные патч-версии в PHP, и так далее. Однако, сама ошибка оказалась не в инфраструктуре, а непосредственно в коде приложения.

Ошибка 502 Bad Gateway

September 14, 2022
Около 2 мин
Как запускать на компьютере PHP, не устанавливая его (Linux)

Ответ прост и очевиден: я использую Docker 😃 Преимущества, которые я получаю от такого использования PHP:

  • Не надо морочаться с настройкой локального окружения, переключением версии PHP, установкой дополнительных библиотек и разрешением конфликтов
  • Достаточно одного текстового файла с алиасами командной строки, чтобы любая актуальная версия PHP работала на любом компьютере. А отсюда
    • Легкость переноса данных между машинами
    • Можно спокойно снести систему на своем основном компьютере, восстановление работы с PHP будет просто как git pull

Заметка

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

Как запускать на компьютере PHP, не устанавливая его

August 19, 2022
Около 5 мин
Как выбрать инфраструктурный инструмент

Когда IT-продукт развивается, обязательно наступает момент, когда становится нужно принести в него какой-то новый инструмент или заменить старый на что-то более подходящее. И вроде бы статей на тему выбора инструментов написано много, сказать нового больше нечего, а вопрос все равно остается актуальным, местами даже острым.

Как выбрать инфраструктурный инструмент

Вообще есть несколько популярных подходов:

  • Налево пойдешь - хайповый инструмент найдешь
  • Направо пойдешь - что-то проверенное и надежное возьмешь
  • Прямо пойдешь - любимый инструмент прикрутишь

Они хороши тем, что при их использовании не надо думать. Просто берешь то, что хочется - и дело с концом 😃 Ну а если есть нужда или желание подойти к вопросу более серьезно - прошу под кат, будем разбираться.


August 8, 2022
Около 6 мин
Как мне понадобилось написать Строитель

В мире разработки существует множество архитектурных паттернов. Часть из них мы используем каждый день, часть - реже. Наверняка каждый из вас много раз видел синглтон и фабрику. Многие их писали. А вот когда я впервые прочёл про паттерн Строитель, то не понял поначалу, в какой ситуации его можно применить. Что совсем смешно: я регулярно использовал его реализацию (QueryBuilder из фреймворка Yii), но глаз настолько замылился, что я не смог сопоставить название и функционал этого класса с соответствующим паттерном проектирования 😂 Конечно, через некоторое время до меня дошло. А еще через некоторое - нашлась ситуация, в которую паттерн Строитель вписался идеально.

Архитектурный паттерн Строитель

July 18, 2022
Около 2 мин
Запретная тема или Что делать с прокрастинацией

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

Выгорание

July 1, 2022
Около 6 мин
Два типа классов для вашего проекта

Вопрос о зоне ответственности того или иного класса в вопросах архитектуры не менее важен, чем ее стратегическое планирование. Сегодня я расскажу о том, как облегчить себе эту работу. Мы с вами решим довольно большое количество вопросов, из бесконечного многообразия классов оставив всего 2 их типа: ДТО и Сервис. Эти типы классов покрывают 90-99% всего необходимого в любом проекте. Итак, разберём, что они из себя представляют, и чем же так хорошо оставить только их.

Два типа классов для вашего проекта

June 16, 2022
Около 4 мин
2