2011-04-18 6 views
0

예 :취급 자식 개체 상태 때 영향 부모 상태

  1. Person.myCurrentState이 변화에 반응에서 변경해야 :

    class Person 
    {   
        @OneToMany 
        List<Action> actionHistory; 
    
        @ManyToOne 
        Employer employer; 
    
        private StateEnum myCurrentState = StateEnum.INITIAL_STATE; 
    } 
    

    두 가지에 해당하는 경우이 같은 상황을 상상 actionHistory, employer 등에서 "유형 X의 작업이 작업 스트림에 표시되고 현재 상태가 Y 인 경우 새로운 상태를 Y로 설정 한 다음 새 상태를 Z로 설정하면"

  2. Pe와 같은 일련의 비즈니스 규칙이 있습니다. rson은 현재 상태를 기반으로 어린이를 차단하고 일부 작업을 허용 할 수 있어야합니다. 예를 들어 특정 조건에서 고용주의 직위를 업데이트 할 수 없거나 특정 기준을 충족하는 작업을 추가 할 수없는 경우가 있습니다.

처음에는 나는 유효성 검사/반응 로직이 포함 된 Person의 루틴을 통해 어린이에게 모든 액세스를 퍼널하려고했습니다. 그 결과, 사람 개체가 얼마나 많은 작업을 모니터해야했기 때문에 Person 개체가 너무 커지고 전체적으로 커졌습니다. (즉, getAEmployer(), setNewEmployer() 및 그 종류의 것, updateJobTitleAtEmployer() 등과 같은 것)

로직을 어린이들에게 퍼뜨리는 것은 똑같이 지저분 해 보입니다. 이 경우 고용주는 (예를 들어) 고용주가 부모에게 많은 참조를 포함해야합니다. 또한이 물건과 관련된 비즈니스 규칙이 곳곳에 흩어져 있습니다.

이 문제에 대한 일반적인 해결책이 있습니까? 나는 부모 클래스 수의사를 가질 수있는 일반적인 방법을 원하고 어떤 경우에는 그것에 반응한다. 많은 어린이들의 특정 상태 변화에 반응한다.

업데이트 : 나는이 질문에서 용어 "학부모"와 "아동"을 잘못 사용했다고 생각합니다. 나는 이것을 다음과 같이 사용하고있다 : 부모는 "자식으로 구성된"자식/부모 "를 가진다. 예제에서 Person은 부모 클래스이고, 속성 클래스는 자식이됩니다.

더 나은 예 :

class Employee 
{ 
    private Contract contract; 
    private List<Action> actions; 

    private EmployeeState currentState = EmployeeState.INITIAL; 
} 

가의 currentState가 변경 될 수 있습니다이 경우 상상 경우 계약 변경에 뭔가 (예를 들어 속도가 상승하는 경우). 또한 직원이 특정 주에있는 경우 계약서에 특정 사항을 설정할 수없는 경우도 있습니다. currentState가 변경되는 경우 Contract 속성은 더 큰 계산에서 하나의 요소 일뿐입니다. 즉 상태가 "Contract.hourlyRate> 30과 같은 규칙에 의해 결정될 수 있으며 액션에 상태가 아닌 속성이있는 작업이 포함되어 있습니다 ...").

또한이 경우 작업을 추가하면 Employee 상태가 변경되거나 현재 상태에 따라 차단 될 수 있습니다.

이러한 문제가 발생하면 모델에 문제가있을 가능성이 있습니까?

+0

나는 단지 용어가 분명하도록하고 싶습니다. 여기에서 "부모"와 "자식"이라고 말하면 데이터 구성원을 의미합니다 ("자식", ('고용주 ')는 "부모"('사람'))? 저는 상속 계층 감각에서 사용 된 "부모"와 "자식"을 듣는 데 익숙해 졌기 때문에 물어 봅니다.'Person'의 자식은'Person'을 확장하는 클래스가 될 것입니다. 그러나 그것은 당신이 여기서 의미하는 것처럼 보이지 않습니다. – QuantumMechanic

+0

그래, 나는이 용어들을 잘못 사용하고 있다고 생각한다. 이 경우에는 "자식"을 사용하여 부모 내에있는 클래스를 의미합니다. (따라서 부모는 자녀와 "형제 관계"또는 "형제 관계"를가집니다.) – user426724

+0

나는 아직도 당신의 모범에 혼란 스럽다. 저는 직위가 고용주/회사가 아닌 직원/개인의 재산이라고 생각합니다. 작업 제목이 사람의 상태에 따라 다르면 setJobTitle 함수는 해당 상태를 확인해야합니다. – Pace

답변

1

제 생각에 이런 상황에서 Observer pattern을 사용할 수 있습니다. 이 경우 계약은 고용주에 가입하여 고용주의 상태가 변경되면 계약서에 통지되고 현재 상태를 기반으로 자체 작업을 수행 할 수 있습니다.