是否存在一种设计模式或语言特性(c#)来有效地确定一组对象是否执行了某个操作

本文关键字:是否 一组 对象 操作 执行 设计模式 一种 存在 语言 有效地 | 更新日期: 2023-09-27 18:06:06

我有一点麻烦的措辞这作为一个问题的标题。我会尽量简明扼要,不遗漏任何东西。

假设你有一个类,它在这些组件的大型数据结构中充当组件。

每个组件可以有一个或多个"输入",以及零个或多个"输出",它们都只是同一个类的其他实例。组件应该在所有输入都通知它已经执行了操作后执行操作。

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作为输入。这不是问题的关键,但我指出它是因为如果它是一个简单的层次结构,就不会有问题。

将有许多这样的组件,这将在实时模拟场景中使用,因此时间效率是至关重要的。空间效率也很重要,但不如时间来得重要。

最后,组件除了知道它已经完成了它的任务之外,不需要从它的输入中获得任何信息。它不需要指向输入的指针,也不需要访问它的数据,大多数情况下,它们之间的关系存在只是因为它们都在操作它们外部的数据,这些数据需要一个或多个操作才能完成,然后再移动到下一个操作。

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

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

这是为了效率和空间,但我不喜欢没有输入的责任。设计当然是为了确保在初始化数据结构和创建和连接组件时,所有checkincount都是正确的,并且永远不会出现输入最终检入两次的情况(从而在所有输入检入之前达到totalCheckInsNeeded)。我只是不喜欢如果在初始化过程中存在错误,那么在可能包含数十万个组件的大型结构中可能很难追踪到它。

我所想到的任何缓解这个问责问题的解决方案都涉及到根据输入列表进行检查的内容,从表面上看,这在时间和空间上都非常低效。我只会添加用于调试构建的输入解决方案列表,但在出现未知错误的情况下,我宁愿有一种方法来检测问题并优雅地失败,而不是让程序不顾其损坏状态而继续运行。

我希望有一个我没有考虑过的设计模式,或者一个我还没有意识到的c#语言特性。(从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

一个稍微消耗内存的方法是为每个链路分配单独的位号。这意味着在每个输入中应该有一个大小相同的字节数组。