11

내가 일하면서, 우리는이 주제에 대해 여러 번 앞뒤로왔다 갔다하고 온 전성 검사를 찾고있다. 다음은 질문입니다. Business Objects는 데이터 컨테이너 (DTO와 유사) 또는 해당 객체에서 일부 기능을 수행 할 수있는 논리를 포함해야합니까?Business Objects - 컨테이너 또는 기능성?

예 - 고객 개체에 (이름, ID 등) 몇 가지 공통 속성이 포함되어 있는지, 고객 개체에도 함수 (저장, 계산 등)가 포함되어있을 가능성이 있습니까?

한 줄의 추론은 기능 (단일 책임 원칙)에서 개체를 분리하고 비즈니스 논리 계층 또는 개체에 기능을 배치한다고 말합니다.

다른 추리에는 고객 개체가 있으면 Customer.Save를 호출하고 처리하기를 원합니다. 객체를 소비하는 경우 고객을 저장하는 방법에 대해 알아야하는 이유는 무엇입니까?

우리의 마지막 두 프로젝트에는 기능에서 분리 된 개체가 있지만 새로운 프로젝트에서 토론이 다시 제기되었습니다. 어느 것이 더 합리적입니까?

편집

이러한 결과는 우리의 논쟁과 매우 유사하다. 한 쪽 또는 다른쪽으로 한 표결은 방향을 완전히 바꿉니다. 다른 누구도 2 센트를 추가하고 싶습니까? 대답 샘플링이 작은 있는데도

편집

, 대부분은 간단하지만 지속성이 가장 별도의 클래스/계층에 게재되는 비즈니스 오브젝트에서 해당 기능만큼 받아 들일 생각 것으로 보인다. 우리는 이것을 시도 할 것이다. 모든 사람의 의견을 보내 주셔서 감사합니다 ...

답변

10

개체는 상태와 동작을 함께 나타냅니다. 개체에 현명한 행동이있는 경우 (예 : 출생일로부터 인물의 연령을 계산하거나 인보이스의 전체 세금을 계산하는 등) 꼭 추가하십시오. DTO 이상인 비즈니스 오브젝트를 "빈혈 도메인 모델"이라고합니다. 디자인 요구 사항이라고 생각하지 않습니다.

지속성은 특별한 종류의 동작입니다. 내가 "합리적"이라고 부르는 것은 비즈니스 행동입니다. 비즈니스 객체는 그것이 영속하다는 것을 알 필요가 없다. 나는 DAO가 비즈니스 행동과는 분리 된 끈기를 유지할 수 있다고 말하고 싶다. 나는 "현명한"범주에 "저장"하지 않습니다.

+0

당신의 생각은 계산이고 다른 간단한 함수는 객체에 있어야하지만 지속성 (즉, db 트랜잭션)은 다른 곳에 있어야합니다. 나는 그 권리가 있니? – Walter

+0

예, 그게 제가 말하는 것입니다. 물론 그것을 할 수있는 유일한 방법은 아닙니다. 어떤 사람들은 물건을 가지고있는 것을 좋아합니다. 나는 보통하지 않는다. – duffymo

+0

우리는 항상 비즈니스 개체의 모든 기능 또는 없음을 논의했습니다. 이것은 결코 우리가 생각하지 못했던 좋은 타협입니다. – Walter

2

비즈니스 개체가 스스로를 "처리"하는 방법을 알고, 시스템의 다른 위치에 그 부담을 두는 것이 더 바람직하다고 생각합니다. 귀하의 예에서, 고객 데이터를 "저장"하는 방법을 다루는 가장 논리적 인 장소는 Customer 객체에 있습니다.

데이터베이스가 "데이터 컨테이너"로 간주되기 때문에 데이터 컨테이너를 직접 액세스로부터 보호하고 표준 "비즈니스 규칙"을 적용하는 상위 수준의 "비즈니스 개체"를 선호합니다. 해당 데이터에 액세스/조작하는 방법에 대해 설명합니다.

+5

고객 개체보다는 "저장 가능한"표현을 만드는 방법을 알아야합니다.나중에 어떤 속성을 저장하고 복원해야하는지). 실제로 (예를 들어 데이터베이스에서) 그 표현을 지속시키는 세부 사항은 다른 클래스로 완전히 전달되어야한다. –

+0

BO는 언어와 데이터 저장소가 다른 12 개의 시스템에서 모두 사용할 수 있으므로 그 작업을보고 싶습니다. –

9

비즈니스 오브젝트의 비즈니스 기능은입니다.

퍼시스턴스는 비즈니스 기능이이 아니지만 기술적 인 구현입니다.짧은

긴 이야기 :

  1. 저장/업데이트/등 찾기/삭제 - 지속성 층에서 떨어져 비즈니스 오브젝트에서 유지한다.
  2. CalculateSalary, ApplyDiscount 관련 사업 등의 방법이 될 수 비즈니스
    1. 방법 개체 또는 (BO 때문에 자기 함유 엔티티의 표현이다);
    2. 별도의 서비스은 특정 기능을 구현합니다 (BO는 DTO와 유사합니다). 포인트 2.
      내가 접근 2.1은 보스가 너무 부풀어하고 가 SRP 위반하는 경향이 있음을 언급해야한다에 관해서는

. 2.2가 더 많은 유지 보수를 도입하는 동안 복잡성.

나는 보통 코드의 4 개 이상의 라인이있는 경우 나 (좀 더 복잡한 scenarious 서비스를 비즈니스 오브젝트에 데이터와 관련된 사소한 물건을 넣어 만들 그래서 2.1 사이 2.2 균형 - 그것을 서비스).

대신 Business Objects의 패러다임을 더 많은 데이터 전송 개체로 변경합니다.

그러나이 모든 것이 프로젝트를보다 쉽게 ​​개발, 테스트 및 유지 관리 할 수있게 해줍니다.

+0

필자는 2.1과 2.2를 필 요로한다. 비즈니스 오브젝트가 필요한 함수 또는 동일한 기능 그룹의 관련 오브젝트 만 필요한 오브젝트 - 오브젝트 (CalculateAge on Person)로 이동하십시오. 보다 관련이없는 객체 (거주, 배송 등을 고려할 때 CalculateDiscount)를 사용하는 프로세스는 별개의 서비스이며 대개 별도 모듈/어셈블리입니다. 매우 복잡한 논리는 별도의 클래스이기도하지만 (신용에서 PaymentPlanCalculator), 확장 메서드 (클래스에서 사용되지만 기술적으로는 사용되지 않음)로 노출 된 C#을 사용합니다. – TomTom

+0

SRP를 읽어 주셔서 감사합니다. 수업의 수를 늘리는 경향이 없으므로 유지 보수를 더 잘해야 할 곳을 알 수 있습니까? 저는 완전히 새로운 질문을해야합니다. –

1

비즈니스 개체는 해당 개체로 모델링 된 비즈니스 엔터티의 데이터와 관련 동작을 캡슐화해야합니다. 객체 지향 프로그래밍의 주요 교리 중 하나는 해당 데이터에 데이터 및 관련 동작을 캡슐화하는 것입니다.

지속성은 모델링 된 개체의 동작이 아닙니다. 비즈니스 오브젝트가 지속성을 무시하는 경우 개발이 더 원활하게 진행되는 것을 알 수 있습니다. 새로운 코드 및 단위 테스트를 개발하면 비즈니스 객체가 기본 배관에 특별히 묶여 있지 않은 경우 새 코드가보다 빠르고 원활하게 수행됩니다. 이러한 측면을 모방하고 데이터베이스 등을 사용하기 위해 농구를 거쳐야하는 것을 잊어 버릴 수 있기 때문입니다. 내 단위 테스트가 더 빨리 실행됩니다 (각 빌드로 실행되는 수천 개의 자동화 된 테스트가있는 경우 거대한 플러스). 데이터베이스 연결 문제로 인해 테스트가 실패하지 않기 때문에 스트레스가 적습니다 (종종 오프라인 또는 원격으로 작업하고 항상 데이터베이스에 액세스 할 수있는 것은 물론 오, 그런데 이러한 측면 (데이터베이스 연결성 등)은 다른 곳에 시험해보십시오!).

다른 고객의 의견을 말하자면, 아니오, 고객 객체가 있다면 그냥 Customer.Save으로 전화를 걸고 끝내야합니다. 객체를 소비하는 경우 고객을 저장하는 방법에 대해 알아야하는 이유는 무엇입니까?

CustomerSave 방법을 가지고 있으므로 고객 개체를 저장하는 방법을 이미 알고 있습니다. 해당 논리를 비즈니스 오브젝트에 임베드하여 문제점을 피할 수는 없습니다. 대신 코드 기반을 더욱 긴밀하게 연결하여 유지 관리 및 테스트하기가 더 어려워졌습니다. 다른 사람에게 물건을 지속시키는 책임을 푸시하십시오.

+0

여기에 대한 대부분의 대답은 매우 일방적 인 접근법을 취하고 있습니다. 하나의 언어 만 있으므로 '코드'오브젝트와 비즈니스 오브젝트를 통합 할 수 있습니다. 내 비즈니스 객체의 메서드가 BO 자체의 디자인에 구현되는 것이 아니라 해당 BO를 사용하려는 각 솔루션에 구현된다는 것을 더 넓은 관점에서 보려고 순진한가? –

+0

@Stephanie Page : 언어와 관련이 없으며 잠재적 인 패턴과 관련이 있습니다. 문제는 개체 동작의 초점이 도메인에서 환경으로 넘어갈 때 발생합니다. 개체가 데이터베이스에 저장되는 경우 연결 문자열 및 필드/열 매핑 또는 SQL 문과 같은 각 도메인/비즈니스 개체에 데이터베이스 논리를 포함해야합니까? 이 접근법은 DB 논리가 자체 계층으로 분해되지 않는 한 신속하게 관리 할 수 ​​없게됩니다. 이 상황을 처리 할 수있는 언어는 거의없고 부풀거나 중복 된 코드의 출처가되지 않도록하십시오. –

+1

나는 그것을 좋아한다 : 도메인에서 환경으로의 십자가 ... 그것은 훌륭한 은유이다. –

3

답변은 플랫폼이나 언어에 관계없이 동일합니다.이 질문의 핵심은 객체가 자치가 될 수 있어야하는지 아니면이 될 수 있는지 여부 또는 어떤 동작이 객체간에 퍼져 나가는 것이 더 좋은지 여부입니다. 집중된 책임.

각 클래스에 대한 답변이 다를 수 있습니다. 우리는 의 밀도을 기반으로 클래스를 배치 할 수있는 스펙트럼으로 끝납니다.

      (Level of responsibility for behavior) 
     Autonomy - - - - - - - - - - - - - - - - - - - Dependence 
     High 
    C  - <<GOD object>>       <<Spaghetti code>> 
    l  - 
    a  - 
    s  -          
    s  -     
     -       
    s  - 
    i  - 
    z  - 
    e  - <<Template>>        <<Framework>> 
     low 

클래스가 모든 동작 자체 또는 가능한 한 많은 작업을 수행하도록하는 것이 좋습니다. 이 그래프의 왼쪽에서 시작하여 클래스를 자율적으로 만들면 클래스를 더 일반적으로 만들기 위해 계속 리팩토링하지 않는 한 클래스의 크기가 커집니다. 그러면 템플릿이됩니다. 리펙토링이 수행되지 않으면 클래스가 더 이상 "god-like"이 될 수 있습니다. 필요한 행동이 있으면이를위한 메소드가 있기 때문입니다. 필드와 메소드의 수가 증가하고 곧 관리하기 어렵고 불가피합니다. 클래스가 이미 너무 많이하기 때문에, 코더는 괴물을 골라서 고르 디아 매듭을 자르려고합니다.

그래프의 오른쪽에는 다른 클래스에 많이 의존하는 클래스가 있습니다. 종속성 수준은 높지만 개별 클래스가 작은 경우 프레임 워크의 부호입니다. 각 클래스는 많은 작업을 수행하지 않고 일부 기능을 수행하는 데 많은 수의 종속 클래스가 필요합니다. 반면에 많은 양의 코드를 가진 의존성이 높은 클래스는 클래스가 으로 가득하다는 표시입니다. 스파게티.

이 질문의 핵심은 그래프에서 더 편하게 느껴지는 곳을 결정하는 것입니다. 어떤 경우에는 개별 조직 클래스가 템플릿 또는 프레임 워크의 결과를 얻을 수있는 방법이 아닌 한 그래프에 확산됩니다.

방금 ​​작성 했으므로 수업 규모와 조직도간에 상관 관계가 있다고 말할 수 있습니다. Robert C. Martin (또는 "Bob Uncle Bob")은 Design Principles and Design Patterns에 대한 그의 철저한 논문에서 패키지 의존성과 유사한 근거를 다루고 있습니다. JDepend은 26 페이지의 그래프 뒤에있는 아이디어를 구현 한 것으로 CheckstylePMD과 같이 static analysis tools을 보완합니다.

+1

+1 멋진 고장. 이것은 우리의 논쟁에 많은 부분을 추가 할 것입니다. 감사. – Walter

+0

그래프가 작동하려면 얼마나 걸렸습니까? 아주 좋은 대답은 ... 사이트에서 가장 좋은 Q/A 중 하나입니다. –

+0

@Stephanie : 많은 시행 착오를 겪었습니다. 이 답변은 Markdown에서 테이블 지원을 위해 Meta에 대한 기능 요청을 제출 한 이유 중 하나입니다. http://meta.stackexchange.com/questions/16356/why-cant-table-markup-elements-be-used/29368#29368 –

0

비즈니스 개체는 이름이 지어 짐에 따라 분명히 자신의 비즈니스 논리, 도메인 내의 비즈니스 논리의 동적 인 서비스 계층에 있어야합니다.

반면에 BO는 데이터 컨테이너 (DTO?) 구성 및 방법 일 수 있습니까? BO가 순수한 함수라는 것을 의미합니까? BO와 DTO 간의 모든 전환을 피할 수 있습니다.

-1

MVC 아키텍처에서

해당 모델에 비즈니스 개체가 포함되어 있다고 말할 수 있습니까?

2

우리는 수년간 Rocky Lhotka의 CSLA 프레임 워크를 사용해 왔으며 설계 방식이 매우 좋습니다. 이 프레임 워크에서는 모든 기능이 객체에 포함되어 있습니다. 논리를 분리하는 것의 가치를 알 수는 있지만, 필자는 언제든지이 철학에서 벗어날 것이라고 생각하지 않습니다.

+0

우수한 포인트. 저는 CSLA를 몇 가지 프로젝트에서도 사용했습니다. 우리 토론회에 그것을 포함시키는 일은 결코 일어나지 않았습니다. – Walter

관련 문제