0

왜 Product 객체에는 Save라는 메서드가 있습니까?액티브 레코드 : "저장"과 같은 것을 추가하는 이유는 무엇입니까?

데이터베이스에 자신을 저장하는 제품이 잘못되었다고 생각됩니다. 제품은 자신의 책임에 대해서만 알고 있어야하지 않습니까? AR의 목적을 이해하지 못했거나 문제점이 제 해석에 있지 않습니다.

$product = new Product(); 
$product->name = 'sample post'; 
$product->price = 10; 
$product->save(); 
+0

"활성 레코드"라고합니다. 'save()'는 레코드의 합리적인 메소드/동작이 아닙니까? 액티브 레코드는 오직 수동적 인 데이터를위한 것이며, 유일한 행동은로드 & 세이브입니다. 어쨌든, 당신의 어리석은 생각은 MS 도서관의 디자인을 바꾸지 않을 것입니다. 그것을 사용하거나 대안을 선택하십시오. –

+0

제품은 레코드입니까? 도메인에서 엔티티입니다. 데이터베이스에는 레코드 만 있습니다. 활성 레코드를 변경하려고하지 않습니다. 나는 그가 응용 분야 (도메인)에 들어가서는 안된다는 것을 이해하고있다. 그것은 나에게 다른 상황에서 사용해야한다고 생각한다 ... 나는 가지고있는 느낌이다. – Maykonn

+0

귀하의 우려 사항이 적절합니다. 우려를 분리하기 위해 데이터 매퍼 패턴을 사용할 수 있습니다 (http://www.martinfowler.com/eaaCatalog/dataMapper.html). –

답변

2

액티브 레코드의 일반적인 원리는 오브젝트 의 인스턴스가 상기 데이터 저장소의 단일 행인지하고 목적 자체의 지속성을 전적으로 담당한다.

개체에는 단일 책임이 있으며 은 자체의 지속성을 관리합니다.

Martin Fowler says it best

:

데이터베이스 테이블 또는 뷰의 행을 감싸는 객체는 데이터베이스 액세스를 캡슐화하고, 그 데이터 영역의 논리를 추가한다.

개체는 데이터와 동작을 모두 전달합니다. 이 데이터의 대부분은 지속적이며 데이터베이스에 저장해야합니다. 액티브 레코드는 가장 명백한 접근 방법을 사용하여 데이터 액세스 로직을 도메인 객체에 넣습니다. 이 방법으로 모든 사람들은 데이터베이스에서 데이터를 읽고 쓰는 방법을 알고 있습니다.

+0

내 질문에 대한 답변 : "데이터베이스 테이블 또는 뷰에 행을 래핑하고 데이터베이스 액세스를 캡슐화하고 해당 데이터에 도메인 논리를 추가하는 개체 ..."및 "액티브 레코드는 데이터 액세스 논리를 이 방법으로 모든 사람은 데이터베이스에서 데이터를 읽거나 쓰는 방법을 알고 있습니다. " 나는 너무 많이 알고있는 물건을 좋아하지 않는다. "데이터베이스 테이블이나 뷰에 행을 래핑하고 데이터베이스 액세스를 캡슐화하고 해당 데이터에 도메인 논리를 추가하는 개체입니다."하지만 데이터 매퍼가 될 것입니다. 그렇습니까? – Maykonn

+0

@Maykonn 필자는 POCO가 자신에 관한 데이터 만 보유하고 선택적으로 관련 데이터에 대한 링크를 가지고 있다고 생각한다. 데이터 맵퍼는 POCO에서 데이터베이스로 맵핑하는 오브젝트입니다. – qujck

+0

예! 포코는 내가 옳은 것 같아. 물론 AR이 더 분명합니다. 프레임 워크가 제공하면 시간을 절약 할 수 있습니다. – Maykonn