리팩토링 #8: 죽은 것은 절대 실행되지 않을 수 있습니다.
7548 단어 laravelrefactoringphpwebdev
다음은 죽은 코드 조각의 매우 노골적인 예입니다.
{
$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, 그들은 매주 리팩토링을 추가합니다 🏠🔥.
Reference
이 문제에 관하여(리팩토링 #8: 죽은 것은 절대 실행되지 않을 수 있습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/genijaho/refactoring-8-what-is-dead-may-never-run-ca4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)