2013-03-26 110 views
0

我正在建立一个图书馆,可以将复杂的文件解析成数据模型。在解析期间以及在数据结构的一些其他操作期间,我正在构建某些可能发生的消息(信息,警告,错误)。图书馆信息处理

我需要一种方式让图书馆的用户获取这些消息。所有我想到的东西归结为一些静态事件或这些消息的静态列表。但是我希望数据结构的每个对象都有自己的消息队列。

一个例子:

class Program 
{ 
    static void Main(string[] args) 
    { 
     CalibData cd1 = new CalibData(); 
     cd1.LoadFile(@"C:\tmp\file.ext"); 
     var messageList = cd1.GetMessages(); 
     cd1.DoOtherStuff(); 


     CalibData cd2 = new CalibData(); 
     cd2.LoadFile(@"C:\tmp\file2.ext"); 
     cd2.LoadFile(@"C:\tmp\file3.ext2"); 

     messageList = cd1.GetMessages(); //Do other stuff could have produced new Messages 
     var messageList2 = cd2.GetMessages(); 

    } 
} 

你有关于如何实现这样behavoir有什么建议?我需要在每个实例内全局访问的东西,但每个实例都有另一个全局消息传递者。

附加信息: Internall我正在使用一个ANTLR解析器,它可以生成很多对象(50.000+)。一旦创建了数据结构,就会在对象上设置很多交叉引用等。我的主要问题是,我必须创建一个静态成员来处理这个问题,或者从LoadFile()传递一个非常深入我的函数调用中的信使的解析器,交叉引用等。在我的opionion中,这是一个相当不好的选择。更改设计不是一种选择,因为我的问题更多。数据结构存储在2个文件中(1个文件=描述,其他文件=数据)。所以,我可以打电话给像

CalibData cd = new CalibData(); 
cd.LoadFile("description file"); //after this call the datastructure is built, but it hasn't got any value data yet 
cd.LoadFile("data file") //now the structure also has value data 
cd.ClearData(); 
cd.LoadFile("yet another data file"); //same structure different data 

回答

1

它看起来像你的LoadFile方法目前并不返回任何东西 - 为什么不把它返回一个包含错误,警告等数据结构?不需要全局或静态的任何东西 - 甚至是持久的。只是方法调用的结果。

其实,我可能改变这种略带让一个单独的类(而不是模型本身)负责装载和LoadFile调用将返回一个包含结果:

  • 信息和错误
  • 由此产生的模型对象

这样,任何时候你有一个模型,你知道它包含了实际的数据 - 而不是它是“准备加载”因为它瓦特ERE。

+0

我想过这个,但模型更复杂。它可以容纳多个模型(每个文件类型一个模型)。我知道设计可以一起改变,但用户需要这种方式,其中大多数是工程师而不是软件开发人员。 LoadFile实际上在CalibData对象的内部生成了东西,而不是返回一些东西。 – metacircle 2013-03-26 13:52:07

+0

@metacircle:在我看来,这里的背景比你告诉我们的更多,使得不可能真正满意地回答。是的,我明白'LoadFile'在'CalibData'内部产生了一些东西 - 我说这是一个糟糕的设计,但是*即使你想保持这种设计,你可以使用'LoadFile'的返回值来指示错误和警告。 – 2013-03-26 13:53:45

+0

我编辑了我的第一篇文章,希望更清楚。 – metacircle 2013-03-26 14:16:49