6

MVC 프레임 워크에서 정적 메서드 또는 인스턴스 메서드를 사용해야합니까?Model 클래스 (MVC)에서 정적 메서드 또는 인스턴스 메서드를 사용해야합니까?

Users 클래스와 클래스를 반환하는 getUserById() 메쏘드를 가정하십시오. 어느 것이 더 나은 선택입니까?

Users users = new Users(); 
User ret = users.getUserById(123); 

또는

User ret = Users.getUserById(123); 

에는 인스턴스 변수는 클래스 Users, 더 나은 선택이 하나에이없는 가정?

+0

:

DAO 클래스는 문서라도이 DAO 패턴의 예입니다 (데이터베이스) 업데이트를 저장하거나 정보가 일부 데이터 소스를 형성 검색 할 책임이 있습니다. – maba

+0

여기에서 일부 토론 - http://stackoverflow.com/questions/538870/java-static-methods-best-practices. 저는 정적 인 방법을 개인적으로 사용하지 않을 것입니다. 왜냐하면 그들은 종종 테스트하기가 더 어렵 기 때문입니다. 또한 앱에서 다중 소유 (multi-tenancy)를 지원하는 경우 (즉, 2 개 이상의 별개 사용자 집합)이 경우 더 많은 어려움이 발생할 수 있습니다. –

+0

저의 겸손한 견해로는, MVC 패턴은 다른 클래스가 직접적으로 '데이터 멤버'에 직접 액세스하고 '멤버 함수'를 확장한다는 의미에서 캡슐화의 개념을 이어가는 데 사용됩니다. 따라서 인스턴스 메서드를 만드는 것이 첫 번째 선택이되어야한다고 생각합니다. :-) –

답변

4

나는 인스턴스 변수쪽으로 기울어진다. 단순히 테스트를 작성하기가 쉬울 것입니다. 게다가 현재 많은 서버 기술 (Spring, JavaEE 등)은 빈/리소스를 잘 주입하는 것을 지원합니다. 정적 인 방법보다는 오히려 이것을 더 잘 지원합니다.

1

사용자 클래스가 있고 Product 클래스가 있고 거기에 ID가있는 객체가있는 경우 'User'및 'Category'를 'getById'메소드로 확장하는 것이 좋습니다. 도망 치려는 $ ID를 받았습니다.

이렇게하면 두 가지 유형의 개체에서 같은 방법을 사용할 수 있습니다. 나는이 예제를 희망

몇 가지 의미가 있습니다 : 도전적으로

class User extends SuperClass { 
    public function getTableName() { 
     return 'table_name_for_user'; 
    } 
    public function getPK() { 
     return 'primary_key_for_user'; 
    } 
} 

class Category extends SuperClass { 
    public function getTableName() { 
     return 'table_name_for_category'; 
    } 
    public function getPK() { 
     return 'primary_key_for_category'; 
    } 
} 

class SuperClass { 
    public function getById($id) { 
     $query = $this->db->query("SELECT * FROM " . $this->getTableName() . " WHERE " . $this->getPK() . " = $id"); 
     return $query->result(); 
    } 
} 
+1

이것은 * is-a * 관계로 서브 클래스를 사용하는 좋은 예가 아닙니다. 기본적으로 상속을 사용하여 코드를 상속합니다. –

2

싫다. 사실 DAO (Data Access Object) 패턴을 살펴 봐야합니다.

모델 클래스 자체는 한 논리 인스턴스에서 다른 논리 인스턴스로 정보를 전송하는 역할 만하며 getter 및 setter 메소드 만 포함해야합니다. 사용하는 프레임 워크에 크게 의존

public class BookDAO { 

    private PreparedStatement saveStmt; 
    private PreparedStatement loadStmt; 

    public DBBookDAO(String url, String user, String pw) { 
    Connection con = DriverManager.getConnection(url, user, pw); 
    saveStmt = con.prepareStatement("INSERT INTO books(isbn, title, author) " 
            +"VALUES (?, ?, ?)"); 
    loadStmt = con.prepareStatement("SELECT isbn, title, author FROM books " 
            +"WHERE isbn = ?"); 
    } 

    public Book loadBook(String isbn) { 
    Book b = new Book(); 
    loadStmt.setString(1, isbn); 
    ResultSet result = loadStmt.executeQuery(); 
    if (!result.next()) return null; 

    b.setIsbn(result.getString("isbn")); 
    b.setTitle(result.getString("title")); 
    b.setAuthor(result.getString("author")); 
    return b; 
    } 

    public void saveBook(Book b) { 
    saveStmt.setString(1, b.getIsbn()); 
    saveStmt.setString(2, b.getTitle()); 
    saveStmt.setString(3, b.getAuthor()); 
    saveStmt.executeUpdate(); 
    } 
} 
관련 문제