다음 문제에 관해 다른 사람들과 의견을 나누고 싶습니다. 두 가지 클래스 제품 및 항목이 있다고 가정 해 보겠습니다. Products 객체를 사용하면 모든 Item 객체에 액세스 할 수 있습니다. 여기에 예제가 있습니다.클래스 인터페이스 설계시 의사 결정하기
$products = new Products();
// get existing item from products
$item = $products->get(123);
// create item
$item = $products->create();
$item->setName("Some new product");
$item->setPrice(2.50);
이제 상태를 업데이트/저장하는 가장 좋은 방법은 무엇입니까?
$item->save();
또는
$products->save($item);
먼저 aproach 매우 straigh 앞으로 보인다 : 나는 2 옵션을 참조하십시오. Item 객체의 속성이 일단 설정되면 save 메소드를 호출하면 변경 사항이 지속됩니다.
반면에 나는 후자의 접근이 더 좋은 것처럼 느낍니다. 우리는 두 객체의 역할을 분리합니다. Item 객체는 state 만 포함하고 Products 객체는 그 상태에서 작동합니다. 이 솔루션은 단위 테스트 작성에 더 좋습니다. 의견이 있으십니까?
정확하게 저장하는 것이 다소 혼란스럽게 보입니까? 제품이 항목에 대한 추가 데이터를 저장한다는 것을 의미합니까 (저장하면 Product 객체의 상태가 업데이트 됨) 또는 항목에 대해 일부 작업을 수행하기 위해 제품을 트리거하고 있거나 setname/setprice가 어떤 방식 으로든 트랜잭션되고 저장됩니다. 변경 사항을 적용 하시겠습니까? –
@OriverMatthews Products는 항목에 대한 추가 정보를 저장하지 않습니다. 제품 -> 저장은 새 레코드를 작성하거나 레코드를 갱신하기로 결정합니다. setName, setPrice는 모든 값을 객체 속성으로 설정합니다. –
$ item-> save()는 ActiveRecord 패턴의 예이고 $ products-> save ($ item)는 TableGateway 패턴의 예입니다. http://martinfowler.com/eaaCatalog/activeRecord를 참조하십시오.html 및 http://martinfowler.com/eaaCatalog/tableDataGateway.html에서 각각의 장단점을 확인하십시오. 거기에는 다른 데이터 액세스 패턴도 있습니다. –