日期:2014-05-20  浏览次数:20682 次

.NET的代码架构对我对代码的特殊封装要求是否支持?
最近在做一个项目,面向教育的。由于业务模型的不确定,要求现在的代码架构是高度flexible(柔韧)的,意思是:不管今后业务逻辑如何变化,当前的代码结构都只需要做最小的改动,方便地加入新的业务逻辑,修改现有的业务逻辑。我目前的开发环境是VS2005 C++,不知.NET是否是更好的选择。不过我是个老程序员,不太熟悉.NET这种最新的技术。
  我现在想实现的一个代码架构,感觉在C++中实现起来有点困难。举例来说:
  有一个函数func1(),每次MOUSE移动时会执行一遍,也可以通过启动一个定时器,定时地执行它,也可以两者混合执行。
  由于func1本身也需要一定的时间开销,我现在想在代码中测试一下func1的执行速度如何。方法是:
  单独启动一个线程TestThread来观察func1`的执行次数。为此,TestThread中定义一个全局变量TestCount, 在func1中对变量TestCount递增.线程TestThread中每休眠一秒钟都检查一次TestCount的值,并打印它。然后,再将TestCount清零。
  这样虽然实现我所想要的功能,但在被测试对象func1中要有一句话是与测试相关的,即:递增TestCount,这给人的感觉就象是被测试对象为了便于测试,必须要有所配合一样。这让我感觉不爽。
  我设想的代码架构应该能实现所有与测试func1有关的代码都在TestThread中出现,以及在启动TestThread的主线程中实现。在func1中没有任何与测试有关的代码,能否实现外部的TestThread线程就对func1进行执行次数的测试?不要告诉我可以在调用func1的所有地方加入测试代码:TestCount=TestCount+1,那样会让代码结构更加混乱!
  为什么我会想到这个问题呢?因为我看到目前我用多线程技术,已经将func1中的测试代码压缩到很少了。设想,如果没有多线程技术,在func1中每次执行时,要递增TestCount,要取系统时间,要累计两次执行func1之间的时间差,要判断这个累计的时间差是否到达1秒,到了一秒还要打印TestCount测试信息,然后清零TestCount. 所有这些工作都转到另一个线程:TestThread中去了,为什么还要留最后一个尾巴:"递增TestCount"呢?

  对此,我希望.Net的高手能指点一下,以解除我的困惑。

  另外,听说,下一代编程语言是直接面向多CPU的,到那时,多线程才是真正的多线程,每个线程分配给不同的CPU运行,现在的单CPU的多线程,实际上是通过操作系统对时间片的轮询管理实现的假的多线程。这种多CPU的编程语言是否能解决我这里提出的问题呢?

------解决方案--------------------
Visual Studio 2010+ C# 4.0, TPL -并行编程库。
Visual Studio 2005+ VC8.0, OpenMP - 开放多处理器库。
------解决方案--------------------
如果只是想观察你的函数的运行时间和次数,用profiling tool观察一下就好了。
如果是想让你的程序能够自动测试某个函数的运行次数,在你的函数外面套一层proxy就可以了吧,把计数的工作都交给proxy做,函数里面不用管。