Как использовать DocBlocks в PHP 7.4? - PullRequest
0 голосов
/ 05 апреля 2020

Вообще, использование DocBlock в PHP является одной из лучших практик. Это было очень полезно для предыдущих версий PHP (меньше, чем PHP 7.3 или особенно 7.4). Он информирует разработчиков о типах свойств класса, ожидаемых типах аргументов и значениях, возвращаемых методами (в случае отсутствия строгой типизации в PHP).

Допустим, в PHP 5.6 код может выглядеть следующим образом:

namespace App\Service\Catalog\Category;

use App\Entity\Catalog\Category\Category;
use App\Repository\Catalog\Category\CategoryRepository;

class CategoryService
{
    /** @var CategoryRepository */
    private $categoryRepository;

    /** @var int */
    private $currentNestingLevel = 1;

    /**
     * CategoryService constructor.
     * @param CategoryRepository $categoryRepository
     */
    public function __construct(Category $categoryRepository)
    {
        $this->categoryRepository = $categoryRepository;
    }

    /**
     * @param $parentCategoryId
     * @return array
     */
    public function getCategoriesDataByParentCategoryId($parentCategoryId)
    {
        $categories = $this->categoryRepository->getByParentCategoryId($parentCategoryId);
        $categoriesData = [];

        foreach ($categories as $category) {
            $categoriesData[] = $this->getCategoryData($category);
        }

        return $categoriesData;
    }
}

Но эти DocBlocks не предоставляют никакой дополнительной информации в этом случае, когда мы используем PHP 7.4:

namespace App\Service\Catalog\Category;

use App\Repository\Catalog\Category\CategoryRepository;

class CategoryService
{
    private CategoryRepository $categoryRepository;

    private int $currentNestingLevel = 1;

    public function __construct(CategoryRepository $categoryRepository)
    {
        $this->categoryRepository = $categoryRepository;
    }

    public function getCategoriesDataByParentCategoryId(int $parentCategoryId): array
    {
        $categories = $this->categoryRepository->getByParentCategoryId($parentCategoryId);
        $categoriesData = [];

        foreach ($categories as $category) {
            $categoriesData[] = $this->getCategoryData($category);
        }

        return $categoriesData;
    }

}

Robert C. Мартин пишет в чистом коде, что использует JavaDo c (si c!) Для всех методов / переменных и т. Д. c. это плохая практика и снижает читабельность кода. Кроме того, он сказал, что возможно, что комментарий (DocBlock) не отражает текущее состояние указанного элемента (например, в DocBlock у нас есть int, но переменная была заменена на строку)

Как я уже проверял, стандарты PSR в основном говорили только как использовать DocBlock и как они должны выглядеть, но не тогда, когда их следует использовать.

Что вы думаете об этом? Должны ли мы использовать DocBlock всегда для всех элементов в коде или только в определенных c случаях? Какие плюсы и минусы вы видите в обоих случаях?

1 Ответ

3 голосов
/ 05 апреля 2020

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

Так что express в комментариях любые специфичные для домена c правила и политики, которые не может быть выражено с помощью имен функций и переменных.

Кроме того, так как книга кодов Clean написана в основном вокруг поддержки синтаксиса Java - в PHP мы не можем явно указать в коде, что этот метод генерирует где-то исключение по дороге. Это означает, что единственный способ, которым мы можем уведомить IDE и разработчиков, чтобы они ожидали исключений, - это тег @throws.

Также Java поддерживает аннотации, а PHP - нет. Это еще одно возможное использование комментариев. Некоторые фреймворки решили использовать это - например, Symfony с его аннотациями маршрутизации. Doctrine ORM с аннотациями сущностей и так далее. Они читаются и компилируются в библиотеках, чтобы обеспечить поддержку, аналогичную встроенным аннотациям.

Поэтому используйте комментарии, которые дядя Боб рекомендует в своей книге, со следующими дополнениями из-за PHP природы:

  • Поддержка аннотаций (@see Doctrine аннотации)
  • @ throws tag для исключений
  • Любой лог c, который не может быть выражен с помощью имен классов / функций / переменных

Также возможно использование IDE-специфицированных c или инструментальных c комментариев, таких как:

  • PHPStorm подавление данных проверок
  • PHPMD подавление заданных предупреждений

Как указано @El_Vanja:

  • Вы можете указать c для ожидаемого типа, например, содержимое итерируемого: @return SomeClass[] или @param string[]
...