是否有设计模式或语言功能 (c#) 来有效地确定一组 objects 是否执行了一个操作

Is there a design pattern or language feature (c#) to efficiently determine if a set of objects have performed an action

我在将其表述为标题问题时遇到了一些麻烦。我会尽可能简洁,不会遗漏任何内容。

假设您有一个 class,它作为这些组件的大型数据结构中的一个组件。

每个组件可以有一个或多个 'inputs',以及零个或多个 'outputs',两者都只是同一 class 的其他实例。一旦所有输入都通知它它们已经执行了它们的操作,组件就应该执行一个操作。

class Foo
{
   void checkIn()
   {
        // if all inputs have checked in, takeAction() and then checkIn() with outputs
   }

   void takeAction()
   {
   }
}

这不是一个严格的层次结构,可以有像这样的菱形依赖关系:

          A
        /   \
       B     C
        \   /
          D

其中 B 和 C 都依赖于 A,D 依赖于 B 和 C。D 甚至可以将 A、B 和 C 作为输入。这不是问题的关键,但我指出它是因为如果它是一个简单的层次结构,就不会有问题。

这些组件会有很多,这将在real-time模拟场景中使用,因此时间效率至关重要。 Space效率也很重要,但不如时间重要。

最后,除了知道自己已完成任务外,组件不需要输入任何信息。它不需要指向输入的指针,也不需要访问它的数据,而且大多数情况下,它们之间的关系之所以存在,只是因为它们都在对它们外部的数据进行操作,这需要一个或多个操作才能完成,然后才能进行下一个操作.

目前,我的解决方案是让每个组件只存储继续进行所需的输入总数。

   void checkIn()
   {
        checkInCount++;
        if(checkInCount >= totalCheckInsNeeded)
        {
            performAction();
            // checkIn with outputs
            checkInCount = 0;
        }
   }

这有助于提高效率 space,但我不喜欢没有对输入负责的情况。该设计当然是为了确保在初始化数据结构以及创建和连接组件时所有 checkInCounts 都是正确的,并且永远不会出现输入结束两次检查的情况(从而达到totalCheckInsNeeded 在所有输入都签入之前)。我只是不喜欢这样,如果在初始化过程中存在错误,那么在可能包含数十万个组件的大型结构中追踪起来可能真的很困难。

我想到的任何缓解此问责制问题的解决方案都将涉及检查输入列表的内容,从表面上看,这在时间和 space 上都效率低得多。我只想在调试版本的输入解决方案列表中添加,但如果出现未知错误,我宁愿有一种方法来检测问题并优雅地失败,而不是让程序突然出现而忘记它已损坏状态。

我希望有一种我没有考虑过的设计模式,或者我还不知道的 C# 语言特性。 (从 C++ 背景到 C# 相对较新,并且仍在学习来龙去脉)

由于您主要关心的是单个输入的多次签入,因此您可以使用带有位掩码而不是计数器的方法。通常,您可以使用 int32 或 int64 来限制您只能使用 32/64 个输入。输入完成后,它会清除连接组件中的相应位。如果它试图清除已清除的位,则说明您遇到了错误情况。由于所有位都为零,这意味着所有输入都已处理,您可以触发一个动作。如果需要,可以使用字节数组轻松克服 32/64 限制。有一个难点——如何定义一个对应的位?您可以在输入元素中保留一个位数。如果此输入连接到多个组件怎么办?它应该在所有连接的组件中具有相同的位数。如果你能保证在创建模型的过程中,所有的位数都可以这样设置而不冲突,那这就是最简单的方案了。

     A   B         A must have the same bit number in QWR, B in RTE
    /|\ /|\        A's and B's bit number should not conflict in R
   Q W R T E

另一种占用更多内存的方法是为每个 link 分配单独的位号。这意味着您应该在每个输入中都有一个大小的字节数组。本例中 A 中的 3 个字节。