2010-07-28 1 views
8

에 돌입 도움, 현재 인터페이스의 구조는 다음과 같다 필요 :, 내 평범한, 독학 PHP 기술을 가진 겸손한 웹 사이트에 일하고 있어요 다음 단계

<?php 
    if (A) { 
    $output = someFunc(A); 
    } else if (B) { 
    $output = anotherFunc(B); 
    } else if (C) { 
    $output = yetAnotherFunc(C); 
    } else { 
    $output = 'default stuff'; 
    } 
?> 
<html template top half> 

<?php echo $output; ?> 

</html template bottom half> 

이것은 처음에는 괜찮 았고, 꽤 잘 조직 된 것처럼 보였습니다.하지만 필요한 기능은 10 배로 커졌으며, 유지 보수가 어려워지고 당황스럽고 혼란에 빠지게되었습니다. 나는 그걸 벗어날 방법을 모르겠습니다.

각 상황에 대해 호출되는 함수가 상당히 잘 작성되고 집중되어 있다고 느끼지만 레이아웃을 생성하고 반환을 처리하는 함수와 사용자 사이의 중간 단계를 처리하는 방법에 대한 손실이 있습니다. .

MVC가 하나의 해결책이라고 생각합니까? 하지만 여기에서 저기로가는 법을 이해하는 데 어려움을 겪고 있습니다 ...

위의 코드가 묻는 두통이나 불쾌한 기억에 사과드립니다. 시간 내 주셔서 감사합니다.

+3

+1 '두통이나 위의 코드가 표시 한 불쾌한 기억에 대한 +1 : D – karim79

+1

1 단계 : 휴식 ... – ChaosPandion

답변

5

많은 사람들이하는 길을 시작한 것 같습니다. 계속 커지는 if 및/또는 case 문. 모든 "if"수표에는 시간이 걸릴 수 있습니다. MVC는 확실히 좋은 방법이지만이를 구현하는 데는 여러 가지 방법이 있습니다. 나는 MVC에서 일반적으로 사용되는 Front Controller 디자인 패턴을 살펴볼 것을 권장합니다.

작업 수행 방식을 변경하는 한 가지 방법은 연관 배열을 사용하여 정의 된 "동작"목록으로 전환하는 것입니다. 그리고 기능을 포함으로 변경하십시오. 그런 다음 여러 함수, 변수 및 기타 처리 코드를 가질 수 있습니다.

$actions = array(
'A'=>'action1.php', 
'B'=>'action2.php', 
'C'=>'action3.php', 
'default'=>'action_default.php' 
); 
if (isset($actions[ $_GET['action'] ])) { 
    include($actions[ $_GET['action'] ]); 
} else { 
    include($actions['default']); 
} 

"색인"파일은 거의 전방 컨트롤러 개념 인 라우팅 도구입니다.

+0

'require '대신'include '를 사용하는 이유가 궁금합니다. 그 뒤에 어떤 이유가 있습니까? – icktoofay

+0

require는 파일이 누락되면 치명적인 오류를 발생시키고 경고를 포함합니다. –

0

일반적인 제안 : Smarty을 보셨습니까? 나는 그것이 꽤 유용한 템플릿 엔진이라는 것을 알았다. 아마도 약간의 학습이 필요하지만 장기적으로는 가치가있을 수 있습니다.

4

모든 객체 지향 코드에서 일련의 if/else 또는 case 문을 볼 때마다 if/else/else 일 경우 묶음이 아닌 객체 계층 구조가 더 잘 처리됩니다.

특별한 경우에는 A, B 및 C에 대해 서로 다른 3 개의 클래스가있을 수 있습니다. 단 하나의 $ obj-> doit() 메소드를 호출하십시오. A, B 및 C는 각각 doit() 메소드의 구현이 서로 다릅니다.

마음껏 벗어나고 싶다면 디자인 패턴에 대한 책을 읽어 보는 것이 좋습니다. 다음은 PHP에서 디자인 패턴의 몇 가지 예입니다 : http://www.fluffycat.com/PHP-Design-Patterns/

문제의 특정 형식에 대한 당신에게 특별한 관심을 가질 수있는 패턴입니다

  • 전략.
  • 명령.
  • 공장.

위의 링크에는 PHP 예제를 사용한 이러한 패턴에 대한 설명이 나와 있습니다. 나는 다른 곳에서 디자인 패턴에 대해 더 많이 읽으라고 권하고 싶지만 그 링크에는 PHP 예제가있다.

저는 실제로 그 중 3 가지를 함께 사용하여 설명하는 것과 유사하거나 동일한 상황에서 코드를 정리할 수 있습니다. 그것은 다음과 같이 작동합니다 : - 전략. 이것은 마치 쿠키 커터 (cookie-cutter) 또는 매드 립 (Mad Libs) 스타일과 같습니다. 기능을 수행하는 데 필요한 기본 사항을 설정합니다. 사용자 (기본 클래스를 사용하는 프로그래머)는 필요한 경우 특정 작업을 무시할 수 있지만 작업을 수행하기위한 기본 사항은 모두 마련되어 있습니다. 예 : 비즈니스 프로세스를 수행해야합니다. 일반적으로 트랜잭션 시작, 작업의 "고기"수행, 정리 및 로깅 수행이 포함됩니다. 여기에 Stragegy/cookie-cutter 패턴을 사용하는 것은 과장된 것 같지만 코드의 "고기"에 오류나 예외가 발생하더라도 정리 작업을해야합니다. Strategy/cookie-cutter 패턴을 사용하면 최소한의 상용구/반복 코드로 모든 작업을 수행 할 수 있습니다.

  • 명령 : 위에서 언급 한 전략 패턴의 아이디어와 결합하면 실제 작업을 수행하는 함수에 상용구 코드가 적어집니다.

  • 공장. 팩토리 메서드를 사용하여 직면 한 상황에 적합한 명령을 생성합니다.

이러한 3 가지 디자인 패턴은 이러한 상황에서 매우 잘 작동하며, 결코 반복하지 않는 매우 깨끗한 코드로 이어질 수 있습니다.

아래의 maschka는 Smarty를 사용하는 것이 좋습니다. 이는 합리적인 아이디어입니다. 응용 프로그램에 따라 MVC 프레임 워크를 사용하는 것이 좋습니다. PHP를 고수한다는 아이디어에 전념한다면 CakePHP를 권하고 큰 성공을 거두었습니다. 그것은 당신이 아주 좋은 방법으로 코드를 배치하고 문제를 해결하는 데 도움이됩니다.