数据驱动与数据抽象

1、数据驱动

  考虑这样一个场景:

  我们同时需要从buffer1、buffer2、buffer3中分别取出数据,并应用任意的逻辑计算得到一个Result,我们要怎么做?

  

  ①不经过大脑的话,应该是这样

    {

      if(is buffer1)

        access(buffer1)

      if(is_buffer2)

        access(buffer2)

      ...

    }

  这样的逻辑的确可以解决当前问题,然而某一天早上突然被告知需要buffer4、buffer5这样的东西,就只能继续和if else较劲。

  ②再来看下面一种解法
   container{buffer1,buffer2,buffer3,...,buffern};

   foreach(buffer in container){

    access(buffer)

    ...

   }

  对比之下应该看出来第1种解法的缺陷,它的根本问题就在于试图用逻辑去表达数据(把数据变成了逻辑负担),第二中解法则比较灵活,也叫数据驱动编程。

  

2、元数据(MetaData)

  再考虑:假如每个buffer拥有数据类型是不同的会怎样?

  ...

  if(buffer1)

    visitbuffer1(buffer1)

if(buffer2)

    visitbuffer2(buffer)

  ...

  

  if else 用起来太方便了 - -!(这种做法不用说也知道很恶心了)。

  考虑我们需要的是什么,其实只是从某个buffer中(怎么)拿到(怎样)的数据。

  我们可以设计一种统一的数据类型来达到上面的目的:

  MetaData

  {

    int : slot    //该数据所在的buffer位于container位置

    int : stripe   //访问幅度

    int : format   //数据格式

    int : index   //数据索引

  }

  然后我们可以做一个子例程来存取Metadata

  output VisitMetaData(MetaData data)

  {

     buffer = container[data.slot];

     data = buffer[data.strip*data.index];

     switch(format)

     {

      ...

     }

     return output(data);

  }

  这样就可以不用关心有多少数据类型,甚至不用知道buffer和container的存在,本质是在做抽象,抽象的好处就不言而喻了,我更喜欢把它叫做“数据抽象”哈哈。

  关于数据组织方面可以参考《信息组织》这本书。

时间: 2024-07-28 19:39:27

数据驱动与数据抽象的相关文章

【工业串口和网络软件通讯平台(SuperIO)教程】六.二次开发导出数据驱动

SuperIO相关资料下载:http://pan.baidu.com/s/1pJ7lZWf 1.1    导出数据接口的作用 在数据集成系统项目中,要么是自已集成其他厂家的设备,要么是其他厂家集成自己家的设备,在没有统一的标准前提下,就会有各种集成数据的格式.为了满足此类的场景,为设备输出数据专门设计了接口,开发者可以继承该接口,设备在处理完数据后,会把数据自动传输到该接口,可以按规定的数据格式进行输出了. 1.2    接口功能说明 开发设备输出接口,主要考虑到在集成项目中,集成过程中或被集成

Python Unittest与数据驱动

python中有一个装饰器类DDT,通过它我们可以复用代码,达到数据驱动测试的目的,该类的官方介绍可以参考 http://ddt.readthedocs.io/en/latest/index.html 安装ddt方式很简单,直接在cmd命令行输入:pip install ddt ,完成安装即可. 下面看一个简单的例子: 1 import unittest 2 from practise.myTestPractice.api_login import * 3 import ddt 4 5 6 @d

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员)、拷贝构造函数

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员).拷贝构造函数  从概念上将,可以认为构造函数分为两个阶段执行: 1)初始化阶段: 2)普通的计算阶段.计算阶段由构造函数函数体中的所有语句组成. 一.构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 1.对象成员及其初始化 <span style="font-size:14px;">#include <iostream> using namespace std;

C++ Primer 学习笔记_56_类与数据抽象 --消息处理示例

复制控制 --消息处理示例 说明: 有些类为了做一些工作需要对复制进行控制.为了给出这样的例子,我们将概略定义两个类,这两个类可用于邮件处理应用程序.Message类和 Folder类分别表示电子邮件(或其他)消息和消息所出现的目录,一个给定消息可以出现在多个目录中.Message上有 save和 remove操作,用于在指定Folder中保存或删除该消息. 数据结构: 对每个Message,我们并不是在每个Folder中都存放一个副本,而是使每个Message保存一个指针集(set),set中

C++ Primer 学习笔记_57_类与数据抽象 --管理指针成员

复制控制 --管理指针成员 引言: 包含指针的类需要特别注意复制控制,原因是复制指针时只是复制了指针中的地址,而不会复制指针指向的对象! 将一个指针复制到另一个指针时,两个指针指向同一对象.当两个指针指向同一对象时,可能使用任一指针改变基础对象.类似地,很可能一个指针删除了一对象时,另一指针的用户还认为基础对象仍然存在.指针成员默认具有与指针对象同样的行为. 大多数C++类采用以下三种方法之一管理指针成员: 1)指针成员采取常规指针型行为:这样的类具有指针的所有缺陷但无需特殊的复制控制! 2)类

C++ Primer 学习笔记_55_类与数据抽象 --析构函数

复制控制 --析构函数 引言: 在构造函数中分配了资源之后,需要一个对应操作自动回收或释放资源.析构函数就是这样的一个特殊函数,它可以完成所需的资源回收,作为类构造函数的补充. 1.何时调用析构函数 撤销类对象时会自动调用析构函数: Sales_item *p = new Sales_item; { Sales_item item(*p); //调用复制构造函数 delete p; //调用指针p的析构函数 } //调用对象item的析构函数 动态分配的对象只有在指向该对象的指针被删除时才撤销,

C++ Primer 学习笔记_53_类与数据抽象 --友元、static成员

类 --友元.static成员 一.友元 友元机制允许一个类将对其非公有成员的访问权授予指定的函数或类(对未被授权的函数或类,则阻止其访问):友元的声明以关键字friend开始,但是它只能出现在类定义的内部.友元声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成员,所以它们不受其声明出现部分的访问控制影响. [最佳实践] 通常,将友元声明成组的放在类定义的开始或结尾是个好主意! 1.友元关系:一个例子 假设一个窗口管理类Window_Mgr可能需要访问由其管理的Screen对象的内部

WEB接口测试之Jmeter接口测试自动化 (三)(数据驱动测试)

 接口测试与数据驱动 1简介 数据驱动测试,即是分离测试逻辑与测试数据,通过如excel表格的形式来保存测试数据,用测试脚本读取并执行测试的过程. 2 数据驱动与jmeter接口测试 我们已经简单介绍了接口测试参数录入及测试执行的过程,因为大量的测试脚本与测试数据内聚在一起,使得我们的测试脚本的可移植性及可维护性变得很不好,所以我们接下来采取了csv格式表格保存测试数据来驱动测试的方式. 2.1 新建一个csv文件 新建一个txt文档文件,重命名文件,修改文件后缀名为csv,如test.csv,

模拟Vue之数据驱动3

一.前言 在"模拟Vue之数据驱动2"中,我们实现了个Observer构造函数,通过它可以达到监听已有数据data中的所有属性. 但,倘若我们想在某个对象中,新增某个属性呢? 如下: 那么岂不是,新增的infor属性,以及它的对象属性,没有得到监听. 此时,应该怎么处理呢? 通过走读Vue源码,发现他是采用另增属性方法$set实现的. 就是说,如果我们采用常规方法为对象增加属性(如上),我们没法得知并监控它,所以,我们为每个对象扩展一个$set方法,用于另增属性使用,即可,如下: da