2009-12-10 5 views
2

객체를 어떻게 디자인하면 객체 사용자와 객체 access_role이 있다고 말할 수 있습니다. 사용자는 SQL 데이터베이스의 사용자 테이블에 저장되며 access_role은 user_id를 알고 SQL 데이터베이스에 저장됩니다.객체 디자인 - SQL을 사용하는 PHP의 사용자 및 액세스 역할

class user() { 

    protected $_name; 
    protected $_id; 
    protected $_age; 
    protected $_password; 

    public function getName(); 
    public function getId(); 
    public function getAge(); 
    public function getPassword(); 

    public function setName(); 
    public function setId(); 
    public function setAge(); 
    public function setPassword(); 

    //sql query 
    public function read(){}; 


    } 

    class accessRole { 

    protected $_accessRole; 
    protected $_userId; 

    public function setAccessRole(); 
    public function setUserId(); 
    public function getAccessRole(); 
    public function getUserId(); 

    } 

SQL에서 쿼리를 수행 할 때 사용자의 액세스 역할을 원한다면. 하지만 두 객체를 서로 연결하면 어떻게됩니까?

$u = new User(); 
$u->getAccessRole(); 

이 작동합니까?

답변

4

기본 사용자와 역할 클래스 사이에 중개자가 있으므로이를 구분할 수 있습니다.

$roles = $provider->roles($user); 

이 방법 class userclass accessRole는 해당 속성의 상호 또는 알 필요가 없습니다. class user은 액세스 역할없이 행복하게 살 수 있고 class accessRole은 $ _userId에 바인딩되지 않습니다. 예 : accessRole에 대한 userid는 하루 중 시간대에 따라 무엇입니까? (좋아, 어리석은 예를. 희망을 얻으십시오). 시스템 전반에 걸쳐 모든 특정 (하위) 역할을 수행 할 필요없이 다양한 하위 시스템의 역할을 변환 할 수도 있습니다.

$roles = $provider->convert($rolesBasedOnUser); 

편집 : (희망) 짧은 예 ....
나는 간단한 사용자 클래스를 (더 이상의 인터페이스 또는 추상의 다른 종류) 사용하고 있는데이 어떤 역할이 없다 "클래스" , 단순한 문자열 배열 (간결을 위해). 그러나 마음에 계속 수 있습니다 더 많은 decoupling 할 ... 당신이 원한다면.

class User { 
    protected $id, $name; 
    public function __construct($id) { 
    $this->id = $id; 
    $this->name = 'user #'.$id; 
    } 

    public function getName() { 
    return $this->name; 
    } 
    public function getId() { 
    return $this->id; 
    } 
} 

interface UserRolesProvider { 
    public function roles(User $user); 
} 

이제 사용자 클래스와 UserRolesProvider 인터페이스에 의존하는 코드를 가지고 있지만 다른 모든 코드를 건드리지 않고 공급자의 구현을 변경하자 수 있습니다. 아니면 심지어 당신이 원하는대로 역할을 구축/생성/조립하게하는 역할 컬렉션에만 의존합니다. 자, 공급자 인터페이스를 두 가지 (더미) 구현해 보겠습니다.

class UserRolesA implements UserRolesProvider { 
    public function roles(User $user) 
    { 
    return 0===$user->getId()%2 ? array() : array('X'); 
    } 
} 

class UserRolesB implements UserRolesProvider { 
    public function roles(User $user) 
    { 
    return 0!==$user->getId()%2 ? array() : array('X'); 
    } 
} 

일부 사용자는

// "create" 6 users 
$users = array_map(function($x) { return new User($x); }, range(1,6)); 

개체를 모두

function foo($users, UserRolesProvider $provider) { 
    foreach($users as $u) { 
     $roles = $provider->roles($u); 
     echo $u->getName(), ' ', join(',', $roles), " | "; 
    } 
    echo "\n"; 
} 
foo($users, new UserRolesA); 
foo($users, new UserRolesB); 

인쇄

user #1 X | user #2 | user #3 X | user #4 | user #5 X | user #6 | 
user #1 | user #2 X | user #3 | user #4 X | user #5 | user #6 X | 

하지 너무 인상적

를 사용하여 뭔가. 하지만 요점은 함수 foo()에서 User 클래스 나 코드를 건드릴 필요가 없다는 것입니다.
그리고 디커플링은 계속 될 수 있습니다.
예. "여기에 어떤 유형이 있습니다."라고 대답 할 수있는 레지스트리. 그 역할을 구성하는 것을 나에게 줄 수 있습니까?내가 FN ($ 역할)를 호출 할 수 있도록 "어쩌면
또는 심지어"당신은 FN로 ([유형]) 나에게 스텁을 만들 수 있습니까? "

+0

이 interessting 소리, 당신이 구체적으로이 방법을 설명 할 수주십시오? – opHASnoNAME

+0

의 모습 이것은 독점적으로 독일어 토론입니다. ;-) –

+0

아직도 나를 위해 명확하지 않습니다 (- : – opHASnoNAME

3

나는 일반적으로 사용자 클래스의 생성자에 사용자 ID를 전달하고,이 생성자는 로컬 액세스 역할 객체를 생성 할 것이다 : 액세스 역할 객체를 초기화하는 것은 고가의 작업을 포함하는 경우

class user() { 

    protected $accessRole; 

    function __construct($idUser) { 
     $this->accessRole = new accessRole(); 
     $this->accessRole->setUserId($idUser); 
     ... 
    } 

을 우리는하지 않습니다 항상 객체가 필요하다면 생성을 지연시키는 방법을 찾아야합니다. 어떻게 생각해?