代码之家  ›  专栏  ›  技术社区  ›  Hemant

如何在C中实现“发布并提交”模式?

  •  1
  • Hemant  · 技术社区  · 15 年前

    在我目前正在处理的类库中,我需要实现一种机制,在该机制中,类用户通过操作颁发者类来获取项:

    class Issuer {
        public Item GetItem () {
            return queue.Pop ();
        }
    }
    
    //at some other place
    var item = issuer.GetItem ();
    //work on item and submit back to Issuer
    

    我如何实现这个模式,以最小化类用户甚至不必提交它的风险?

    我的优先顺序是:

    • 类用户不必显式提交回
    • 类用户必须显式地将其提交回去,但不提交就无法逃脱(异常???)
    • 甚至可以不提交就离开,但设计鼓励用户不要这样做。

    我知道这不是一个明确的问题,但任何建议/设计模式来实现以上都是有帮助的!

    4 回复  |  直到 15 年前
        1
  •  2
  •   Bryan Menard    15 年前

    一种方法是使用 IDisposable 接口。这样,用户就可以利用 using 使用过程中的语句:

    using (var item = issuer.GetItem())
    {
        // Work on item
    } // Item is released on Dispose()
    

    发行者可以简单地监听一个事件来取回项目。但是,如果项目被传递出去,这可能不是您的最佳选择。在这种情况下,一个简单的 Close() Release() 方法(同样是在发行者监听事件的情况下)可能只会做到这一点。

    在大多数情况下,最好是用户以某种方式明确地释放所获得的项目。

    如果一些 不体贴的 用户忽略了发布一个项目,您可以随时返回到 终结器 以及标准的处理模式。但是,你必须 非常小心 不到 复活 项目(定稿后保留参考)。

        2
  •  2
  •   Chris    15 年前

    维护一个已发布项的集合,可能在发布时存储它们,以及它们被发布到的类。这样就不必显式地重新提交该项。 重新提交显然会从已发出的集合中删除。然后,如果发出的集合中仍有项,则可以通过多种方式根据“脏”数据引发异常。 你可以:

    • 如果存储了请求类中的事件(例如窗体关闭事件),则处理该类中的事件
    • 定期为X以上的所有项目添加一个排除项
    • 如果未完成项目的数量超过某个阈值

    我想说的一件事是,可能要研究一个静态的发布者,而不是将其作为实例方法。

        3
  •  2
  •   Jeremy McGee    15 年前

    听起来我可以在这里使用。如何:

    class Item { }

    class Issuer: IDisposable
    {
        Queue<Item> queue = new Queue<Item>();
        List<Item> deliveredItems = new List<Item>();
    
        public Item GetItem()
        {
            Item item = queue.Dequeue();
            deliveredItems.Add(item);
            return item;
        }
    
        public void SubmitItem(Item item)
        {
            deliveredItems.Remove(item);
    
            // do some operation here
        }
    
        public void Dispose()
        {
            foreach (Item item in deliveredItems)
            {
                SubmitItem(item);
            }
        }
    }
    

    一旦您的发卡行被处置,每个尚未提交回的已交付项目将自动提交回。

        4
  •  -1
  •   Tony The Lion    15 年前

    使用事件让颁发者知道某个项目已被获取,并使用事件将其传递回颁发者。

    托尼