2011-07-30 2 views
3

db로 직렬화되는 개체가 있습니다.클래스의 다른 속성에서 런타임 속성을 분리하는 방법에 대한 모범 사례

질문은 런타임 속성 (예 : 마지막 런타임 등)을 유지할 수있는 곳이 같은 클래스 또는 별도의 클래스 또는 파생 클래스입니까? 이 시나리오에서 가장 좋은 방법은 무엇입니까?

업데이트 예를 들어 : 개체 기차

속성 :

런타임 타입, 체중, 신장, 속도 등 : 여행 시작 날짜, 여행 종료일

+0

'런타임 속성'이 아닌 무언가를 만들어야합니다. .NET에는 '디자인 타임'속성이 있으며, WPF 및 Winforms에는 디자이너가 있습니다. 코드 생성기는 사용자 대신 사용자 컴퓨터에서 실행됩니다. 그게 얼마나 관련성이 있는지는 그 질문에서 추측 할 수 없습니다. –

+2

"직렬화"(BLOB 또는 CLOB 등으로 저장 됨) 또는 "지속됨"을 의미합니까? 또한 여기서 런타임 속성에 대한 귀하의 의미에 대해 명확하지 않습니다. 저장할 필요가없는 데이터를 의미합니까? –

+0

@Hans 물론 거기에는 * 런타임 속성 (ICustomTypeDescriptor, 동적 등)이 있습니다. 그러나 이것이 OP가 의미하는 바는 아닙니다. –

답변

3

지금 추가 된 예제를 보면 나는 이것을 옮겨서 대신 캡슐화를 사용한다고 말합니다. 즉, 런타임 속성 (실제로는 올바른 용어가 아님)이있는 TrainJourney 클래스와 참조 데이터 엔티티 인 Train 인스턴스로 이동합니다.

데이터 엔터티에 추가 속성 (일반적으로 부분 클래스에 있음)을 추가하는 것은 데이터 엔터티에 직접 연결되어있는 한 괜찮습니다. 이것은 일반적으로 계산 된 값, 지연된/캐시 된 값, 해석 (Status == Status.Open이 아닌 IsOpen 등)을 의미합니다.

귀하의 경우 추가 속성은 관련이없는 개념과 관련됩니다. 관심사를 분리하면 Train 클래스에 혼합하여 혼란 스럽습니다. 그래서 :하지 마십시오.

3

당신 가정 일종의 표준 시리얼 라이저를 사용하고 있습니다. 속성을 사용하여 어떤 속성이 일련 화되는지 표시 할 수있는 가능성을 제공합니다. 직렬화의 일부로 지속되어야하는 것만 표시하십시오.

게다가 데이터베이스에 저장하기 위해 직렬화를 사용하는 솔루션은 실제로 생각해야한다고 생각합니다. 관련성이있는 경우도 있지만 개체의 속성을 데이터베이스의 열에 매핑하는 것이 훨씬 더 좋습니다.

+0

OP는 직렬화 된 것이 아니라 "persisted"를 의미 할 수 있습니다. :) –

0

나는 다음과 같은 클래스 구조를 사용합니다 : (간결 제외 "개인/공개"와 속성) 내가 보여준대로 또한

// describes the run schedules 
class RunSchedule { 
    int RunScheduleId;   // only used by DB to uniquely identify record, never seen by user 
    int RunId; 
    DateTime StartTime; 
} 

// describes the runs, so repeat runs do not duplicate this information 
class Run { 
    int RunId;    // only used by DB to uniquely identify record, never seen by user 
    string Name;   // unique run name as known by everyone, eg. "Chicago express" 
    Train Train; 
    string StartLocation; 
    string EndLocation; 
    TimeSpan Duration; 
} 

// describes the train-specific information, without duplicating anything 
class Train { 
    int TrainId;  // only used by DB to uniquely identify record, never seen by user 
    string Name;  // unique train identifier as known by everyone 
    TrainType Type; 
} 

// describes the train-common information, shared across trains of the same type 
class TrainType { 
    int TypeId;   // only used by DB to uniquely identify record, never seen by user 
    string Description; 
    double WeightMetricTonnes; 
    double HeightMetres; 
    double SpeedKms; 
} 

, 등 길이, 속도, 무게 같은 것들에 대해 이야기를 , 당신이 장치를 진술했는지 확인하십시오. 나는 또한 이것들에 상태를 추가하기 때문에 데이터 입력 중에 쓸모없는 실행, 열차 등을 숨길 수 있습니다.