2

핵심 데이터가 ORM으로 간주되어서는 안되지만 여전히 ORM과 유사한 기능을 제공합니다. 단지 궁금한데, 데이터 매퍼 패턴을 구현하고 있습니까? "데이터 매퍼는 메모리 내 개체를 데이터베이스와 분리하는 소프트웨어 계층이며, 데이터의 양도 데이터를 양방향으로 전송하고 데이터를 서로 분리하는 역할을합니다." (마틴 파울러). IMHO 컨텍스트 관리자는 모든 SQL 항목을 하나의 트랜잭션으로 처리하므로 성능면에서 현명한 디자인이며 IMHO 핵심 데이터는 데이터 매퍼 패턴을 구현하는 것으로 간주 될 수 있습니다.핵심 데이터가 데이터 매퍼 패턴을 구현합니까?

답변

1

1 년간 후자, 나는 내가 ORM 전문가되지 오전 최근 데이터 매퍼를 사용하여 뭔가를 시작했지만 긴 시간으로 코어 데이터 사용자가 내가 더 말할 수없는 내 두 센트

에 기여할 것이다. 이 패턴의 주요 목적은 모든 데이터베이스 관련 작업에서 도메인 객체를 명확하게 잘라내는 것입니다.

단위 테스트를 작성하기 시작한 후에는 메모리 저장소에 일부만 있더라도 데이터베이스를로드해야한다는 점을 먼저 알아 차리면로드해야합니다. 또한 각 클래스마다 매퍼가 없으므로 각 관계를 저장하는 방법을 제어 할 수 없습니다.

코어 데이터는 개체 그래프에 대한 많은 메타 정보를로드하고 일부 구조를 강제로로드합니다. 영구 저장소를 변경하고 자신의 항목을 구울 수 있지만 분명히 "관계형"인 느낌으로이를 수행하는 방법에 대한 많은 제한이 있습니다.

아이디어가 좋다, 우리는 그것의 변형이라고 말할 수있다. 내가 좋아하는 것은 저장 작업이 개체 자체가 아니라 컨텍스트에서 수행된다는 것입니다. 그래서 어떤 종류의 분리가 있습니다.

"awakeFromFetch"또는 "didSave"와 같은 기능을 살펴보면 두 가지 작업이 일반 도메인 객체가 아니라 데이터 저장소와 관련되어 있습니다. 적절한 데이터 매퍼 패턴을 사용하면 단일 개체로 통합되지 않고 각 영구 저장소에 대해 이러한 작업을 정의 할 수 있습니다.

업데이트 : 내가 늙은 CoreData 기반 프로젝트를 처리했고이 답변을 향상시키기 위해 다시 와야 충분히

재미 일일 내 대답 후. 일을 분명하게하기 위해, 나는 "패턴처럼 보인다"는 것만으로는 충분하지 않다고 생각합니다. 예를 들어, 외관 및 어댑터 패턴의 구현은 매우 유사하지만 사용 방법에 따라 다르게 이름을 지정합니다.

코어 데이터가 데이터 매퍼를 구현합니까?

필자는 "not quite"이 "틀림없이!"라고 말해야 만합니다.

일부 필드의 이름을 바꾸고 나중에 새 필드를 추가해야하므로 매우 화가났습니다. 자동 마이그레이션이 코어 데이터와 함께 작동하는 방식을 잘 알고 있지만 이러한 것들이 얼마나 귀찮은 지 잊어 버렸습니다.

새로운 필드가 필요하고, 이름을 변경하고, 실험을 올바르게 진행할 때까지 실험을 몇 번이나 반복해야합니까? 그리고 모든 작은 변화에는 완전한 데이터베이스 마이그레이션이 필요합니까? Data Mappers를 사용하면 도메인 객체가 완벽하게 분리되기 때문에 결코 이런 일이 일어나지 않습니다. 새로운 기능을 마친 후에는 데이터베이스를 만져 도메인 객체를 따라 잡습니다. 핵심 데이터를 사용하면 도메인 객체의 모든 세부 사항을 매 순간 바인딩 할 수 있습니다.

소년, 코어 데이터의 "작은"성가심이 데이터 매퍼로 얻을 수있는 것과 정확히 반대되는 것을 잊을 때까지 얼마나 달콤한 인생 이었는지.

+0

[Ruby Rogues podcast의 최신 에피소드 듣기] (http://instaca.st/b/bfe), [Ruby Object Mapper] (https://github.com/rom-rb/rom) , 나는 같은 질문을하는 자신을 발견했다. 당신은 Core Data가 Data Mapper를 구현하지 않는다고 확신하지만, NSManagedObjectContext는 [Unit Of Work] (http://martinfowler.com/eaaCatalog/unitOfWork.html)를 확실히 구현한다고 생각합니다. –