2009-07-19 9 views
1

수학 방정식을 풀기위한 일반적인 알고리즘을 구현하는 DLL이 있습니다 (예 : A). 나는 수학 방정식을 구현하는 B와 같은 또 다른 DLL을 가지고있다. DLL B는 방정식을 풀기 위해 DLL A를 사용하지만 DLL B는 주어진 방정식을 DLL A에서 실행할 수 있어야한다 (DLL A는 몇 가지 수치 접근법과 " 원하는 방정식의 단계로 주어진 방정식에 다른 값을 시도합니다. " 이제 DLL A는 DLL B를"알아야 "하고 그 반대도 마찬가지입니다.DLL 간의 상호 작용

"나쁜"디자인입니까? 아마추어적인 코사인 같은 코드에 대해 생각할 수 있습니까? 무엇을 할 것입니까? (DLL A는 수학 방정식을 구현하는 다른 다른 DLL에서 사용하는 일반적인 알고리즘을 구현한다는 점에 유의하십시오)?

감사 다윗은 DLL A가 명시 적으로 DLL B에 대해 알아야 할 필요가 있다는 이유가 없다

답변

1

, 그냥 그것을 해결하기 위해 주어졌다 방정식을 평가 할 수있는 인터페이스를 필요로한다.

인터페이스는 함수 서명으로 지정 될 수 있으며 적절한 함수에 대한 포인터가 B에서 A로 전달되거나 추상 클래스로 표시 될 수 있으며 실제로 유도 된 인스턴스가 될 수있는 포인터 또는 참조가 될 수 있습니다. B에서 A로 전달됨.

상호 의존적 인 dll을 가질 수는 있지만 일반적으로 좋지 않습니다. 이 경우 필자는 그것이 필요하다고 생각하지 않는다.

0

좋은 질문입니다. 예, 나쁜 디자인 일 것입니다. 두 솔루션 :

    두 개의 DLL (한 B에 의해 사용되는 부분과 B를 사용하는 다른 부분)에 같은 DLL
  • 분할 A의
  • 넣어 모든

당신은 더에서 찾을 수 있습니다 '주기적'및/또는 '비 주기적'의존성에 대한 인터넷 검색을 통한이 주제

1

많은 다른 사람들이 A를 사용하고 있기 때문에 A는 오래된 dll 인 것으로 보입니다. 나쁜 것은 B를 명시 적으로 호출 할 수 있도록 A를 변경해야한다는 것입니다.이 변경은 A에서 계속해서 변경을 수행 할 것이라는 신호일 수 있습니다. A를 변경하면 다른 모든 dll을 다시 빌드해야하기 때문에 나쁜 소식입니다.

B (가상, 콜백, 템플릿)에 제공하는 모든 양식의 콜백을 도입하여 B가 방정식을 실행하는 방법이나 방정식을 해결하는 방법을 추상화해야합니다. A는 나이가 많고 아마도 더 많이 사용되었으므로 B에 갈 것입니다. 여기 찾기가의 클래스 일부 의사 코드는, 식 B의 종류는 다음과 같습니다

solver=new Solver; 
equation=new Equation(&solver); 

찾기 추상 인터페이스의 일종을 구현해야합니다. 최상의 솔루션은 언어와 프레임 워크에 따라 다릅니다. "의존성 반전 원리"또는 "의존성 주입"을위한 구글.

1

이 문제 (패키지 간 구현의 순환 종속성)는 정확히 Dependency Inversion Principle (DIP)이 생성 된 이유입니다. Charles Bailey는 DIP를 사용하여 종속성을 깨뜨리는 솔루션을 제공했습니다. 두 개의 구체적인 클래스를 서로 직접 연결하는 대신 (클래스 또는 함수, DIP 적용시 큰 차이는 없음) 추상화에 연결하십시오.

이 경우 우리는 "수학 함수"를 정의하고 solver DLL에서 소비하는 인터페이스를 가지고 있습니다.우리는 또한 "솔버 알고리즘"을 정의하고 함수 DLL에 의해 소비되는 인터페이스를 가지고 있습니다. 구체적인 클래스/함수는 추상화에 따라 달라집니다. C++ 용어로 이것들은 인터페이스가 될 것이고 함수 DLL에서 메소드를 호출 할 때, 해석기는 "해석기 인터페이스"에 대한 포인터로 함수에 전달됩니다. 이 함수는 솔버 인터페이스의 메소드를 호출하여 해당 지점에서 솔버로 콜백합니다. 마찬가지로, 해법은 수학 함수 인터페이스에 대한 포인터를 취하는 클래스를 가지며 적절한 시간에 함수로 다시 호출합니다.

Bob Martin의 저서 Agile Principles, Patterns and Practices in C#은 DIP를 비롯한 이러한 객체 지향 디자인 원칙을 다룹니다. 그는 실제로이 원리들을 보여주는 구체적인 예를 가지고 있습니다. 이 책은 C# (초판 Java 사용)을 사용하지만 C++에도 동일한 원리와 방법이 적용됩니다.

0

당신은 DLL A는 콜백 인터페이스를 게시 콜백 패턴을 구현하고 DLL B 인터페이스에 따라 콜백 메소드를 구현하고 A.에게

  • 를 호출 할 때 포인터를 공급하는 경우에 나쁜 디자인 아니다 장기 실행 함수에 대한 진행 콜백은이 패턴의 일반적인 사용법입니다.
  • 솔버와 같은 공동 작업 루틴과 콜백 주입 주입 알고리즘 (다른 인터페이스와의 일치 가능성이 있음)은 또 다른 일반적인 예입니다.
+0

DLL이 헤더 파일 (예 : 인터페이스)을 공통적으로 가지고 있어도 괜찮지 만 링크 시간 상호 의존성이있는 경우에는 끔찍한 일입니다. A가 B에서 내 보낸 함수를 가져오고 B가 가져 오는 동안 함수가 A에서 내 보낸 – ChrisW