2009-12-22 5 views
1

우리는 데이터와 메소드를 포함하는 엔티티 (클래스)를 가지고 있습니다 (Person이라고 부를 수 있습니다). 이 객체에서 데이터를 사용해야하는 다른 클래스가 있지만 (Accountant 중 하나를 호출하겠습니다.) 메소드에는 기능을 사용할 필요가 없습니다.OO/DTO 아키텍처 질문

전체 Person 개체를 Accountant로 보내거나 데이터를 보관하기 위해 새 PersonData 개체를 만들어 Accountant obj?

우리가 알아야 할 한 가지 사례가 있지만 전반적인 활용을 위해 최선의 일반적인 대답을 알고 싶습니다.

답변

4

일반적으로 데이터를 직렬화 된 형식 (예 : 웹 서비스 또는 스마트 클라이언트)으로 처리해야하는 경우 DTO를 전달해야합니다. 도메인에서 Person 객체를 사용하고 있고 올바르게 캡슐화했다면 왜 DTO를 만들려고합니까?

1

저는 OOP가 person 클래스 내에서 정의 된대로 'get'메소드를 사용한다고 말할 수 있습니다. 저는 회계사가 전체 데이터를 필요로하지 않고 선택 데이터만으로 전체 개체를 보냈습니다. 불필요한 대규모 중복을 생성 할 때 후자는 아닙니다. 데이터의 크로스 레이어 전송을위한 DTO들의

그러나 OOP가 잘 다른 방법을 더 나은 될 수 있도록이 매우 이상적인처럼

...

1

내가 일반적으로 예비 사용. 이것이 사실이 아니라면, 나는 하나를 창조 할 강력한 이유가 확실하지 않습니다.

0

나는 이것이 신뢰 경계의 문제라고 생각한다. 비즈니스 애플리케이션에서 트러스트 경계는 일반적으로 계층 아키텍처를 결정합니다. "회계사"가 개인의 신뢰 경계를 벗어난다면 일종의 모델 변형이 있어야합니다. 아키텍처와 요구 사항은 어떤 종류의 변환을 결정해야합니다. 다른 사람에 의해 명시된 바와 같이

2

내가 제안하려는 솔루션, 인터페이스에 Accountant에 전달 추상적 인 객체에있을 것입니다 :) ... 반군 전송 존재하지 않는 경우는 제외 DTO들 사용에 실제 지점이 없다 IAccountee하고있다 Person 그것을 구현 ... 나는 C#을 잘 알고 아니에요 (프로필에서, 나는 그 : 선택의 언어이다 infered), 그러나 이것은 아마도 올바른 방향을 가리켜 야 :

class Accountant { 
    //.... 
    public void performAction(IAccountee target) 
    { 

    } 
} 
interface IAccountee 
{ 
    string Name 
    { 
     get; 
    } 
    int Salary 
    { 
     get; 
     set; 
    } 
} 

class Person : IAccountee 
{ 
    //implementation here, as well as some stuff specific to Person 
} 

기본적으로 SOLID에있는 D입니다. :) ... 일부 언어가 없다면 당신은 (접근을 만들 강제하는

까지 내가 이해, C#을 인터페이스 (대부분의 언어와 같은) 변수를 필요로하지 수 있습니다 ... 유연하고 깨끗하고도 AccountantPerson에서 불필요한 정보를 공유 방지/IDE 기능을 사용하여 기본 일반 접근자를 생성) 아직 수행하지 않은 경우 일반 변수를 사용하는 것보다 시간이 많이 걸리고 일반 필드 액세스보다 많은 성능이 필요하지만 OTOH, 좋은 일을 생각해보십시오. 적어도 성능이 떨어지는 경우 ... 여분의 DTO 클래스를 만들고 앞뒤로 (또는 한 방향으로) 데이터를 복사하는 것보다 훨씬 더 우아하다고 생각합니다.

도움이되는 희망 ... ;)

+0

왜 IAccountee를 사용 하시겠습니까? 단순히 변수를 쉽게 전달하기위한 것이거나 누락 된 부분이 있습니까? – silentcontributor

+0

그것은 Accountant를 Person으로부터 분리하고 회계사에게 Accountant에게 불필요한 모든 것을 숨기고 있습니다. – back2dos

+0

아, 그럼. 감사. – silentcontributor