2009-04-14 2 views
4

작업은 작업 추적을 지원하는 프로젝트 계획 클래스 라이브러리를 디자인하는 것입니다 (MS 프로젝트 작동 방식과 유사). 이 클래스 라이브러리에는 Task 오브젝트가 있습니다 (다른 것들 중에서)..NET 개체 계층 구조 - 이벤트 또는 이벤트가 발생하지 않음

Task 개체 중 다른 EstimatedHours (Double) StartDate (DateTime) 및 EndDate (DateTime) 특성을 갖는다. Task 개체는 하나의 부모 Task과 여러 자식 Task 개체를 가질 수 있습니다. EstimatedHours, StartDateEndDateTask의 하위 항목 (상위 항목)은 하위 항목의 속성에 따라 달라집니다. 부모 TaskStartDate은 자식의 가장 오래된 StartDate입니다. 부모 TaskEndDate은 자식의 최신 EndDate입니다. 부모 TaskEstimatedHours은 자녀의 EstimatedHours의 합계입니다. 따라서 자식이있는 Task에서 이러한 속성을 변경하는 것은 무효합니다.

부모가있는 작업에서 EstimatedHours, StartDate 또는 EndDate가 변경되는 유스 케이스를 어떻게 처리하겠습니까? (부모의 속성은 자식을 반영하므로 변경 내용을 적절하게 반영하도록 부모의 속성을 조정해야 할 수 있습니다)

하나의 옵션은 각 속성이 변경 될 때 이벤트를 갖는 것입니다. 부모 Task은 바로 그 자식 인 Task 개체에서 이러한 이벤트를 수신하고 해당 이벤트가 발생할 때 해당 속성을 적절하게 변경합니다. 이것은 좋은 접근 방법입니까 아니면 더 좋은 방법입니까? 당신은 어떻게 될까요?

Public Class Task 

    Private mChildren As List(Of Task) 

    Private mEndDate As DateTime = DateTime.MinVlue 
    Public Property EndDate() As DateTime 
    Get 
     Return mEndDate 
    End Get 
    Set(ByVal value As DateTime) 
     mEndDate = value 
     'What to do here? 
    End Set 
    End Property 

    Private mEstimatedHours As Double = 0.0 
    Public Property EstimatedHours() As Double 
    Get 
     Return mEstimatedHours 
    End Get 
    Set(ByVal value As Double) 
     mEstimatedHours = value 
     'What to do here? 
    End Set 
    End Property 

    Private mStartDate As DateTime = DateTime.MinVlue 
    Public Property StartDate() As DateTime 
    Get 
     Return mStartDate 
    End Get 
    Set(ByVal value As DateTime) 
     mStartDate = value 
     'What to do here? 
    End Set 
    End Property 

End Class 

답변

4

관찰자 디자인 패턴을 사용하는 것이 문제를 해결하는 올바른 접근 방식을 :

는 여기 Task 객체의 모양에 대한 기본적인 생각이다. Observer 패턴 구현에 대한 자세한 설명은이 토론의 범위를 벗어납니다. 그러나 Observer Pattern을위한 몇 가지 훌륭한 링크가 있습니다. 하나의 링크는 here이고 다른 하나는 here입니다. 이 도움이

http://www.dofactory.com/Patterns/PatternObserver.aspx

http://en.wikipedia.org/wiki/Observer_pattern

희망.

Ruchit S.는

1

나는 것이 아니라 그 위에 컨트롤러의이 모델의 책임의 한 부분을 고려하지 않을 것입니다.

모델에 이벤트 또는 관찰자 패턴을 추가하면 피할 수있는 직렬화 같은 다른 영역이 복잡해집니다.

모델 자체가 아니라 수정하는 클래스의 책임으로 만듭니다. 기억하십시오 : 모델의 책임은 비즈니스 규칙을 암시하는 것이 아니라 정보를 포함하는 것입니다.

1

이벤트 체인의 이벤트 하나가 예외를 throw하면 다음 이벤트가 호출되지 않습니다.따라서 다른 이벤트가 데이터에 등록 된 경우 이 가능하면 이벤트가 호출되지 않습니다.

기본 작업이 자녀와 절대 접촉하지 않는 것이 중요 할 경우 이벤트를 사용하지 마십시오.

1

나는 먼저 값을 계산할 수 있도록 개체 모델을 작성했습니다. 당신이 장소에가 있으면

public class Task 
{ 

    public List<Task> Children=new List<Task>(); 
    public Task Parent; 
    private int _duration; 

    public int Duration 
    { 

     get 
     { 
      if (Children.Count>0) 
      { 
       return SumChildrenDuration(); 
      } 

      return _duration; 
     } 

     set 
     { 
      if (children.Count>0) 
       throw new Exception("Can only add to leaves"); 
      _duration=value; 
     } 
    } 
} 

는 이제 모든 코드를 가지고 : 나는 그것을 대부분의 comftorble 나처럼 (나는 또한 작은 샘플을 유지하는 대신 속성의 필드를 사용하고) 당신의 C#을 줄려고하고있다 시스템을 실행해야합니다. 시스템이 충분히 우수한 성능을 발휘할 수 있습니다. 그렇지 않으면 추가 기능을 추가하여 결과를 캐시 한 다음 오브젝트가 변경 될 때 캐시를 재설정 할 수 있습니다. 무엇이든지간에 캐싱과 만료가 더 비싸지 않고 바로 계산할 수 있도록 밀접하게 프로필을 작성해야합니다.

2

이 방법은 실제로는 잘 모르겠지만 여기에는 다른 옵션이 있습니다. 태스크에 하위 작업을 허용하는 대신 ITask 인터페이스를 구현하는 Tasks와 TaskSet이라는 두 개체를 사용하십시오. Task에는 자체 StartDate, EndDate 및 EstimatedHours가 있지만 TaskSet은 해당 하위 작업에서 해당 값을 동적으로 계산합니다. 서비스를 사용하여 ITask에 자식을 추가하고 제거합니다. 추가를 위해 첫 번째 자식이 추가되면 TaskSet으로 Task를 변환합니다. 제거를 위해 마지막 자식이 제거 될 때 TaskSet을 Task로 다시 변환하고 마지막 자식의 값에서 속성을 설정합니다.

0

나는 ASP.NET 개발자에게 "이벤트가 감독합니다. 메서드가 작동합니다."

이벤트는 IFblocks 메서드를 호출하는 것 이상이어야합니다. 시도/캐치 등 없음
메서드는 데이터 액세스/조작/유효성 검사/계산 등을 모두 수행합니다.
이렇게하면 개발자가 "재사용 가능한 코드"사고 방식을 생성합니다.

일들이 분리되어 유지됩니다.
또한 MVC 개념을 매우 잘 처리합니다.

컨트롤러가 이벤트에 반응합니다. 그들은 감독합니다. Model 메서드를 호출합니다.
모델이 작동합니다.

완벽하지는 않습니다.
사실 단순한 설명이지만 꽤 좋은 가이드 라인입니다.

관련 문제