if-then-else가 너무 많아 코드를 읽을 수 없게 되는 경우 DRY(반복하지 마세요) 원칙을 어떻게 준수해야 할까요?

StackOverflow https://stackoverflow.com/questions/937225

문제

나는 Don't-Repeat-Yourself 원칙을 고수하고 싶지만 때로는 HTML 및 CSS와 함께 PHP를 작성할 때 동일한 코드를 다른 상황에 재사용하면 곧 내 코드에 다음과 같은 경우가 너무 많아질 것입니다. 그렇지 않으면 코드를 쉽게 유지 관리할 수 없습니다.

대부분의 코드 편집기가 일치하지 않기 때문에 템플릿 엔진인 Smarty를 사용하는 경우 이는 더 큰 문제가 될 수 있습니다. {if} {else} {/if} 따라서 프로그래머는 일치하는 태그를 시각적으로 찾아야 하며 쉽지 않습니다. 중첩된 {if} {else} {/if} 수준이 3~4개 있는 경우.

이러한 상황에서 DRY를 고수하면서도 유지 관리가 가능한 코드를 유지할 수 있는 방법이 있습니까?

도움이 되었습니까?

해결책

전체 프레임워크가 부족하기 때문에 제가 콘텐츠에 대해(논리가 포함되어 있더라도) 하는 경향이 있습니다. 그것을 분리하다 파일에 추가하고 또 다른 논리적 평가를 사용하여 파일을 병합한 다음(mangle) 그 후 템플릿 논리를 평가합니다.이는 콘텐츠를 청크화하고 공통 상태에서 청크를 공유/재사용 가능하게 만듭니다.

이런 방식으로 각 최종 템플릿 버퍼는 디스크나 데이터베이스에 저장할 수 있는 재사용 가능한 개별 콘텐츠 너겟의 평면화된 트리입니다.다음을 대체하는 작은 파서만큼 간단한 것조차도:

<h1>{{insert:shared_page_header}}</h1>

와 함께 shared_page_header.txt 사물을 분리하는 데 도움이 됩니다.또한 템플릿에 포함된 논리에서도 우려 사항에 대한 분리를 확인해야 합니다. 관리 가능하고 재사용 가능한 모든 덩어리(동적이든 아니든) 항상 가야 할 길입니다.템플릿은 평가될 때까지 문자열일 뿐이므로 다음과 같이 처리하세요. 공유 구성 요소가 병합되었습니다. big-dirty-string(TM)으로 변환한 다음 평가합니다.

행운을 빌어요

다른 팁

더 많은 정보를 얻을 수 있도록...코드 작성에 어떤 프로그램을 사용하고 있나요?

같은 말을 반복하지 않기 위한 팁:

일종의 템플릿을 사용하십시오. 이렇게 하면 각 페이지에 콘텐츠를 표시하기 위해 코드를 반복할 필요가 없습니다.즉.20페이지로 구성된 사이트가 있고 레이아웃을 변경하기로 결정한 경우 20페이지를 모두 변경하고 싶지는 않습니다.

기능을 사용하세요. 특정 작업을 수행하는 코드가 있는 경우 프로그램/페이지 전체에 걸쳐 해당 코드를 여러 번 작성하지 마세요.함수를 만든 다음 해당 작업을 수행해야 하는 각 지점에서 함수를 호출하세요.이렇게 하면 변경해야 하는 경우 해당 함수 하나만 수정하면 되며 해당 작업을 수행한 모든 위치를 찾기 위해 코드를 검색할 필요가 없습니다.클래스와 메소드(메소드는 클래스의 함수임)에 대해 알고 있다면 많은 작업에 대해 데이터 캡슐화를 제공하고 나중에 클래스를 포함할 수 있도록 관련 기능을 그룹화할 수 있으므로 훨씬 더 좋습니다. 필요에 따라 프로젝트를 진행합니다.

if/else 문이 많고 코드를 읽기가 쉽지 않아 어려움을 겪고 있다면 다음과 같이 할 수 있습니다.

1.새로운 편집기를 사용해 보세요. 코드 폴딩은 필수입니다.일부 편집기에는 들여쓰기된 코드를 강조 표시하고 일치시키는 수직선이 있어 무엇이 무엇과 어울리는지 알 수 있습니다.괜찮은 무료 편집기를 원한다면 이 두 가지 기능을 모두 갖춘 Notepad++를 추천합니다(Google에서 검색해 보세요. 여기에 링크를 추가할 수 없습니다).

2.중첩된 if 문 수를 줄이는 데 사용할 수 있는 기술이 있습니다.

예(이 코드):

if (item1 == true) {
   if (item2 == true) {
      item3 = 5;
   }
   else {
      item3 = 10;
   }
}
else {
   if (item2 == true) {
      item3 = 15;
   }
   else {
      item3 = 20;
   }
}

다음과 같이 평면화할 수도 있습니다.

if (item1 == true && item2 == true) {
   item3 = 5;
}
else if (item1 == true && item2 == false) {
   item3 = 10;
}
else if (item1 == false && item2 == true) {
   item3 = 15;
}
else {
   item3 = 20;
}

따라서 3~4개 수준의 중첩된 if/else가 있고 이를 평면화하려는 경우 위와 같은 여러 인수를 사용하면 코드를 더 읽기 쉽게 찾을 수 있습니다.그것은 똑같은 일을 하며, 어떤 방식으로 하느냐는 단지 선호의 문제일 뿐입니다.

논리(PHP로 가정)와 디스플레이(HTML/CSS로 가정)를 혼합하지 마십시오. 항상 쉬운 일은 아니지만 템플릿과 CSS를 사용하면 가능합니다.환영 메시지로 사용자 이름을 표시하는 홈 페이지에서 이 작업을 수행할 수 있는 방법에 대한 실제적인 예를 들어 보겠습니다.

인라인 PHP(피하십시오):

<html>
   <body>
      <?php
      if ($logged_in == true) {
         echo "Welcome ",$user->name(),"!";
      }
      else {
         echo "Welcome Guest!";
      }
      ?>
   </body>
</html>

디스플레이와 분리된 로직(더 좋음):

<?php
if ($logged_in == true) {
   $greetingMessage = "Welcome ",$user->name(),"!";
}
else {
   $greetingMessage = "Welcome Guest!";
}
?>

<html>
   <body>
      <?php echo $greetingMessage; ?>
   </body>
</html>

^ 로직을 뷰(HTML)와 별도로 유지하면 프로젝트가 정말 복잡해지기 시작할 때 당황하지 않는 데 도움이 됩니다.섞지 않는 것이 가장 좋습니다!:)

행운을 빕니다!

질문의 첫 번째 문장이 문제입니다. IMO입니다.실제로 뷰와 코드를 혼합해서는 안 됩니다(예:HTML과 CSS).이를 방지하는 데 도움이 되는 여러 PHP MVC 프레임워크가 있습니다.Zend 프레임워크는 꽤 괜찮지만 다른 프레임워크도 있습니다.

프레임워크를 사용하고 싶지 않다면 이와 같은 코드를 사용하지 않고 백엔드에서 개체를 호출하도록 페이지를 리팩터링하는 것이 좋습니다.코드와 뷰를 혼합하면 빠르게 유지 관리가 불가능해집니다. 어느 PHP뿐만 아니라 언어.

지금은 PHP를 사용하여 OOP 개념을 구현하는 데 익숙하지 않을 수도 있지만 중첩된 if-else 문을 리팩토링하고 이를 이름이 잘 지정된 함수에 배치하면 DRY 원칙을 유지하는 데 많은 도움이 됩니다.게다가 DRY 원칙을 고수하면 코드를 유지 관리할 수 있습니다.

예제 스크립트 파일을 사용하면 어디에서 잘못되고 있는지 지적하는 것이 훨씬 쉬울 것입니다. 그러나 달성하려는 목표에 따라 도움이 될 수도 있고 그렇지 않을 수도 있는 몇 가지 사항이 있습니다.

  • 살펴보기 제어 구조의 대체 구문.어떤 사람들은 주로 HTML을 포함하는 파일을 작성할 때 이 스타일을 사용하는 것을 선호합니다. PHP는 출력할 HTML 섹션을 결정하는 데에만 사용됩니다.

  • 재사용 가능한 코드 섹션을 나중에 포함할 수 있는 파일로 분할합니다.header.php, footer.php 등

  • 코드 접기를 지원하는 IDE 사용

행운을 빌어요

문이 논리 문으로 간주되는 경우 MVC 원칙을 위반하므로 가능한 한 피해야 합니다.

대신 도우미 보기로 전환하세요. 예를 들면 다음과 같습니다.

class LoggedUsernameHelper
{
    protected $user;

    public function __construct(SomeUserObject $user)
    {
        $this->user=$user;
    }

    public function __toString()
    {
        return $user->isLogged() ? sprintf('Welcome %s', $user->getUsername()) :
            'Welcome guest';
    }
}

이 코드는 재사용 가능하고 테스트 가능하며 코드를 건조하게 유지합니다 :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top