2010-02-19 3 views
5

이것은 정기적으로 접하는 디자인 문제이며 주제에 대한 일반적인 통찰력을 찾고 싶습니다. 여기에 제공된 코드는 예제 일뿐입니다. 설계 단계에서OOP 디자인 : 응용 프로그램 개체에 DB 처리를 통합하는 방법

당신이 객체가 필요 결정하기 쉽습니다 :

User 
========== 
Unique ID 
Login name 
Password 
Full name 

을 그리고 데이터베이스 오브젝트로 변환하는 것은 쉽다 :

CREATE TABLE user (
    user_id INT NOT NULL PRIMARY KEY, 
    username VARCHAR(15) NOT NULL UNIQUE, 
    password_hash CHAR(32) NOT NULL, 
    full_name VARCHAR(50) 
); 

내 의심은 PHP 수준에서 시작합니다. 분명한 변환은 다음과 같습니다.

<?php 
class User{ 
    public $user_id, $username, $full_name; 
} 
?> 

그러나 실제 값을 어떻게 채워야합니까?

<?php 
class User{ 
    public $user_id, $username, $full_name; 
    public function __construct($user_id){ 
     $sql = 'SELECT username, full_name FROM user WHERE user_id=?'; 
     $parameters = array($user_id); 
     $res = get_row_from_db($sql, $parameters); 

     $this->user_id = $user_id; 
     $this->username = $res['username']; 
     $this->full_name = $res['username']; 
    } 
} 
?> 
:

내가 클래스 생성자 내부를 캡슐화 할 수 있습니다 ...

<?php 
class User{ 
    public $user_id, $username, $full_name; 
    public function __construct($user_id, $username, $full_name){ 
     $this->user_id = $user_id; 
     $this->username = $username; 
     $this->full_name = $full_name; 
    } 
} 
?> 

을하지만 그때 나는 다른 곳에서 쿼리를 실행해야합니다

나는 불가지론 DB 클래스 유지할 수 있습니다

이것은보기에는 좋지만 클래스와 함께 많은 것을하지 못하게합니다.

  • 검증

대부분의 경우 (내가 100 명의 사용자를 보여 100 개 쿼리를 감당할 수) 포럼 게시물에서 사용자 이름과 암호 ($의 USER_ID는 아직 알려져 있지 않다)

  • 인쇄 사용자 정보에 의해 사용자, I 여러 클래스를 정의해야하지만이를 구성하는 방법에 대해서는 잘 모릅니다. 하나의 기본 클래스와 많은 하위 클래스? 독립적 인 수업? 특정 방법으로 단일 클래스? 아마도 그것은 잘 알려진 디자인 패턴이지만 절차 프로그래밍을 배웠습니다.

    은 또한에 대해 몇 가지 아이디어를 감사하겠습니다 :

    • 세션에서 정보를 저장하는 사용자
    • 의 컬렉션을 처리 DB는 모든 페이지 요청에 조회 할 필요가 없습니다 있도록

    ==== 기록을 위해 ====

    나는 재미있는 독서를 제공하므로 대답으로 고든의 대답을 태그로 붙였습니다. 무엇이든간에, 내가 다음과 같이 요약 할 수있는 PHP 매뉴얼의 객체 직렬화 페이지에서 사용자의 의견 중 하나에 very illustrative code snippet을 발견 한 것을 주목할 필요가 :

    • 그것은 하나 개의 클래스를 사용합니다.
    • 인스턴스는 특정 사용자를 나타냅니다.
    • 생성자에 사용자 세부 정보가 제공됩니다.
    • 클래스는 인스턴스를 가질 수 있기 전에 필요한 기능을위한 정적 메소드를 제공합니다. ID 또는 이름으로 DB에서 사용자를 가져옵니다.
    • 사용자 인스턴스를 세션 데이터로 직렬화 할 수 있습니다.

    OOP 전문가가 아니기 때문에 나는 매우 간단하면서도 깨끗하고 유용하다는 것을 알았습니다. OOP 텍스트는 간단한 작업을 지나치게 복잡하게 만드는 경향이 있으며 일상 업무는 주로 소규모 프로젝트로 구성됩니다.

  • +0

    두 번째 방법으로 새로운 사용자를 만드는 방법에 대해 알려주십시오. 새 사용자는 데이터베이스에 존재하지 않습니다. – Rune

    +0

    언급 한 코드 스 니펫은 ActiveRecord 패턴 구현과 같습니다. – Gordon

    답변

    7

    아키텍처에 따라 다릅니다. 네 가지 일반적인 데이터 소스 아키텍처 패턴은 Martin FowlerPatterns of Enterprise Application Architecture에서 찾을 수 있습니다

    • Table Data Gateway

      데이터베이스 테이블에 게이트웨이 역할을하는 객체입니다. 하나의 인스턴스가 테이블의 모든 행을 처리합니다.

    • Row Data Gateway

      데이터 소스에 하나의 레코드에 대한 게이트웨이 역할을하는 객체

      . 행당 하나의 인스턴스가 있습니다.
    • Active Record

      데이터베이스 테이블 또는 뷰의 행을 감싸는

      개체는 데이터베이스 액세스를 캡슐화하고, 그 데이터 영역의 논리를 추가한다.

    • Data Mapper

      목적 및 서로 매퍼 자체의 독립적들을 유지하면서 데이터베이스 간의 데이터 이동 매퍼 층.

    또한 패턴

    2

    당신이 Doctrine 또는 Propel 같은 객체 관계형 매핑 라이브러리를 사용하여 생각 해 봤나?

    +0

    아닙니다. 제 3 자 라이브러리를 배우기보다는 제 디자인 기술을 향상시키고 자합니다. –

    +0

    좋은 솔루션이 이미 존재하는 분야에서 디자인 기술을 향상시키는 것이 ** 개선 할 가장 효과적인 ** 장소인지 의문을 제기합니다. 괜찮은 타사 라이브러리를 사용하는 경우 타사 솔루션이없는 영역에서 디자인 기술을 향상시킬 수 있습니다. –

    +0

    그래도 프레임 워크 없이도 훌륭한 코드를 작성하고 싶습니다. 일종의 일반적인 문화입니다. –

    관련 문제