2017-11-10 28 views
-1

나는 최신 OOP 디자인 패턴을 따라 자신 만의 MVC 프레임 워크를 만들려고 노력하고있다. 필자는 궁금한 점은 반복 가능한 코드를 배치하는 가장 좋은 방법은 무엇인지 (유틸리티 클래스에서 고정 패턴으로 유지하는 데 사용됨) 좋은 패턴이 아닌 것으로 간주합니다.유틸리티 클래스가 안티 패턴 인 경우 PHP의 대안은 무엇입니까?

예를 들어, 도트로 구분 된 문자열을 사용하여 다차원 배열을 탐색하려고합니다.이 알고리즘을 여러 클래스 (다른 기본 클래스의 하위 클래스)에서 활용해야합니다. 유틸리티 클래스를 사용하지 않고 같은 코드를 여러 번 반복하지 않고 어떻게 할 수 있습니까?

답변

2

유틸리티 클래스에는 아무런 문제가 없습니다. 관련없는 유틸리티 기능을 하나의 거대한 클래스로 정리하지 마십시오. 그들이하는 일로 분리하고 (네임 스페이스). 예를 들어 Zend Filter 또는 Symfony Filesystem을 참조하십시오.

또는이 함수가 필요한 클래스가 모두 공통 부모 인 경우 함수를 맨 위 클래스 나 요약에 넣을 수 있습니다.

또는 클래스에 공통 부모가없는 경우 extractArrayFromDottedString() 또는 이와 비슷한 메서드를 사용하여 특성을 만들 수 있습니다.

+0

문제가 있거나 특성으로 해결할 수있는 경우 잘못된 문제를 해결할 수 있습니다. 또한, 단지 공유 부모로부터 확장하여 중복 코드를 격리하는 것은 (실제로 유혹적이지만) 나쁜 생각입니다. 종종 코드가 리팩토링되어야하고 모든 특수 클래스에 공통적 인 종속성을 추출해야한다는 표시가 더 자주 나타납니다. –

-1

Laravel은 독립 실행 형 "도우미"기능을 정의하여이 작업을 수행합니다. CakePHP와 Yii는 정적 메소드로 컨테이너 유틸리티 클래스 (예 : "Text"또는 "Xml")를 정의하여이를 수행합니다. 프로그래밍 언어는 PHP의 implode(), Java의 Math.round, C의 strcpy, 파이썬의 sum() 등과 같은 유사한 기능을합니다. 거의 모든 것이 독립 실행 형 함수 또는 정적 클래스 메서드를 사용합니다.

궁극적으로 가장 좋은 선택은 주관입니다. 방법에 따라 다릅니다 물건을 구조하고 싶습니다. PHP에서 일반적인 디자인 패턴을 연구하고 실제로 다른 프레임 워크가 느끼는 느낌을 얻으십시오. 그런 다음 접근 방식을 선택하고 일관성을 유지하십시오.

0

유틸리티 클래스는 안티 패턴을 정말

없습니다.
OOP에서 유틸리티 클래스를 사용하여 전체 응용 프로그램을 디자인하는 것은 대개 반 패턴이지만 루틴/가로 작업을 제공하는 유틸리티 클래스를 정의하는 것은 의미가 있습니다.

유틸리티 메소드를 소비하는 기존 클래스의 메소드와 유틸리티 메소드를 섞어 사용하면 유틸리티 클래스 및 소비자 클래스의 결합력과 재사용 성이 향상 될 수 있습니다.

물론 대안으로 인스턴스 메소드를 사용하여 클래스를 정의 할 수 있습니다.
이 방법은 유효하지만보다 자세한 것은 있지만 클래스 테스트 가능성을 향상시키는 이점이 있습니다. 호출을 조롱하거나 유틸리티 메소드에 대한 다른 구현으로 전환하려면 인스턴스 메소드를 선호해야합니다.

1

유틸리티 함수 인 경우 별도의 네임 스페이스에 정의하십시오.

<?php 
namespace Utils; 

function array_query($array, $query) { 
    // code for traversing the array 
} 

하나 이상의 파일에 넣어두면 좋습니다. 해당 파일을 앱의 부스트랩 단계에 포함시키는 것을 잊지 마십시오.

하단 : 정적 클래스를 악용하는 것을 중지하려면 해당 sh * t의 네임 스페이스가 있어야합니다.

그러나 "유틸리티 기능"이라고 생각하는 것이 전부는 아닙니다. OOP 코드를 사용하기 시작하면 일부 코드는 연관된 클래스로 이동해야합니다. "이메일 확인"은 "유틸리티 기능"에 가야하지만, 안 예를 들어, 클래스 : 다음 입력 - 힌트 수

class EmailAddress { 

    private $emailAddress; 

    public function __construct($emailAddress) { 
     $this->assertValidEmailAddress($emailAddress); 
     $this->emailAddress = $emailAddress; 
    } 

    private function assertValidEmailAddress($emailAddress) { 
     if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { 
      throw new DomainException("Not an email address"); 
     } 
    } 

    public function __toString() { 
     return $this->emailAddress; 
    } 
} 

그리고 분리 된 실체에 가야한다 반복 "도메인 로직"조각 이런 종류의, 다른 클래스들에 대해서. 당신의

public function register(EmailAddress $email, SafePassword $password): User 
{ 
    // your user registration logic 
} 

이 방법은 다양한 서비스 활동을 수행 할 수 있습니다 당신이 개선 확인을 위해 try-catch를 사용 : 그런 다음 당신은 어딘가에을 사용합니다.

P.
자신이하는 일에 대해 자세히 살펴볼 필요가있을 수 있습니다. 그 점선 액세스 유틸리티는 (나는 10 년 전에도 마찬가지였다.) 실제로는 더 깊은 문제에 대한 "임시 수정"이다 : 당신은 그것들을 액세스하는 것을 단순화 할 필요가있다.