간단해진 깨끗한 코드 - 3부

내 마지막 게시물과 Clean Code Made Simple에 추가하여,
이 게시물에서는 Robert C. MartinClean Code book 기술을 계속 소개할 것입니다.

#11 데메테르의 법칙

위키백과에서는 다음과 같이 말합니다.

The Law of Demeter (LoD) or principle of least knowledge is a design guideline for developing software, particularly object-oriented programs. can be succinctly summarized in each of the following ways:

  1. Each unit should have only limited knowledge about other units: only units "closely" related to the current unit.
  2. Each unit should only talk to its friends; don't talk to strangers.
  3. Only talk to your immediate friends.


이제 우리는 데메테르의 법칙에 대한 기본적인 이해를 하였으니, 이를 어기지 않기 위해 다음 구조 중 어느 것이 더 낫다고 생각하십니까?

$ctx->getAbsolutePathOfScratchDirectoryOption();


또는

$ctx->getScratchDirectoryOption().getAbsolutePath()


잘 논은 좋다. ctx가 객체라면 무언가를 하라고 지시해야 합니다. 내부에 대해 묻지 않아야 합니다.

(해당 모듈에서) 아래와 같이 outputDir가 필요한 코드와는 거리가 멀다고 생각하십시오.

$outFile = $outputDir + "/" + $className->replace('.', '/') + ".class";
$fout = new FileOutputStream($outFile);
$bos = new BufferedOutputStream($fout);


따라서 ctx 개체에 다음을 수행하도록 지시하면 어떻게 됩니까?

$bos = $ctx->createScratchFileStream($classFileName);


그것은 개체가 하는 합리적인 일처럼 보입니다! 이를 통해 ctx는 내부를 숨길 수 있고 현재 함수가 알아야 할 개체를 탐색하여 Demeter의 법칙을 위반하지 않아도 됩니다.

#12 표준 패턴 이름

해당 패턴을 구현하는 클래스의 이름에 COMMAND 또는 VISITOR 와 같은 표준 패턴 이름을 사용하여 다른 개발자에게 디자인을 간결하게 설명할 수 있습니다.

#13 한 가지 일하기

함수가 "한 가지"이상을 수행한다는 것을 어떻게 알 수 있다고 생각하십니까?

그 대답은 단순히 구현의 재설명이 아닌 이름으로 다른 함수를 추출할 수 있다면 그것이 하나 이상의 일을 하고 있음을 알 수 있다는 것입니다.

그러기 위해서는 함수 내의 명령문이 모두 동일한 추상화 수준에 있는지 확인해야 합니다. 예를 들어getHtml()는 추상화 수준이 매우 높으며,$pagePathName = PathParser::render($pagePath);는 중간 추상화에 있으며,->append("\n")와 같은 것은 추상화 수준이 낮습니다.

#14 기본 클래스 및 파생 상품

개념을 기본 클래스와 파생 클래스로 분할하는 가장 일반적인 이유는 상위 레벨 기본 클래스 개념이 하위 레벨 파생 클래스 개념과 독립적일 수 있기 때문입니다. 따라서 파생물의 이름을 언급하는 기본 클래스를 보면 문제가 있는 것으로 의심됩니다. 일반적으로 기본 클래스는 해당 파생 항목에 대해 아무것도 몰라야 합니다.

물론 이 규칙에는 예외가 있습니다. 파생 상품의 수가 엄격하게 고정되어 있고 기본 클래스에 파생 상품 중에서 선택하는 코드가 있는 경우도 있습니다. 우리는 유한 상태 기계 구현에서 이것을 많이 봅니다. 그러나 이 경우 파생 상품과 기본 클래스는 강력하게 결합되어 항상 함께 배포됩니다. 일반적인 경우 파생 상품과 기반을 별도로 배포할 수 있기를 원합니다.

#15 명명

메소드에는 postPayment, deletePage 또는 save와 같은 동사 또는 동사구 이름이 있어야 합니다.
접근자, 뮤테이터 및 술어는 값에 따라 이름을 지정하고 접두사로 get을 붙여야 합니다.
설정하고 있습니다.

$name = employee->getName();
$customer->setName("mike");
if ($paycheck->isPosted())...


괜찮아. 이 부분에 대한 내용입니다. 내Telegram 채널에 가입하면 최신 게시물에 대한 알림을 받을 수 있습니다. 또한 및 에서 나를 팔로우할 수 있습니다.

좋은 웹페이지 즐겨찾기