2013-10-27 1 views
1

저는 뷰어라고 부르는 작은 클래스가 있습니다. 이 클래스는 각 페이지 또는 그와 비슷한 것을보기로되어 있습니다 ...데이터베이스에서 데이터를 가져 오는 중 get-method를 사용합니까?

나는이 메소드의 사용자가 호출 될 때 getFirstPage라는 메소드를 가지고 있는데,이 메소드는 페이지가 현재 첫 페이지. 내가 여기에 몇 가지 코드를 가지고, 나는 그것이 작동 생각하지만 난 정말 내가 올바른 방법으로 할 것을 슈어하지 오전 :

class Viewer { 

private $db; 
private $user; 
private $firstPage; 

function __construct($db, $user) { 

    $this->db = $db; 

    if(isset($user)) { 
     $this->user = $user; 
    } else { 
     $this->user = 'default'; 
    } 
} 

function getFistPage() { 
    $std = $db->prepare("SELECT firstPage FROM settings WHERE user = ':user'"); 
    $std->execute(array(':user' => $user)); 
    $result = $std->fetch(); 
    $this->firstPage = $result['firstPage']; 

    return $this->firstPage; 
} 
} 

내 get 메소드는, 데이타베이스에서 설정 가져 오는됩니다 (지금까지 너무 좋은?). 문제는 그 다음이 get 메서드를 사용하여 private 변수 firstPage를 설정해야한다는 것입니다. 이 작업을 수행하는 데 set 메소드가 있어야하는 것 같지만 데이터베이스에서 일부 설정을 가져 오는 set 메소드가 실제로는 없습니다. 이 개체의 사용자는 이미 개체에 정의 된 설정이 있다고 가정 할 수 있어야하므로 ...

어떻게해야합니까?

답변

1

나는 당신의 접근 방식이 나쁘지 않다고 생각합니다. 가장 중요한 것은 생성자에 $db을 전달하는 것입니다. 사용자는 생성자 또는 메서드 자체의 매개 변수가 될 수 있습니다. 이는 응용 프로그램의 사용자가 '영구적 인'방법에 따라 달라집니다. PDO 개체에 대한

  1. 사용 유형 힌트 : 나는 개선 할 몇 가지 작은 가지가

    있습니다. 그러므로 '도서관'을 사용하는 사람은 어떤 종류의 물건을 주입해야하는지 알고 있습니다.

  2. 가시성을 거의 사용하지 않으려면 protected을 사용하십시오. 따라서 누군가가 수업을 확장하기를 원한다면 그는 여전히 자신의 속성에 액세스 할 수 있습니다.
  3. $ user를 확인하는 데 isset/empty를 사용하지 말고 기본값을 사용하십시오. 따라서 메서드를 호출하고 매개 변수가 무엇인지 알 수있는 사람은 누구인지 알 수 있습니다.
  4. 항상 명시 적으로 public 표시를 사용합니다. 좋은 연습이며, 기본값으로 package을 가진 자바 개발자를 혼동하지 않을 것입니다.
  5. 높은 품질의 코드를 만들고 싶다면 가능한 모든 오류 상태를 확인하여 치명적인 오류가 발생하지 않도록하십시오. PDO::fetch은 false를 반환 할 수 있으며 결과를 배열로 액세스하기 전에이 오류 상태를 확인해야합니다.
  6. $firstPage을 개체 상태로 저장하려면 다음에 메서드를 호출 할 때 다시 사용해야합니다. 그러나 일반적인 웹 응용 프로그램을 작성하는 경우 실제로 개체 상태에 넣고 싶지 않습니다. 대신 결과를 반환하십시오.

그런 다음 코드는 다음과 같습니다

class Viewer { 

    /** @var PDO $db */ 
    protected $db; 
    protected $user; 

    public function __construct(PDO $db, $user = 'default') { 
    $this->db = $db; 
    $this->user = $user; 
    } 

    public function getFistPage() { 
    $std = $this->db->prepare("SELECT firstPage FROM settings WHERE user = ':user'"); 
    $std->execute(array(':user' => $this->user)); 
    $result = $std->fetch(); 

    if ($result !== false) { 
     return $result['firstPage']; 
    } else { 
     throw new YourException('Failed to fetch first page.'); 
     // or return false/null; 
    } 
} 

편집 : 당신은 항상 완전히 생성자에서 개체의 상태를 설정해야합니다 그리고 당신은 그것에서 어떤 계산을하지 말아야. 또한 initialize-like 메소드를 사용하지 마십시오. 이 경우 생성자는 PDO 및 $user 매개 변수를 설정합니다 (객체 상태). 그런 다음 추가 매개 변수를 전달하지 않고 메서드에서 계산을 수행 할 수 있습니다 (좋은 점은 개체 캡슐화를 지원함).

+0

나는 방법을 쓸 때 공개 키워드를 완전히 잊었다! 첫 번째 시도는 생성자에서 모든 값 (첫 페이지 이상이되어야 함)을 초기화하는 것이었지만 그렇게하지 말아야한다는 내용을 읽었습니다. 한 번에 둘 이상의 매개 변수를 초기화하려면 어떻게해야합니까? 초기화 메소드를 작성할 수 있습니까? – theva

+0

초기화 방법은 좋지 않은 것으로 간주됩니다. 생성자에서 객체 상태를 설정하고 메소드에서 모든 계산을 수행해야합니다. 'getFirstPage' 메서드를 호출하기 전에 왜 firstPage를 초기화하고 싶습니까? –

+0

뷰어로 사용되는 개체는 현재 사용자 설정에 따라 달라 지므로 인스턴스로 설정된 개체는 firstPage를 설정하지 않으면 완료되지 않습니다. – theva

1

게터는 객체의 상태를 변경하면 안됩니다. 그러나 때때로 멤버 변수는 실제 객체 상태의 일부가 아니며 내부 캐싱에 사용됩니다. 당신은 자신에게 물어봐야합니다 - firstPage은 주정부의 일부입니까? 학급의 사용자가 설정 여부를 신경 써야합니까?퍼포먼스 이외에, 오브젝트는 그것의 가치에 따라 다르게 행동합니까? 그렇지 않다면 getter에서 설정하는 것보다 좋습니다.

+0

매우 중요한 점, 아마도 가장 중요한 점. –

관련 문제