2010-01-23 8 views
5

동일한 방식으로 두 가지 버전의 데이터를 읽고 작업해야하는 응용 프로그램을 작성할 때 해당 데이터를 나타내도록 클래스를 구성하는 가장 좋은 방법은 무엇입니까? 나는 세 가지 시나리오와 함께 올라와있다 : 다른 버전의 데이터를 저장하는 가장 좋은 방법은 무엇입니까?

  • 데이터 연합 (EU)에게

    1. 공통 기본/특정 어린이
    2. 고유 구조

    버전 1 차 예

    byte DoorCount 
    int Color 
    byte HasMoonroof 
    byte HasSpoiler 
    float EngineSize 
    byte CylinderCount 
    

    버전 2 자동차를

    byte DoorCount 
    int Color 
    enum:int MoonRoofType 
    enum:int TrunkAccessories 
    enum:int EngineType 
    

    공통 기본/특정 어린이이 방법

    는 데이터의 두 가지 버전과 데이터의 각 버전에 대한 자식 클래스에 공통 분야의 기본 클래스가있다.

    class Car { 
        byte DoorCount; 
        int Color; 
    } 
    
    class CarVersion1 : Car { 
        byte HasMoonroof; 
        byte HasSpoiler; 
        float EngineSize; 
        byte CylinderCount; 
    } 
    
    class CarVersion2 : Car { 
        int MoonRoofType; 
        int TrunkAccessories; 
        int EngineType; 
    } 
    

    강점

    • OOP 패러다임

    약점

    • 새 버전이 공통 필드를 제거가 유출되는 경우 자식 클래스를 기존의 것은 변경해야합니다
    • 하나의 conc에 대한 데이터 eptual 단위는 두 개의 정의 사이에서 분리됩니다. 다음은 데이터 연합

    은 렌트카는 데이터의 모든 버전에서 자동차 분야의 결합으로 정의된다.

    class Car { 
        CarVersion version; 
        byte DoorCount; 
        int Color; 
        int MoonRoofType;  //boolean if Version 1 
        int TrunkAccessories; //boolean if Version 1 
        int EngineType;  //CylinderCount if Version 1 
        float EngineSize;  //Not used if Version2 
    } 
    

    강점

    • 음 ... 모든 것이 한 곳입니다.

    약점

    • 경우 강제 구동 코드

      .
    • 다른 버전이 릴리스되거나 기존 버전이 제거되면 유지 관리가 어려움.
    • 개념화가 어렵습니다. 필드의 의미는 버전에 따라 변경되었습니다.

    고유 구조

    여기서 구조는 서로 OOP에는 관계가 없다.그러나 코드가 동일한 방식으로 코드를 처리 할 것으로 예상되는 경우 인터페이스가 두 클래스 모두에 의해 구현 될 수 있습니다. 새 버전이 추가되거나 기존이 제거되면

    class CarVersion1 { 
        byte DoorCount; 
        int Color; 
        byte HasMoonroof; 
        byte HasSpoiler; 
        float EngineSize; 
        byte CylinderCount; 
    } 
    
    class CarVersion2 { 
        byte DoorCount; 
        int Color; 
        int MoonRoofType; 
        int TrunkAccessories; 
        int EngineType; 
    } 
    

    강점

    • 솔직한 접근 방식
    • 쉬운 유지합니다.

    약점

    • 그것은 안티 패턴의

      .

    내가 생각하지 못한 더 나은 방법이 있습니까? 마지막 방법론에 호의적 인 것은 분명하지만 첫 번째 방법이 더 좋습니다.

  • 답변

    1

    왜 세 번째 옵션 인 각 버전마다 구별되는 구조입니까, 나쁜 아이디어입니까, 아니면 안티 패턴입니까?

    데이터 구조의 두 가지 버전이 공통 응용 프로그램/모듈에서 사용되는 경우 동일한 인터페이스를 구현해야합니다. 기간. 서로 다른 두 가지 버전의 데이터 구조를 처리하기 위해 두 개의 서로 다른 응용 프로그램 모듈을 작성하는 것은 절대적으로 어렵습니다. 기본 데이터 모델이 극단적으로 다르다는 사실은 부적절합니다. 결국 객체 작성의 목표는 실용적인 수준의 캡슐화를 달성하는 것입니다.

    이 방법으로 코드를 작성하면서 결국 두 클래스의 코드가 유사하거나 중복되는 위치를 찾아야합니다. 이러한 일반적인 코드 조각을 다양한 버전 클래스에서 제외하면 결국 동일한 인터페이스를 구현할뿐만 아니라 동일한 기본/추상 클래스를 구현할 수있는 버전 클래스가 생길 수 있습니다. Voila, "첫 번째"옵션으로의 길을 찾았습니다.

    나는 이것이 끊임없이 진화하는 데이터 환경에서 최고의 경로라고 생각합니다. 구형 코드에서는 근면과 "뒤에서"보아야하지만 코드 명확성과 재사용 가능한 구성 요소의 이점은 가치가 있습니다.

    다른 생각 : 예제에서 기본 클래스는 "Car"입니다. 내 의견으로는, 기본 클래스가 상속 자에게 "거의"가까운 것으로 밝혀지지 않았다. 좀 더 현실적인 기본 클래스 또는 인터페이스 집합은 "Versionable", "Upgradeable", "OptionContainer"등이 될 수 있습니다. YMMV.

    +0

    글쎄, 마지막 옵션은 "동일한"개념적 객체의 두 표현에 기본 클래스를 사용하지 않으므로 반 패턴이라고 말할 수 있습니다. "기본 클래스가 상속자와 너무 가깝다는 사실이 거의 드러나지 않았습니다"- 예, 방법론을 보여주기 위해 간단한 예제를 고안하려고했습니다. 그래서 제 3의 옵션을 옹호 할 것이며, 애플리케이션 코드가 작성되면 필요한 경우 처음으로 변형 될 것이라는 점을 이해해야합니다. –

    +0

    네, 저의 (길다란) 대답에 대한 당황스럽게 간결한 요약이었습니다. –

    +0

    전적으로 동의합니다. –

    1

    두 번째 접근법을 사용하고 인터페이스로 향상시킵니다. 이전 버전과의 호환성을 제공하는 다중 인터페이스 "버전"을 구현할 수 있다는 것을 기억하십시오! 난 당신이 내가 말을 무슨 뜻인지거야 희망,

    1

    는 다음과 같은 요구 사항에가는) :

    읽고 같은 방법으로 데이터의 두 가지 버전으로 작업해야하는 응용 프로그램

    가장 중요한 것은 데이터 추상화 계층을 통해 모든 로직을 퍼널하는 것이므로 버전 1, 2 또는 n 중 어느 데이터를 사용하는지 신경 쓰지 않아도됩니다. .

    이렇게하는 한 가지 방법은 데이터를 가장 "버프 업"한 버전 인 데이터 클래스를 하나만 가지는 것입니다. 기본적으로, 그것은 MoonRoofType 일 것이지만, 유추 될 수 있기 때문에 HasMoonRoof이 아닙니다.이 클래스는 기본값을 결정하기 위해 데이터 추상화 계층에 달려 있으므로 폐기 된 속성이 없어야합니다.

    결국에는 데이터 버전을 전혀 신경 쓰지 않는 응용 프로그램을 갖게됩니다.

    데이터 추상화 계층의 경우 모든 버전에 대해 데이터 클래스가 필요할 수도 있고 그렇지 않을 수도 있습니다. 대부분의 경우, 응용 프로그램 논리에서 사용되는 데이터 인스턴스를 저장/생성하기위한 방법으로 SaveLoad 데이터 구조의 모든 버전에 대해 하나의 클래스 만 있으면됩니다.

    관련 문제