제목에 대한 질문으로 문제가 있습니다. 나는 무엇이든 놓치지 않고 가능한 한 간결해질 것입니다.개체 집합이 동작을 수행했는지 여부를 효율적으로 판단 할 수있는 디자인 패턴 또는 언어 기능 (C#)이 있습니까?
이러한 구성 요소의 대용량 데이터 구조에서 구성 요소 역할을하는 클래스가 있다고합시다.
각 구성 요소는 하나 이상의 '입력'및 0 개 이상의 '출력'을 가질 수 있으며 둘 다 동일한 클래스의 다른 인스턴스입니다. 구성 요소는 모든 입력이 자신의 작업을 수행했다는 사실을 알린 후 조치를 수행하기위한 것입니다.
class Foo
{
void checkIn()
{
// if all inputs have checked in, takeAction() and then checkIn() with outputs
}
void takeAction()
{
}
}
이 엄격한 계층없고, 그래서 같은 다이아몬드 종속성이있을 수
B 및 C 둘 다에 의존하고, D는 B 및 C D 모두에 의존 A
/ \
B C
\ /
D
A, B, C를 입력으로 사용할 수도 있습니다. 이것은 질문의 요점이 아니지만 단순한 계층 구조라면 문제가되지 않을 것이기 때문에 나는 그것을 지적하고있다.
이러한 구성 요소는 다양하며 실시간 시뮬레이션 시나리오에서 사용되므로 시간 효율성이 가장 중요합니다. 공간 효율성 또한 중요하지만 시간만큼 중요하지는 않습니다.
마지막으로 구성 요소는 작업을 완료했음을 알지 못하고 입력 한 정보가 필요하지 않습니다. 입력에 대한 포인터 또는 데이터에 대한 액세스가 필요하지 않으며 대부분의 경우 관계가 둘 모두에 대한 데이터 외부에서 작동하기 때문에 하나 이상의 작업이 완료되어야 다음 작업으로 이동하기 때문에 관계가 존재하는 경우가 많습니다 .
현재 나의 해결책은 각 구성 요소가 진행하는 데 필요한 총 입력 수만 저장하도록하는 것입니다.
void checkIn()
{
checkInCount++;
if(checkInCount >= totalCheckInsNeeded)
{
performAction();
// checkIn with outputs
checkInCount = 0;
}
}
효율성과 공간면에서 효과적이지만 입력에 대한 책임은 없습니다. 디자인은 물론 데이터 구조가 초기화되고 구성 요소가 생성되고 연결되어 모든 checkInCounts가 정확하고 입력이 두 번 체크인을 끝내는 상황이 발생하지 않도록하는 것을 의미합니다. 모든 입력이 체크인되기 전에 totalCheckInsNeeded가 필요함). 초기화 프로세스에 버그가있는 경우 수십만 개의 구성 요소가있는 대규모 구조에서 추적하기가 정말 쉽지 않을 것입니다.
이 책임 문제를 완화하는 방법으로는 입력 목록에 대해 확인하는 단계가 포함될 것입니다. 입력 내용 목록은 시간과 공간 모두에서 효율성이 크게 떨어집니다. 난 단지 디버그 빌드에 대한 입력 솔루션 목록에 추가 할 것이지만, 알 수없는 버그가있는 경우, 차라리 문제를 감지하고 정상적으로 실패하는 대신 프로그램을 깨뜨리지 말고 고장났습니다. 상태.
나는 아직 생각하지 못했던 디자인 패턴이나 C#의 언어 기능이 있기를 바란다. (C++ 배경의 C#에 비교적 익숙하지만 여전히 기능과 내용을 배우는 것)
구성 요소가 가질 수있는 종속성 (입력)의 수에는 제한이 있습니까? –
@ SergeyL - 하드 한도가 없습니다. 대부분 3 ~ 10 개의 입력이 있습니다. 20 이상의 상황이있을 수 있지만 이상치가 될 가능성이 있으며, 30 이상이있는 경우 실제 또는 정상적인 사용보다는 성능 테스트 중에있을 것입니다. – nsfnotthrowingaway