2014-05-14 4 views
1

저는 현재 PHP와 OOP에 대해 전반적으로 더 잘 이해하기 위해 개인 프로젝트를 조금만 개발 중입니다. 기본적으로 게시물을 만들고 태그를 지정할 수있는 작은 앱을 만들고 있습니다.잘못된 인수로 객체를 인스턴스화하는 것을 피하십시오.

클래스는 지금까지 다음과 같이 구성되어 있습니다

  • 포스트
    데이터베이스에 게시물을 나타냅니다, 그리고 등 editPost(), attachTag(),

  • 태그와 같은 기능을 가지고있다
    데이터베이스의 태그를 나타내고 유사하게는 editTag(), e 이 관리 인터페이스처럼, 새 게시물과 태그를 생성/삭제하는 데 사용됩니다있다 TC.

  • PostUtils
    목록 그들, 이제 등

, 나는 인스턴스를 새 게시물 개체는 게시 ID를 필요한 인수로 전달하여 처리합니다. 그렇게 할 때 ID가 유효한지 먼저 확인할 수 있기를 원합니다. 지금까지 PostUtils 클래스 (isValidID($id))의 메서드를 사용하여이 작업을 수행 했으므로 컨트롤러는 Post 클래스가 인스턴스화되기 전에 검사를 수행 할 수 있습니다. 그러나, 나는 Tell, Don't Ask 원리에 대해 읽었으며, 나는 Post 클래스 자체 내에서이 검사를 수행해야만한다.

이상적으로는 유효한 ID가 전달 될 때만 개체를 ​​인스턴스화하는 것이 좋습니다. 그래서 내 질문에, 유효하지 않은 ID가 대신 전달 될 때 클래스에 가장 적합한 동작은 무엇입니까? 이것은 전혀 이해가 되니? 또는 내 전체 아키텍처를 시작하여 변경해야합니까?

이 당신의 시간을 주셔서 감사합니다, 그것은 정말 :)

+1

필요한 데이터가 없거나 유효하지 않은 경우 개체를 만들지 않으려면 정적 팩터 리 메서드를 만들어야합니다 'Post' 클래스에서. ['DateTime :: createFromFormat'] (http://us.php.net/manual/en/datetime.createfromformat.php)이 어떻게 작동하는지와 비슷합니다. –

+0

정확하게 이해한다면 공장 방법 설계 패턴을 조사해야합니다. 의견을 보내 주셔서 감사합니다! – finferflu

답변

3
<?php 
public class Post 
{ 
    private function __construct($id) 
    { 
    /* Private constructor... do your normal initialization here */ 
    } 

    private static function isValidID($id) 
    { 
    if (/*... check if $id is valid ... */) { 
     return true; 
    } 
    return false; 
    } 

    public static function create($id) 
    { 
    if (!self::isValidID($id)) { 
     return NULL; // Or throw an exception 
    } 

    return new Post($id); 
    } 
} 
?> 

을 감사합니다 그리고 당신은 같이 사용할 것이다 : 당신이 예외를 던져 선택한 경우

<?php 
    $post = Post::create(1234); 

    if (is_null($post)) { 
    /* Invalid ID */ 
    } 
?> 

또는 :

<?php 
    try { 
    $post = Post::create(1234); 
    } catch (YourInvalidIDException $e) { 
    /* Invalid ID */ 
    } 
?> 
+0

감사합니다. 이것은 나에게 많은 의미가 있습니다! – finferflu

+0

@kingkero - updated (twice ...) thanks. 감사합니다. –

+0

@SeanBright 환영합니다. Tbh 내가 그런 것들을 직접 편집해야만하는지 모르겠다. 결국 위의 Wiki 측면이 될 것이다. – kero

관련 문제