리팩토링 #8: 죽은 것은 절대 실행되지 않을 수 있습니다.

코드를 잘 살펴보고 완료되면 정리하는 것이 중요합니다. 때때로 우리는 이 작은 세부 사항을 잊어버리고 도달할 수 없는 진술의 흔적을 남기고 그냥 넘어가는 경향이 있습니다.

다음은 죽은 코드 조각의 매우 노골적인 예입니다.

{
    $user = auth()->user();

    return $user->posts;

    // This line will never run
    $user->posts->each->publish();
}


위의 마지막 줄은 실행되지 않으며 이러한 유형의 코드는 매우 드물게 발생하는 것처럼 보이지만 여전히 많이 나타납니다. Rector이라는 자동 도구가 있는데, 이 도구는 이와 같이 죽은 코드를 찾아서 제거하거나 그 존재를 알려주는 데 탁월합니다.

Rector는 첫눈에 완전히 명확하지 않은 다른 데드 코드도 발견합니다. 아래는 실제로 매우 일반적입니다.

    /**
     * @param GeocoderInterface $geocoder
     */
    public function __construct(GeocoderInterface $geocoder)
    {...}


PHPDoc은 메서드 선언에 명확하게 명시된 것과 동일한 정보를 표현하고 있습니다. 개발자는 메소드에 GeocoderInterface 객체가 필요하다는 것을 쉽게 알 수 있지만 추가 주석은 그 이상을 말하지 않습니다. IDE와 마찬가지로 주석 없이 필요한 자동 완성 기능을 얻을 수 있습니다.

PHPDocs는 변장한 거짓말쟁이일 수 있습니다.



이 중복 문서에 대해 마음에 들지 않는 또 다른 점은 그들이 종종 '거짓말'을 한다는 것입니다. 예를 들면 다음과 같습니다.

    /**
     * @return User
     */
    public function user(): BelongsTo
    {
        return $this->belongsTo(User::class);
    }


이것은 나를 밤에 유지합니다. 이 Eloquent 관계는 반환 유형이 BelongsTo 이지만 코드 어딘가에서 메서드$post->user()로 사용하면 IDE가 Eloquent 모델에 속하는 자동 완성 옵션을 잘못 제안합니다. 이러한 버그가 런타임에 발생했을 때 찾는 것이 재미있을 것이므로 주석을 완전히 제거하십시오.

실제 모델$post->user에 액세스할 때 더 많은 자동 완성 옵션을 원하기 때문에 이 작업을 자주 수행하는 경우 다음과 같이 주석을 추가하는 것이 좋습니다.

/**
 * @property User $user
 */
class Post extends Model


Laravel의 기본 스텁



죽은 코드의 또 다른 조각은 Laravel 프레임워크의 기본 스텁입니다. 의존성을 쉽게 입력할 수 있도록 거기에 있습니다. 아무것도 없으면 어떻게 해야 합니까? 우리는 게으르기 때문에 그냥 그대로 둡니다.

    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
    }



    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }


그것들을 유지하는 데 아무런 해가 없지만 솔직히 아무것도 주입하지 않는다면 이 빨판을 지면에서 닦아내십시오. 그들은 단지 귀중한 공간을 차지하고 실제 코드를 아래로 밀어내고 있을 뿐입니다. php artisan stub:publish 를 실행하여 기본 스텁을 변경할 수도 있습니다.

항상 참인 조건



죽은 코드 후보 #4는 까다롭습니다. 일반적으로 다음과 같은 간단한 경우와 같이 중복 검사를 제거하는 것이 안전합니다.

     if (! auth()->check()) {
         return 'not logged in';
     }

    // This second condition is always true
-    if (auth()->check()) {
-        return 'logged in';
-    }

    // You can just execute the code without the condition
+    return 'logged in';


그러나 영감을 받지 못한 다음 예와 같이 배후에서 일어나는 일이 있는 경우 이와 같은 확인이 필요한 경우가 있을 수 있습니다.

    if (! $user->canPost()) {
        ...
        return false;
    }

    ...
    $this->updateUserPermissions();

    // You might want to keep this check
    // even if you've checked at the top
    if ($user->canPost()) {
        return true;
    }


Rector와 같은 도구는 발생하는 기본 마법을 마술처럼 이해하지 못하고 단순히 마지막 조건을 제거하도록 제안합니다. 침묵시키려면 다음 주석을 추가하기만 하면 됩니다.

/** @noRector \Rector\DeadCode\Rector\If_\RemoveAlwaysTrueIfConditionRector */
if ($user->canPost()) {
    return true;
}


죽은 코드는 여기까지입니다. 당신은 그것을 죽였다. 전체 코드베이스에서 PHP 8.1 이상auto-importing class names의 업데이트된 구문을 사용하는 것과 같이 Rector가 당신을 위해 캐스팅할 수 있는 다른 주문에 대해서도 게시했습니다. 체크아웃their site, 그들은 매주 리팩토링을 추가합니다 🏠🔥.

좋은 웹페이지 즐겨찾기