어떻게 정적 분석 도구인 Psalm을 사용하여 코드의 질을 높입니까
소개
주제에 들어가기 전에 먼저 몇 가지 일을 분명히 합시다.'시편'은 일부 종교를 암시할 수 있지만, 그것은 단지 도구 이름일 뿐, PHP 정적 분석 기계의 줄임말이다.이것은 PHP 개발자를 위해 준비한 것이다. Vimeo 팀이 제작한 것이다. 그들realised some 5 years ago은 코드를 생산 환경에 발표하기 전에 차단되지 않은 버그와/또는 오류를 발견하는 데 도움을 줄 수 있는 도구를 사용할 수 있다.
코드 품질 도구
코드를 개선하는 모든 도구는 코드 품질 도구로 분류할 수 있다.Bornfight에서는 PHP를 사용하여 개발할 때 몇 가지 방법을 사용했습니다.
PHPCSFixer - 전체 프로젝트에서 단일 인코딩 표준을 구현하는 데 사용되는 인코딩 표준 수정기
PHPCPD - 중복 코드 감지를 위한 복사/붙여넣기 탐지기
PHPMD - 혼란 탐지기, 청결 코드, 코드 크기, 명칭 등 분야의 규칙을 집행하는 데 사용
PHPStan - 정적 분석 도구, 시편과 유사
정적... 뭐?!
그럼'정태 분석 기모기'?이것은 매우 유력한 글자들이다.정적 분석은 분명히 그것이 어떤 것을 분석한다는 것을 의미한다. 이 예에서 우리의 코드이지만 실행하지 않는다.'lint'라는 단어는 인터넷에서 여러 가지 정의가 있는데 그 중 하나는 소프트웨어와 무관한 정의가'주머니나 배꼽에 쌓인 희미한 털'이라는 것을 발견했다.좋아, 이 느낌은 해석에 도움이 되지 않지만, 어쨌든 나는 그것을 사용해 보겠다.코드를 작성할 때, 우리는 가능한 한 버그가 발생하지 않도록 해야 한다.그러나 우리가 아무리 노력해도 시간의 추이에 따라 이를 제품에 발표하기 전에 코드 라이브러리(pocket)는 차단되지 않은 버그(접착된 모호한 털)를 축적했다.우리는 코드 라이브러리와 주머니를 정리하기 위해 노력해야 한다.
이것이 바로 《시편》이 개입하여 우리가 이 점을 할 수 있도록 도와주는 곳이다. (적어도 코드 라이브러리에 대해 말하자면, 우리는 여전히 스스로 주머니를 정리해야 한다.)
기능 좀 주세요.
시편과 정태 분석 도구에 관한 몇 가지 문제를 정리한 후에 우리는 여전히 자신에게 그것이 어떤 오류나 가능한 오류를 발견했는지 묻고 있다.좋아, PHP를 사용하여 개발하는 것은 즐겁지만, 중요한 것은 그것의 장단점을 알아야 한다는 것이다.번역 언어가 아니라 해석 언어이기 때문에 형식을 강제로 실행하지 않습니다.
다음은 간단한 작업 코드 예입니다.
function doubleTheNumber($number) {
return $number * 2;
}
$number = 5;
echo doubleTheNumber($number);
하지만 유형 힌트를 사용하여 작성할 수도 있습니다.function doubleTheNumber(int $number): int {
return $number * 2;
}
$number = 5;
echo doubleTheNumber($number);
두 번째 방법은 더욱 안전하다. 왜냐하면 유형 힌트가 있기 때문에, 우리는 비정수치를 함수에 전달하는 것을 허락하지 않지만, 만약 우리가 함수의 반환값을 사용해야 한다면, 우리는 그것이 정수일 것이라고 확신한다.만약 우리가 빈 그룹을 전달한다면, 시를 실행하면 다음과 같은 내용을 알려줄 것이다.
ERROR: InvalidArgument - 8:22 - Argument 1 of doubleTheNumber expects int,
array<empty, empty> provided - https://psalm.dev/004
멋있죠?유형 검사는 그 가장 중요한 기능이다.문제는 전용 페이지에 대한 링크 (이 예는 psalm.dev/004 와 설명 및 수정 도움말도 포함합니다.오류를 조사하고 해결함으로써 우리는 실제적으로 어떻게 더 좋은 코드를 작성하는지, 그리고 PHP와 프로그래밍에서의 불량한 방법을 배우고 있다.기존 코드 라이브러리에 Psalm을 추가하는 것을 고려하지만, 형식과 관련된 오류가 너무 많을 것 같으면 해결 방안이 하나 더 있습니다.그 중의 한 특징은 시편이라고 한다.이것은 부족한 형식 힌트를 추가하거나 사용하지 않은 변수나 함수와 같은 죽은 코드를 삭제하는 등 발견된 많은 문제를 복구할 수 있다.
또 다른 상황은 코드 라이브러리가 방대해 모든 문제를 해결할 시간이 없다는 것이다.그러나 이것은 오류 코드를 계속 작성해야 한다는 것을 의미하지는 않습니다.이것이 바로 기선 특성의 작용입니다. 모든 오류를 발견할 수 있도록 합니다.모든 오류를 파일에 저장하고 더 이상 언급하지 않지만, 베이스라인을 활성화한 후 작성한 새 코드에서 발생하는 모든 오류를 표시합니다.
《시편》은 많은 유형의 오류를 검사하였는데 이것은 개발자의 지식과 다른 요소에 달려 있기 때문에 이 모든 오류를 처리하는 것은 매우 어려울 것이다.이것이 바로 엄격한 등급의 용무의 땅이다.8개의 엄격한 등급이 있는데 그 중에서 첫 번째 등급이 가장 엄격하다.등급이 엄격할수록 오류 유형이 많고, 반대로도 마찬가지다.
때때로 전체 디렉터리를 분석에서 제외하거나 특정 방법의 특정 유형 오류만 배제해야 한다.이것은 설정 파일에서나 docblock을 통해 오류를 억제할 수 있습니다.
다음은 후자의 예입니다.
class Foo {
private string $bar = 'bar';
public function getBar() : string {
return $this->bar;
}
}
$a = new Foo();
/** @psalm-suppress UnusedMethodCall */
$a->getBar();
어떤 수준의 엄격함도 일반적으로 다음과 같은 상황을 초래할 수 있다.ERROR: UnusedMethodCall - 12:5 - The call to Foo::getBar is not used
하지만 억제되기만 하면 언급되지 않는다.Psalm은 대량의docblock 주석을 지원하기 때문에 이를 사용하여 Psalm의 유형 검사 기능을 충분히 이용하는 것이 매우 중요하다.그것은 심지어 자신의 주석이 있는데, 이를 템플릿과 단언 주석이라고 부른다.지금까지의 연구를 통해 나는 그들이 이 도구의 중요한 구성 부분이라고 생각한다. 아마도 내가 그들에게 더 많은 테스트를 한 후에 그들은 자신의 블로그 글을 가져야 할 것이다.
결론
비유형화 코드를 보유하는 것은 현재 가능하지만, 개발자로서 시종일관 앞을 내다봐야 한다는 것을 의미한다.이런 코드 라이브러리에서 어떤 새로운 코드를 작성해도 더욱 긴장되고 무섭다. 특히 프로젝트의 새로운 개발자들에게는.코드 라이브러리가 점점 커지면서 예측할 수 없는 오류가 점점 많아지고 있기 때문에 정적 분석 도구(예를 들어 Psalm)를 도입하면 이런 문제들을 해결하는 데 매우 도움이 될 것이다.
그 밖에 코드 라이브러리에서 시편 문제와 경고를 처리함으로써 개발자들은 더욱 좋고 유지보수가 가능한 코드를 어떻게 작성하는지 배우고 있다. 이것은 모든 개발자들이 노력해야 할 것이다.더 적은 버그는 더 즐거운 고객을 의미하는 것을 잊지 마라. 이것은 상업에서 얼마나 중요한가!
만약 이 문장이 당신에게 유용하고 시편에 대한 더 많은 정보를 알고 싶다면 저에게 알려주세요.《시편》에 대해 더 많은 연습을 한 후에 나는 그것의 더욱 깊은 용법에 관한 글을 쓰거나 그것을 PHPStan과 비교하여 그것이 어디로 향할지 볼 수 있다고 생각한다.
그럼 너는?
당신은 이 문제에 대해 어떤 견해를 가지고 있습니까?만약 당신이 시편이나 다른 정적 분석 도구에 대해 특별한 경험을 가지고 있다면, 나는 당신이 그것에 대한 견해를 듣고 매우 기쁩니다. 그러므로 언제든지 아래에 논평을 남겨 주십시오.)
Reference
이 문제에 관하여(어떻게 정적 분석 도구인 Psalm을 사용하여 코드의 질을 높입니까), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/bornfightcompany/how-to-improve-your-code-quality-with-psalm-a-static-analysis-tool-419d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)