순수한 POCO 모델을 사용하면 어떤 이점이 있습니까?


15

순수한 POCO 모델의 주요 이점은 무엇입니까? 모델은 깨끗하고 단순해야하지만 모델 클래스 내에서 자식 개체의 유지 관리를 유지하는 경향이 있습니다. 예를 들어 내가있는 경우 ClassAClassB다음과 같이 정의 :

public class ClassA
{
    public string MyProp { get; set; }
    public IEnumerable<ClassB> Children { get; }

    public void AddChild(ClassB newChild) { /*... */ }
    public void RemoveChild(ClassB child) { /* ... */ }
}

public class ClassB
{
    public string SomeProp { get; set; }
} 

add 및 remove 메소드에 본질적으로 잘못된 것이 있습니까? 대신 목록을 공개하고 클라이언트 코드가 null이 아닌 간단한 데이터 유효성 검사를 통과하고 다른 클래스에 복제하지 않는 것을 추가해야합니까?

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


null ClassB 인수를 객체의 NullObject 패턴 버전으로 변환하는 것과 같이 값을 추가하지 않으면 Add / Remove 메서드를 제거합니다.AddChild(ClassB newChild) => Children.Add(newChild ?? new NullClassB())
Graham

주어진 시간에 원하는 것이거나 아닐 수있는 수백 가지의 메소드로 ActiveRecord 클래스의 두통을 처리 한 적이 있다면 호소를 이해하는 것이 더 쉽다고 생각합니다.
Casey

이 특정 디자인을 피하는 주된 이유는 .net 디자인 지침에 위배되기 때문입니다. 그것은 완전히 임의적이지만 사람들은 컬렉션에 돌연변이 방법이있을 것으로 기대합니다.
Frank Hileman

@Casey Active Record 패턴을 사용하지 않고 add 메소드는 약간의 데이터 유효성 검사를 수행합니다. remove 메소드는 컬렉션이 노출되지 않기 때문에 내부 목록에서 단순히 추가하고 제거합니다. 내장 된 추가 / 제거 방법을 계속 사용하면서 유효성 검사를 수행 할 수있는 다른 컬렉션 유형을 사용하도록 변경했습니다.
Jesse

답변:


42

두 질문은 관련이 없습니다.

순수한 POCO 모델을 사용하면 어떤 이점이 있습니까?

순수한 POCO는 일부 엔터프라이즈 프레임 워크, 규칙, []에 의존하지 않거나 유사하게 종속 된 일부 개체에 밀접하게 연결되어 있지 않습니다. 다시 말해서, 세상은 POCO를 완전히 바꿀 수 있으며, 걱정하지 않고 계속 일을합니다. 프레임 워크를 업데이트하거나 새 시스템으로 이동하거나 재미있게보고 프레임 워크를 분리 할 수 ​​없습니다. 계속 작동합니다. 유일한 의존성은 명시 적으로 요구하는 것입니다.

POCO는 POJO 아이디어에 지나지 않습니다. 사람들이 C #을 사용하는 경우 Java라는 이름을 가진 개념을 설명 할 때 사람들이 당신을보고 웃기 때문에 J가 C로 변경되었습니다. 아이디어는 언어에 의존하지 않습니다. 그들은 단순히 그것을 Plain Old Objects라고 불렀을 것입니다. 그러나 누가 POO 사용에 대해 자랑하고 싶습니까?

파울러가 기원을 설명하도록하겠습니다.

이 용어는 Rebecca Parsons, Josh MacKenzie와 2000 년 9 월에 컨퍼런스에서 연설을 준비하는 동안 만들어졌습니다. 우리는 왜 사람들이 시스템에서 일반 객체를 사용하는 것에 반대하는지 궁금해했으며 단순한 객체에는 멋진 이름이 없기 때문이라고 결론 내 렸습니다. 그래서 우리는 그들에게 하나를 주었다. 그리고 그것은 매우 멋지게 붙 잡혔다.

martinfowler.com : POJO

다른 질문에 관해서는 :

add 및 remove 메소드에 본질적으로 잘못된 것이 있습니까?

A대해 직접 알고 싶지 않습니다 B. 그러나 그것은 POJO가 아닌 DIP 입니다.


B단순화를 위해 직접 의존했습니다 . 이상적으로는 둘 다 인터페이스를 구현합니다. 그러나 A여전히 목록이 IInterfaceB있습니다. AddChild하위 요소가 인터페이스 참조를 통해 느슨하게 결합 된 경우 메소드에 문제가 있습니까?
Jesse

6
간단하게하기 위해 수많은 바보 같은 일을 할 수 있습니다. 내가 싫어하는 것은 B에 대해 아는 것입니다. A는 B를 사용하지 않으므로 B와 대화하기 위해 적절한 A 소유 인터페이스를 정의 할 필요가 없습니다. 내가 알 수있는 한 A는 모음입니다. 따라서 A는 <T>를 통해 B를 처리해야 하므로 그것에 대해 알 필요가 없습니다.
candied_orange

2
또한 약어의 모든 종류의 언어 지정자를 피하기 위해 "일반 데이터 개체"에 대한 "PODO"를 보았습니다. PODO는 내가 생각하는 POJO 또는 POCO보다 더 많지만 POO보다 훨씬 덜 어리석은 소리입니다.
KRyan

2
Fowler가 POO라고 불렀다면 프레젠테이션이 얼마나 잘 진행되었는지 궁금합니다.
Oliver

3

추가 및 제거를 통해 Collection<T>기능을 구현하고 있습니다. 왜 변경 가능한 클래스 IEnumerable<T>대신 List<T>또는 다른 가변 클래스 를 사용하고 있는지 스스로에게 물어보십시오 . 컬렉션이 읽기 전용이어야하기 때문이 아닙니다.

내가 생각할 수있는 유일한 이유는 게시하려는 액세스 방법을 제어하려는 것입니다. 이 경우 자신의 컬렉션 클래스를 만들고 목록을 캡슐화하고 select 메서드 Add 및 Remove and implement을 구현하는 것이 IEnumerable<T>좋습니다. 그런 다음 IEnumerable<T>자녀 컬렉션 유형 대신에 사용 하십시오.

그러나 그것은 List<ClassB>아마도 당신을 잘 섬길 것입니다.


0

무엇에 AddChild추가하고 RemoveChild제거합니까? 데이터베이스 (또는 모든 종류의 지속성 저장소)에서 가져온 것이라면 일종의 활성 레코드가 있습니다. 항상 나쁜 것은 아니지만 @CandiedOrange가 언급했듯이 프레임 워크, 규칙, 종속성 등에 대해 걱정할 필요가 있습니다.

동시에 ClassA에서 ClassB (또는 적어도 InterfaceB) 로의 종속성이 모두 같은 응용 프로그램에있는 경우 피해야 할 시점은 무엇입니까? 응용 프로그램이 모델링하는 실제 영역에서는 상황이 서로 다릅니다. 실제 세계의 객체는 어떻게 그 "속한다"그들에게 다른 개체의 컬렉션을 가지고있다. 코드에서 이러한 관계를 나타내는 것이 전적으로 적합합니다.

조금 복잡 해지는 유일한 이유는 ClassB가 ClassA와 어떻게 연관되고 연관이 없는지 정확하게 관리해야 할 필요가 있기 때문입니다. 따라서 구현해야 할 작은 동작이 있습니다. 당신은 클래스 내에서 그것을 구현할 수 있거나 (완전히 "법적인"; /programming//a/725365/44586 참조 ), 또는 그 행동을 포함하는 별도의 클래스를 가질 수 있습니다. 개별 상황에 가장 적합한 것을하십시오.

어쨌든 POJO / POCO는 무의미하고 방해받지 않기 위해 실제로 OOP입니다. OOP 원칙을 준수하면 안전합니다.


실제로 AddChild는 중복을 확인하고 null을 허용하며 둘 중 하나를 허용하지 않습니다. 백도어 추가를 방지하기 위해 컬렉션이 IEnumerable로 노출되기 때문에 RemoveChild가 있습니다. 그래도 컬렉션에서 표준 제거 만 수행합니다.
Jesse

1
설명해 주셔서 감사합니다. 예, 그것은 정확히 POCO에 있어야 하는 행동 유형처럼 들리며 호출자가 원하는대로 기본 IEnumerable을 노출시키는 것보다 확실히 좋습니다.
John M Gant 2016 년

Active Record는 나쁜 패턴이라고 생각합니다.
Casey

1
@Casey, 당신은 그것에 대해 나에게서 어떤 주장도 얻지 못할 것입니다. 그러나 누군가가 그것을 사용하기를 원한다면 나는 논쟁하지 않을 것입니다. 중요한 점은 제시가 지속성을 모델 정의와 통합하는 Active Record와 같은 패턴을 사용하려고한다면 CandiedOrange가 강조한 모든 문제를 겪고 그 가치에 대해 실제로 POCO 자격을 갖추지 못할 것이라는 점입니다. 그러나 그것은 그가 어쨌든하고있는 것이 아닙니다.
John M Gant
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.