2013-08-30 2 views
0

제목이 약간 불투명하게 들리고 용어에 대해 잘 모릅니다. 하지만 문제는 다음과 같습니다. 현재 여러 모듈로 구성된 소프트웨어의 라이센스 확인 기능을 구현 중입니다. 예를 들어, 함수 호출은 License.IsModuleEnabled(m As Module)과 같습니다. 코드는 VB.NET에 있습니다.소프트웨어 라이센스 프로젝트 : 순환 종속성을 피하는 방법

이제는 한 모듈이 다른 모듈을 전제 조건으로 요구하는 것이 일반적입니다. 예를 들어 ModuleA를 실행하려면, ModuleB도 활성화해야합니다. 그래서 Module 클래스에서 나는 Module의 목록 인 RequiredModules라고하는 공개 번호를 가지고 있습니다.

Public Function(m As Module) 
    ...  
    For Each module In m.RequiredModules 
     If Not IsModuleEnabled(module) Then Return False 
    End For 
    ... 
End Function 

문제는 (그러나 해결책은 나에게없는) 분명하다 : ModuleA이 ModuleB을 필요로하고, ModuleB이 ModuleA을 필요로하는 경우, 함수는 죽은 루프에 갈 것이다 그래서 IsModuleEnabled() 기능은 다음과 같이 보일 것입니다.

이러한 모듈은 서로 병렬되어 있으므로 이러한 확인 기능을 관리하는 방법에 대한 단서가 없습니다. 우리의 현재 솔루션은 일부 기본 모듈 만 RequiredModules에 나열 될 수 있지만 장기적으로 모든 모듈을 목록에 표시하는 것이 더 좋을 것입니다.

+0

ModuleB를 활성화하지 않고 ModuleA를 활성화해야합니까? – Surveon

+0

모듈 및 해당 종속 모듈을 반복하는 루프를 작성하여 고유 한 모듈 이름의 맵을 작성할 수는 없습니까? 모듈이 이미지도에 있으면 건너 뜁니다. 이 루프가 끝나면 새로 작성한 맵을 반복하여 부울 검사를 수행하십시오. –

+0

대신 true 또는 false를 반환하면 모듈 이름이 호출 된 이름인지 확인할 수있는 종속성 모듈의 이름을 반환 할 수 있습니다. 연속 루프를 중지하려면 true 또는 false 이외의 값을 반환해야합니다. – Sorceri

답변

0

라이센스가 이미 검증 된 모든 모듈을 나열한 세트를 작성하고 잠재적 인 중복 검증을 호출하기 전에이 세트를 체크인하십시오. 세트에 값이 없으면 검증 된 모듈의 이름을 검증하고 추가하십시오.

검증을 위해 목록 모듈을 작성하는 또 다른 비슷한 세트가 의도적으로 실패 했으므로 이러한 상황에서도 끝없는 반복을하지 않을 것입니다.

이것은 루프를 깨기에 충분할 때까지 지식이 집합에 계속 축적되므로 검증이 병렬로 발생하는 경우에도 작동해야합니다.

+0

감사합니다. – tete