2013-12-22 2 views
1

클래스가 User이고 클래스가 UserFactory (공장 패턴)입니다. 팩토리는 SQL에 연결하고 사용자 객체의 인스턴스를 생성합니다.이상적으로 속성을 할당하는 클래스는 User 또는 UserFactory입니까?

우리는 종종 데이터베이스에서 검색된 필드를 사전 처리해야하므로 어느 것이 가장 적합한 지 궁금합니다. User 객체가 실제 처리를 수행이 예에서는

class UserFactory { 
    function getUserByID($id) { 
     $q = $this->DB->query("SELECT id, name, email FROM user WHERE id = ?", $id); 

     if(!$q) 
      return FALSE; 

     return new User($q); 
    } 
} 

class User { 
    function __construct($obj) { 
     if(!empty($obj->id)) $this->ID = (int) $obj->id; 
     if(!empty($obj->name)) $this->name = $obj->name; 
     if(!empty($obj->email)) $this->email = $this->verifyEmail($obj->email); 
    } 
} 

을,하지만 난 아직도 내가 디자인이 UserFactory을하면서 User 객체의 실제 SQL 필드 이름을 사용하도록 강요하고있어 얼마나 싫어 예를 들어 (간체) SQL과 PHP 사이의 계층이 될 수 있습니다.

그래서 나는 그렇게 같이 UserFactory에 처리를 움직일 수 :

class UserFactory { 
    function getUserByID($id) { 
     $q = $this->DB->query("SELECT id, name, email FROM user WHERE id = ?", $id); 

     if(!$q) 
      return FALSE; 

     $user = new User($q->id); 
     $user->setName($q->name); 
     $user->setEmail($q->email); 

     return $user; 
    } 
} 

class User { 
    function __construct($id) { 
     $this->ID = (int) $id; 
    } 

    function setName($name) { 
     $this->name = $name; 
    } 

    function setEmail($email) { 
     $this->email = $this->verifyEmail($email); 
    } 
} 

을 내가 지금은 추가 기능을 만들고있어 제외하고,이 일을 할 수있는 좋은 방법이 될 것 같아요 불필요한 것 같다 각 속성에 대한 호출 , 나는 각각의 UserFactory 함수를 사용하여 수동으로 속성 목록을 설정해야합니다.

이상적으로이 필드를 처리하여 개체에 할당하는 것이 좋을까요? '받아 들여지는 길'은 무엇입니까? 각 속성에 대한 설정자를 만들거나 User 클래스 생성자에 여러 개의 인수를 추가할까요 ... 귀하의 아이디어를 듣고 싶습니다.

는 (나는이 '이상적인 코드 스타일의 질문은 주관적 일 수 있습니다 알고 나는이 어떤 커뮤니티 가이드 라인을 위반 아니에요 바랍니다.)

+0

당신은 사용자 생성자 당신 추상적 인 수 필드 이름에 각 속성에 대한 다른 매개 변수가 있다면. –

답변

1

UserFactory 정말 공장 클래스하지만 Data Mapper 없습니다.

두 번째 예제는 도메인 모델이 데이터베이스에 대해 전혀 모르기 때문에 올바르다. 또한 Table Data Gateway과 결합 할 수도 있습니다. 이 주제에

더 : http://richard.jp.leguen.ca/not-blog/why-use-table-data-gateways/

+0

좋은 콜, 나는 그것이 공장과 데이터 매퍼 인 것 같은데. 나는 능력에 따라 다른 사용자 등급을 가지고있다. 'UserAdmin','UserAuthor' ... – Robbert

+0

사용자가 수십 개의 필드를 가지고 있다면 어떻게 될까요? 각 속성에 대한 세터를 만들거나 모든 처리를 한 번에 처리 할 별도의 함수를 만들겠습니까? – Robbert

+1

좋은 방법 중 하나는 젠드 프레임 워크의 권장 사항입니다. 모든 필드를 가진 배열을 취하는'setOptions' 메쏘드가 있습니다. [모델 및 데이터베이스 테이블 만들기] (http://framework.zend.com/manual/1.12/en/learning.quickstart.create-model.html). (중간까지 아래로 스크롤하십시오) – bitWorking

관련 문제