2014-05-14 7 views
2

다음 문제에 관해 다른 사람들과 의견을 나누고 싶습니다. 두 가지 클래스 제품 및 항목이 있다고 가정 해 보겠습니다. 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 객체는 그 상태에서 작동합니다. 이 솔루션은 단위 테스트 작성에 더 좋습니다. 의견이 있으십니까?

+0

정확하게 저장하는 것이 다소 혼란스럽게 보입니까? 제품이 항목에 대한 추가 데이터를 저장한다는 것을 의미합니까 (저장하면 Product 객체의 상태가 업데이트 됨) 또는 항목에 대해 일부 작업을 수행하기 위해 제품을 트리거하고 있거나 setname/setprice가 어떤 방식 으로든 트랜잭션되고 저장됩니다. 변경 사항을 적용 하시겠습니까? –

+0

@OriverMatthews Products는 항목에 대한 추가 정보를 저장하지 않습니다. 제품 -> 저장은 새 레코드를 작성하거나 레코드를 갱신하기로 결정합니다. setName, setPrice는 모든 값을 객체 속성으로 설정합니다. –

+3

$ item-> save()는 ActiveRecord 패턴의 예이고 $ products-> save ($ item)는 TableGateway 패턴의 예입니다. http://martinfowler.com/eaaCatalog/activeRecord를 참조하십시오.html 및 http://martinfowler.com/eaaCatalog/tableDataGateway.html에서 각각의 장단점을 확인하십시오. 거기에는 다른 데이터 액세스 패턴도 있습니다. –

답변

1

따라서 효과적으로 항목이 실제 변경 사항을 버퍼링합니다.

분명히 두 방법 모두 작동하지만 분명히 기본 데이터베이스의 모델 또는 오버레이 된 개체 모델을 얼마나 준수하고 싶은지에 달려 있습니다.

외부에서 보면 $item->save()이 모델 측면에서 가장 이해가됩니다. 지적하면 항목의 속성을 업데이트 한 다음 저장합니다. 또한 개념적으로 항목에 대해 수행되는 작업입니다.

그러나 $products->save($item)은 두 가지 눈에 띄는 장점과 단점을 제공합니다.

세이브를 제품으로 이동하면 모든 항목을 볼 수 있기 때문에 더 효율적으로 업데이트의 일괄 처리/순서 변경을 처리 할 수 ​​있습니다. 또한 저장 코드 ->add()로 사용할 수 있습니다 (자세한 이하)

단점은 당신이 아마 원하지 않는, 다음과 같은 가능한 사용을 추가 (개체 모델 뷰에서)로 가고있다 :

$p1 = new Products(); 
$p2 = new Products(); 
$item = $p1->create(); 
// set $item values 
$p2->save($item); 

분명히 '이 광산인가요? 아니? 그런 다음 'Products::save에 오류'테스트를 던지십시오.하지만 구문이 의미하는/사용할 수있는 사용 사례를 차단하기위한 추가 코드입니다. 또는 적어도 코드 검토를 통과 할 가능성이 있습니다.

그래서 가장 간단한 것처럼 보이고 원하는 기능 ($item->save())에 가장 가깝게 접근하는 방법을 생각해보십시오. 캐싱/일괄 처리/다른 것과 함께 가야하는 모든 작업을 수행해야합니다.

+0

유지 관리 가능성에 대한 귀하의 생각은 어떻습니까? 한 클래스에서 데이터베이스 작업을하는 느낌이 들며 다른 클래스에서 작업중인 데이터로 인해 작업이 좀 더 쉬워 질 수 있습니다. 또한 $ p1 및 $ p2를 사용하는 예제와 관련하여, 아마도 여기서는 싱글 톤 패턴을 사용하는 것이 좋을까요? –

+0

데이터베이스 액세스가 단일체로 합리적으로 선언 될 수 있다면,이를 별도의 세 번째 클래스로 구현하고'$ item-save()'및'$ products-> create()'에서 참조하여 멋지게 풀어 낼 것입니다 , 당신이 다중 연결이 필요하다고 결정할 때 리펙토링에 악몽이 될 것입니다. –