좋아, 나는 내 문제에 대해 적절한 해결책을 찾았으며 찾을 수 없었다. 판매 시스템의 일부를 재 설계하고있다. Let's 우리는 다음과 같은 클래스가 있다고 가정계급 법칙을 피하려고 노력하는 계급 의존성을 설계하는 방법
TWorkShift = class
Date: TDateTime;
fTotalSold: Currency;
fSales: TList<TSale>;
public
property TotalSold: Currency read fTotalSold write fTotalSold;
property Sales: Currency read fSales write fSales;
end;
TSale = class
fAmount: Currency;
fWorkShift: TWorkShift;
public
property Amount: Currency read fAmount write fAmount;
procedure Save;
end;
지금, 나는이 직면하고있는 문제는 데메테르의 법률을 위반하지 않고 최선의 아이디어에 와서 노력하고있다. 내가 달성하기 위해 시도하고있는 다음 새로운 TSale 내가 현재 사용자의 TWorkShift의 판매 목록에 추가 할, 또한 나는 양을 합계를 저장
- 때마다 TWorkShift의 "TotalSold"판매.
접근 A : : // Let's 우리가 ID 1로 작동하는 변화를 가지고와 데이터베이스에서로드되는 가정
:
I've는 두 개의 서로 다른 접근 방식을 시도 CurrentShift : = TWorkShift.Create (1); 내가 다른 곳에서 클래스 또는 일부에 합의 논리를 캡슐화를 원하기 때문에
NewSale := TSale.Create;
NewSale.Amount:=100;
NewSale.Save;
CurrentShift.Sales.Add(NewSale);
CurrentShift.TotalSold := CurrentShift.TotalSold + NewSale.Amount;
이 방법의 문제는, 테스트하기 어려운 오기 '이다 (어쩌면 새로운 클래스를?).
접근 B :
TSale 클래스 자체 내부에 그 코드를 포함한 내 다른 접근 방식 :
procedure TSale.Save;
begin
SaveToDataBase;
fWorkShift.Sales.Add(Self);
fWorkShift.TotalSold := fWorkShift.TotalSold + Self.Amount;
end;
내가 나에게 바로 느낌이 나던 데메테르의 법칙을 위반하는 생각이 접근 .
나는 코드 단순성을 극대화하고 앞으로 유지 보수가 용이하도록 "올바른 방법"을 찾고 싶습니다. 그래서 어떤 제안이라도 인정 될 것입니다. 당신이 TWorkShift에 판매를 추가하려는 경우, 당신은 즉
TWorkShift.AddSale(aSale: TSale);
begin
Sales.Add(aSale);
end;
, TWorkShift가 필요로하는 일에 대해 "요청"해야 있어야한다
감사
감사 닉 정보를 얻기 위해, 그럼 나는 아우렐리우스 ORM 프레임 워크를 사용하고이 경우에 그래서는 "협회"가 같은 : '판매 : = Manager.Find (1); ShowMessage ('ID가있는 근무 교대로 판매되었습니다 :'+ IntToStr (Sale.Shift.ID)); ' 때때로 판매에 대한 모든 정보 (판매 변경, 날짜, 계산원 등)를 표시해야하기 때문에 필요합니다. –
Luis, 프레젠테이션 계층에 문제가 있습니다. BL이 아니야. 프리젠 테이션 계층은 필요한 모든 정보를 수집해야합니다. 따라서 귀하의 경우에는 작업 대상에서 판매 오브젝트를 검색하여 모든 정보를 얻을 수 있습니다. – whosrdaddy
Luis - ORM이이를 수행하도록 강요하는 경우 다른 ORM을 사용하는 것이 좋습니다. 그것은 나쁜 디자인입니다. 판매는 발생한 워크 쉬프트에 대해 아무 것도 모를 것입니다. Workshift에서 일을 멀리 팔고 싶다면 어떻게해야할까요? –