2012-02-15 4 views
0

우선 문제는 아닌 디자인 문제입니다.C++로 작성된 기존 응용 프로그램 구성

C++로 작성된 기존 응용 프로그램이 있습니다.

구조는 다음과 같습니다 : 지금 현재의 구조를 변경할 수 있어요하지만 외부로부터의 모든 단계를 구성하는 데 필요

class Step1 
{ 
    public: 
     Step1(); 
     void process(); 
     void setValue(int v); // is to change the value 
    private: 
     int value; 
} 

class Step2 
{ 
    public: 
     Step2(); 
     void process(); 
     void setValue(int v); // is to change the value 
    private: 
     int value; 
} 

void main() 
{ 
    Step1 step1(); 
    Step2 step2(); 

    step1.setValue(1); 
    step2.setValue(2); 

    step1.process(); 
    step2.process(); 
} 

.) ( XmlParser가; 나는 구성 설정 잡고 xml 파일을 만들 것을 제안하고있다 :

<?xml version="1.0"?> 
<Steps> 
    <Step id="step1"> 
     <param method="setValue" variable="v" value="1" /> 
    </Step> 
    <Step id="step2"> 
     <param method="setValue" variable="v" value="2" /> 
    </Step> 
</Steps> 

을 그리고 나는 XML 파일을 구문 분석 클래스를 추가합니다 :

클래스 XmlParser가 { 공개 int parse (string xmlFile, string paramValue); }

는 내가 단지 메인 클래스를 변경 것이라고 생각 :

void main() 
{ 
    Step1 step1(); 
    Step2 step2(); 

    XmlParser xmlParser(); 

    step1.setValue(xmlParser.parse(,)); 
    step2.setValue(xmlParser.parse(,)); 

    step1.process(); 
    step2.process(); 
} 

나는 20 개 이상의 단계를 가지고 모든 단계에서 구성 할 수있는 10 가지 방법이 있습니다. XmlParser 클래스가 xml 파일을 구문 분석하고 값을 단계의 set 메서드에 전달하는 방식으로 아키텍처를 변경하는 것이 좋습니다. 아니면 이것을 할 수있는 더 좋은 방법이 있습니까?

귀하의 의견을 알려주십시오.

미리 감사드립니다.

+0

에서 XML는 의미에서 더 구성 코드를 만든다 코드, 그러나 그것을 xml.So 구문 분석 약간의 오버 헤드를 추가하는 디자인의 수정을위한 기본 목표는 무엇입니까 의존합니다. –

+0

내 목표는 외부에서 응용 프로그램을 구성 가능하게 만드는 것입니다. 따라서 xml을 도입하여 구성 설정을 유지하고 xmlParser 클래스를 추가했습니다.예, 저는 xmlParser의 parse() 메서드가 매우 복잡하고 읽기가 쉽지 않을 것이라고 동의합니다. 너는 무엇을 제안 하겠는가? 미리 감사드립니다. – olidev

+2

응용 프로그램을 외부에서 구성 가능하게 만드는 것이 목적이라면 xml을 사용하는 것이 좋습니다. 별도의 클래스에서 xml 파싱을 캡슐화하는 것도 좋은 생각입니다. 또한 편리한 오픈 소스 XML 파싱 라이브러리를 사용하여 사용법 및 코딩. 당신은 올바른 접근 방식을 가지고 있습니다. –

답변

1

저는 이미이 문제에 직면 해 있으며 비슷한 것을했습니다. 나는 그것이 가장 합리적인 해결책이라고 생각한다. 처리 클래스의 인스턴스를 생성하고 설정하려면 (예 : 단계) 주요 서브 루틴/클래스를 담당해야합니다.

하나의 문제는 XML을 구문 분석하기 때문에 현재 소스 코드를 엉망으로 바꿀 수 있습니다. 이를 방지하려면 파싱, 오류 처리 및 설정의 기본값을 담당하는 "구성"클래스를 만들어야합니다.

구성 클래스 인터페이스의

간단한 예 :

메인 서브 루틴 구문 분석 물건 작성되지

class Configuration { 
public: 
    // basic configuration 
    Configuration(); 
    // parsing, DTD validation 
    void parse(const std::string& filename); 
    // get some value 
    // you can provide default value if necessary 
    // or you can have some more robust accessing methods 
    // depends on complexity of your settings 
    int getSomeValue(int default); 
    ... 
}; 
: 데이터가 별도로있는 것을

void main() 
{ 
    Configuration config; 
    config.parse("path/to/config.xml"); 

    Step1 step1(); 
    Step2 step2(); 

    int someValue = config.getValue(5); 
    step1.setSomeValue(someValue); 
    ... 

    step1.process(); 
    step2.process(); 
    ... 
} 
0

어떤 종류의 dependency injection을 사용하십시오. 당신이 객체를 단계로 XmlParser 통과하기로 결정하는 경우

, 다음 예는 다음과 같이 표시됩니다

int main() 
{ 
    XmlParser xmlParser(); 

    Step1 step1(xmlParser); 
    Step2 step2(xmlParser); 


    step1.setValue(); 
    step2.setValue(); 

    step1.process(); 
    step2.process(); 
} 

당신이 당신의 단위 테스트의 단계 개체에 대한 모의 객체를 전달할 수 있기 때문 좋다.

+0

. 그러나이 방법을 사용하면 단계의 생성자를 수정하거나 기존 단계 클래스의 하위 클래스를 도입해야합니다. 맞아? 어떻게 setValue() 메소드를하는지 궁금합니다. – olidev

+0

@devn 예, setValue 메소드 대신 생성자를 수정하십시오. setValue 내부에서 xml 파일을 구문 분석하고 값을 설정합니다. –

관련 문제