cppunit与组合模式

     首先看一下类的继承结构吧(斜体代表抽象类):
cppunit与组合模式 - 绚丽也尘埃 - 处女地
      最后存在于内存中的TestSuite和TestCaller对象都是从Test派生而来,TestSuite有这样一个属性:
private:
  CppUnitVector<Test *> m_tests;
      作为component,它可以有很多leaf节点,但是由于它也是从Test派生而来,所以它又可以成为别的component的页节点。
      cppunit运行时,会将一个TestSuite的所有子节点都运行完,不管其是component还是leaf。它能这样做关键在于它的run函数,TestSuite并没有实现自己的run函数,它从TestComponent继承run函数,TestComponent的run函数实现如下:
void
TestComposite::run( TestResult *result )
{
  doStartSuite( result );
  doRunChildTests( result );
  doEndSuite( result );
}
        关键在于第二句,doRunChildTests函数实现如下:
void
TestComposite::doRunChildTests( TestResult *controller )
{
  int childCount = getChildTestCount();
  for ( int index =0; index < childCount; ++index )
  {
    if ( controller->shouldStop() )
      break;

    getChildTestAt( index )->run( controller );
  }
}

注意最后一句,如果getChildTestAt( index )得到的是一个TestSuite对象,那么它又会调用上面的TestComponent::run,这样迭代下去;如果是一个TestCaller对象,那么就会调用TestCaller::run函数,其实现代码如下:
/// Run the test and catch any exceptions that are triggered by it
void
TestCase::run( TestResult *result )
{
  result->startTest(this);

  if ( result->protect( TestCaseMethodFunctor( this, &TestCase::setUp ),
                        this,
                       "setUp() failed" ) )
  {
    result->protect( TestCaseMethodFunctor( this, &TestCase::runTest ),
                     this );
  }

  result->protect( TestCaseMethodFunctor( this, &TestCase::tearDown ),
                   this,
                   "tearDown() failed" );

  result->endTest( this );
}

      由此可以看出TestSuite和TestCaller的run函数的各自实现是很关键的,这样可以保证整棵树完整被运行。顺便提一下,TestComposite这个类只有一个“std::string m_name”属性,但是它却能实现run函数,如果让我自己来设计的话,我可能会将这个run函数的详细实现放到TestSuite对象中,因为TestSuite才有保存Test的容器。但是TestComposite实现这个函数有其合理性。
      另外还有一处用到了工厂模式。TestFactoryRegistry从TestFactory派生,同时其有一个属性:
  typedef CppUnitSet<TestFactory *, std::less<TestFactory*> > Factories;
  Factories m_factories;
       所以工厂也可以组成一棵树,大工厂包含小工厂,小工厂再包含小工厂。工厂的makeTest方法返回的是TestSuite对象,所有一个树形的工厂生产出来的TestSuite对象也会维持其相应的树状。cppunit也提供了这样一个宏来简化我们的操作,该宏定义如下:
#define CPPUNIT_REGISTRY_ADD( which, to )                                     \
  static CPPUNIT_NS::AutoRegisterRegistry                                     \
             CPPUNIT_MAKE_UNIQUE_NAME( autoRegisterRegistry__ )( which, to )
当然我们也可以自己手工来操作。比如这样:
CPPUNIT_NS::TestFactoryRegistry::getRegistry("My Test").addRegistry("All Tests");
这样就有意思地将"All Tests"变成了"My Test"工厂的子工厂。
       最后用到组合的模式的地方是protectchain,这个类从protector派生,其内部又有一个deque容器保存protector指针,这样就可以极大地扩展protectchain。不过cppunit中起作用也就是一个default protector,并没有复杂的应用。
源码来自:https://pan.quark.cn/s/a3a3fbe70177 AppBrowser(Application属性查看器,不需要越狱! ! ! ) 不需要越狱,调用私有方法 --- 获取完整的已安装应用列表、打开和删除应用操作、应用运行时相关信息的查看。 支持iOS10.X 注意 目前AppBrowser不支持iOS11应用查看, 由于iOS11目前还处在Beta版, 系统API还没有稳定下来。 等到Private Header更新了iOS11版本,我也会进行更新。 功能 [x] 已安装的应用列表 [x] 应用的详情界面 (打开应用,删除应用,应用的相关信息展示) [x] 应用运行时信息展示(LSApplicationProxy) [ ] 定制喜欢的字段,展示在应用详情界面 介绍 所有已安装应用列表(应用icon+应用名) 为了提供思路,这里只用伪代码,具体的私有代码调用请查看: 获取应用实例: 获取应用名和应用的icon: 应用列表界面展示: 应用列表 应用运行时详情 打开应用: 卸载应用: 获取info.plist文件: 应用运行时详情界面展示: 应用运行时详情 右上角,从左往右第一个按钮用来打开应用;第二个按钮用来卸载这个应用 INFO按钮用来解析并显示出对应的LSApplicationProxy类 树形展示LSApplicationProxy类 通过算法,将LSApplicationProxy类,转换成了字典。 转换规则是:属性名为key,属性值为value,如果value是一个可解析的类(除了NSString,NSNumber...等等)或者是个数组或字典,则继续递归解析。 并且会找到superClass的属性并解析,superClass如...
基于遗传算法辅助异构改进的动态多群粒子群优化算法(GA-HIDMSPSO)的LSTM分类预测研究(Matlab代码实现)内容概要:本文研究了一种基于遗传算法辅助异构改进的动态多群粒子群优化算法(GA-HIDMSPSO),并将其应用于LSTM神经网络的分类预测中,通过Matlab代码实现。该方法结合遗传算法的全局搜索能力改进的多群粒子群算法的局部优化特性,提升LSTM模型在分类任务中的性能表现,尤其适用于复杂非线性系统的预测问题。文中详细阐述了算法的设计思路、优化机制及在LSTM参数优化中的具体应用,并提供了可复现的Matlab代码,属于SCI级别研究成果的复现拓展。; 适合人群:具备一定机器学习和优化算法基础,熟悉Matlab编程,从事智能算法、时间序列预测或分类模型研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①提升LSTM在分类任务中的准确性收敛速度;②研究混合智能优化算法(如GAPSO结合)在神经网络超参数优化中的应用;③实现高精度分类预测模型,适用于电力系统故障诊断、电池健康状态识别等领域; 阅读建议:建议读者结合Matlab代码逐步调试运行,理解GA-HIDMSPSO算法的实现细节,重点关注种群划分、异构策略设计及LSTM的集成方式,同时可扩展至其他深度学习模型的参数优化任务中进行对比实验。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值