2013-07-02 3 views
2

아마도 이것은 사소한 대답으로 된 질문이지만 그럼에도 불구하고 대답을 듣고 싶습니다. 최근에 내 자신의 프로젝트 (ORM을 사용하지 않음)에 대한 사용자 지정 datamapper를 작성하고 stackoverflow 또는 다른 웹 사이트에서 여러 스레드를 읽는 것과 관련된 많은 정보를 찾고 있습니다.PHP datamapper - 컬렉션 객체가 아닌 객체를 사용하는 이유는 무엇입니까?

개체는 기본적으로 Author 인스턴스 또는 BookCollection 개체의 컨테이너로만 구성되며, 여러 개의 Book 인스턴스를 보유하고 있습니다. 하지만 왜 단일 Author 개체에 대한 매퍼가 필요합니까? 모든 내가 생각할 수있는 CRITERIAS를 가져 오는 여러 Book 또는 Author 따라서 인스턴스 BookCollection 또는 AuthorCollection 인스턴스를 반환합니다 (지정된 BookID 또는 AuthorID와 객체를 요청하는 일 제외). 그렇다면 왜 단일 개체에 대한 매퍼로 귀찮을까요? 적절한 컬렉션에 대한 매퍼가 좀 더 일반적이고 기준이 한 가지 결과 만 반환 할 것이라는 확신이 들지 않으면 어떻게해야합니까?

미리 도움을 주셔서 감사합니다.

답변

2

짧은 대답

당신은 AuthorAuthorCollection 두 매퍼를 만드는 귀찮게 할 필요가 없습니다. 원활하게 작동하고 깨끗한 소스를 얻으려면 프로그램에 AuthorMapperAuthorCollectionMapper이 필요하지 않은 경우 꼭 가장 편안하게 해보십시오.

:이 경로를 선택하는 것은 당신이 SRP 위반 찾고 추가주의해야 의미합니다.


롱 (어) 답 그것은 모두 당신이 뭘하려는 건지에 따라 달라집니다

. 이 포스트를 위해서, AuthorMapper을 아이템 데이터 매퍼라고하고 AuthorCollectionMapper을 콜렉션 데이터 매퍼라고 부르 자.

일반적으로 항목 매퍼는 해당 컬렉션 매퍼만큼 정교하지 않습니다. 항목 맵퍼는 일반적으로 만 기본 키로 가져와 결과를 제한하므로 추가 컬렉션 관련 항목을 사용하여 매퍼를 정리하고 정리할 수 있습니다.

내가 수집 한 이러한 "컬렉션 특정 항목"의 주요 부분은 조건이 이고 쿼리로 구현되는 방식입니다. 종종 collection mappers 내에서 item data mapper 내부에있을 것보다 더 진보적이고, 길고, 지루한 쿼리가있을 것이다. 는 냄새 나는 상태 2, 더 복잡해진다 여전히 긴 쿼리를 실행하기 위해 데이터베이스를 귀찮게를 사용하지 않고 복잡한 수집 매퍼 쿼리 평균 항목 데이터 매퍼 쿼리 (SELECT ... WHERE id = :id)를 결합 할 전적으로 가능하지만 때 모두를 필요한 것은 간단하고 일반적인 것이었다.

또한 항목 매퍼로는 기본 키로 만 가져올 수 있지만 다른 항목에 대해서는 항목 매퍼를 사용하면 훨씬 간단 해집니다. 항목 매퍼의 save()remove() 메서드는 컬렉션 매퍼를 사용하여 항목을 저장/제거하는 것보다 (올바른 구현으로) 처리 할 수 ​​있습니다.그리고이 점과 함께 콜렉션 맵퍼 'save()remove() 메소드를 사용하는 동안 때로는 콜렉션 맵퍼가 항목 맵퍼 메소드를 사용하기를 원할 수도 있습니다.

아래 질문에 대한 응답으로 데이터베이스에서 행 모음을 삭제할 때 조건을 설정하려고 할 수 있습니다. 예를 들어 스팸 플래그를 설정해 놓았을 때 게시물을 숨기지 만 30 일 후에 자체 파괴 할 수 있습니다. 그럴 경우 스팸 플래그에 대한 조건이 있고 시간 범위에 대한 조건이있을 가능성이 큽니다. 답변을 삭제 한 후 30 일이 지나면 답변 아래의 모든 댓글을 삭제할 수 있습니다. 누군가가 그들의 코멘트를 원하거나 스팸 플래그가있는 행이 실제로 스팸이 아닌 것으로 판명 된 경우를 대비하여이 데이터를 최소한 유지하는 것이 현명한 이유는 30 일입니다.

1. 여기서 조건은 컬렉션 매퍼의 쿼리가 처리 방법을 알고있는 컬렉션 인스턴스에 설정된 속성을 의미합니다. 아직 확인하지 않았다면 @tereško's 대답 here을 확인하십시오.
2.이 조건은 다른 사람들이 말하는 "evil if"을 말합니다. 당신이 그들의 사악함을 이해하지 못한다면, 나는 몇몇 깨끗한 코드 회담을 지켜 볼 것을 제안 할 것이다. This one하지만 모두 훌륭합니다.

+0

위 답변입니다. 당신은 내 진술이 datamapper의 "가져 오기"케이스에 대해 보유하고있는 것처럼 옳습니다. 이제는 "store"케이스에서 하나의 아이템을 저장하는 루프가 있는데, 이는 아이템 datamapper를 사용하는 것으로 감소합니다. 나는 "remove"case에서 데이터베이스에서 단 일행 (일명 항목 객체)을 제거하고 싶다면 item datama를 다시 사용하거나 임의의 조건으로 행을 제거하고 싶은지에 따라 크게 달라질 것이라고 생각합니다. 그러나 나는 마지막 언급 한 사례에 대한 예를 생각할 수 없다. 당신은이 학문이 순전히 학문적인가? –

+0

@MalteBehrmann 감사합니다. 죄송합니다. 어느 것이 "마지막으로 언급 한 사례입니까?" – jeremy

+0

마지막으로 언급 한 경우는 임의의 조건으로 데이터베이스의 행을 제거하는 것입니다. 나는 이것을 사용해야 만하는 예제를 생각할 수 없다. 너는 그걸 알고 있니? –