数据驱动与数据抽象

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的存在,本质是在做抽象,抽象的好处就不言而喻了,我更喜欢把它叫做“数据抽象”哈哈。

 

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

转载于:https://www.cnblogs.com/cothik/p/4227264.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值