关于面向对象思想中二维数组如何与对象映射思路的思考

原创 2013年10月20日 11:57:26

前几天,看了一段代码,很有感触,于是自己进行了些思考,现将之撰文写出与诸君共勉。

这段代码是实现什么需求的呢?

需求是 设备网元中有多个单板,单板上对应多个命令字。我要随意的给对应单板上对应命令字的指令下发到设备上。

大家不用知道所谓的网元和单板是什么,反正该需求的目的就是要实现一个二维数组中的数据发出去。

按照正常的设计思路,我会设计一个二维数组,如下:

Param[MAX_BOARDID][MAX_CMDID]。

1)假如我要下发该数组中对应的一个元素到其他模块中,我会像如下这样来书写:

Send(Param[0][0]);

2)假如我要对一块单板下发所有的命令,我会像如下编写:

for (int i = 0; i < MAX_CMDID; i++)

{

    Send(Param[0][i]);  

}

3)假如我要对一个单板按照顺序下发所有的命令,我会多定义一个优先级表,在组成数组前将Param[0]排好序,伪码如下:

static const OrderTable[];  //优先级表

SetParamByOrder(data, OrderTable);  //优先级作为入参,也可以直接在函数中调用,这里只是示例一下。

然后再执行上例的for循环。

4)假如我要对一个单板只下发另一单板以前下发过的命令。

那就要这么来写:

for (int i = 0; i < SizeofAnotherBoardParam; i++)

{

       SetParamToMyBoard(i);

}


我们来看看这个原作者代码如何写的?

首先他定义了一个最小的元素Param,这里只有Get/Set,其类结构如下:

ParamGroup                  组   --包含50个ParamRepository,通过BoardID查询

ParamRepository         库    --包含5个Param,通过CmdID查询

Param                             元素



另外设计了ParamConfig类,实现对以上元素的管理。

ParamSynchronizer类,实现元素的创建,类似于工厂类

ParamPipe类,实现与设备通讯

ParamSwitcher类,实现倒换时处理,可以保存参数。

还有CfgParam实现传参作用,包含元素BoardId, CmdID


我们来看下上面的假如这里如何实现的。

1)假如我要下发该数组中对应的一个元素到其他模块中,我会像如下这样来书写:

ParamSynchronizer()->ParamPipe->Send(CfgParam);

2)假如我要对一块单板下发所有的命令,我会像如下编写:

int len = GetSizeOfParamRepository;

for (int i = 0; i < len; i++)

{

     CfgParam = ParamRepository.At(i);

     ParamSynchronizer()->ParamPipe->Send(CfgParam);

}

3)假如我要对一个单板按照顺序下发所有的命令,我会多定义一个优先级表,在组成数组前将Param[0]排好序,伪码如下:

static const OrderTable[];  //优先级表

在ParamRepository中添加时调整顺序即可。

然后再执行上例的for循环。

4)假如我要对一个单板只下发以前下发过的命令,那我只能先想办法将以前下发过的命令保存下来,然后才能下发。

在ParamRepository中已经包含了所有的历史命令

int len = GetSizeOfParamRepositoryAnotherBoard;

for (int i = 0; i < len; i++)

{

     CfgParam = ParamRepositoryAnotherBoard.At(i);

     ParamSynchronizer()->ParamPipe->Send(CfgParam);

}


上面用面向对象的方式把二维数组分解了一下,大家可以看一下,

其好处是一目了然,代码结构清晰了,在应用层只关心自己的内容,

循环遍历数组边界的东西没有,这些东西都隐藏在单独的类里,代码可读性,可维护性,

及犯错误的几率都小了很多。


仔细回味,有感:This is 面向对象的好处啊。











深入理解面向过程与面向对象的思想差异与各自特色

一、什么是面向过程 面向过程是一种思维方式。当试图通过面向过程解决问题时,我们的关注点在于问题解决的流程,重在这个过程的控制,需要用大量的模块(模块化的思想源自于硬件,在C语言中是函数)将大问题拆解,...
  • zhangliangzi
  • zhangliangzi
  • 2016年04月22日 16:48
  • 2072

关于“人工智能”的思考

(一点点想法和思考)       “人工智能”,窃以为是计算机科学最引人入胜的一个方向,可惜的是我们还没能看到有任何突破性的进展,就像网易公开课对“斯坦福机器学习”课程的描述一样,“人工智能”似乎遇...
  • Dark_Scope
  • Dark_Scope
  • 2013年01月12日 21:29
  • 2934

动态规划总结与思考

这是一篇关于动态规划的思考文章,主要讲了我对动态规划的一些思考与总结。...
  • qiuzhijieluojianping
  • qiuzhijieluojianping
  • 2015年01月01日 10:57
  • 775

超级容易理解!!!Java的面向对象思想———类与对象。

在初学者学Java的时候,面向对象很难让人搞懂,那么今天小编就来为大家把这个思想来为大家用极为简单的方法理解吧。 首先我们来简单的阐述面向对象的思想。 面向对象: 官方的语言很抽象,我们把官方的...
  • a907691592
  • a907691592
  • 2016年06月07日 16:17
  • 14506

测试用例思考

关于测试用例的思考   说到测试用例,我们大家都很有发言权,我们也有很多的困惑。关于如何编写测试用例,我还是从我曾经在博客上写的两篇文章开始说起: 两篇文章 第一篇:simple,还是simp...
  • qq_31362837
  • qq_31362837
  • 2015年10月11日 19:50
  • 555

关于大学生道德现状的思考

关于大学生道德现状的思考  [摘要]大学生是新生代的力量,是未来社会的主要生力军。大学生道德状况如何,将直接关系到中华民族的整体素质,关系到和谐社会建设的进程,关系到社会主义现代化建设能否成功,关系到...
  • EX_NET
  • EX_NET
  • 2006年02月09日 17:26
  • 12261

Hibernate旅程(五)Hibernate映射--基本类映射和对象关系映射

回想一些我们在没有学习ssh的时候,我们建立数据库的表时,首先是数据库建模E-R图,然后再通过实体模型来建立关系模型,再建立相应的表。实体间存在三种关系,一对一,一对多(或者说多对一),多对多。而如今...
  • lovesummerforever
  • lovesummerforever
  • 2014年03月10日 10:40
  • 16130

如何理解面向对象思想

我们学习JAVA语言必须要掌握对象和类,这样的话就可以更深层次的理解JAVA这种面向对象的程序开发理念,从而更好更快  地掌握JAVA的变成思想和方法。掌握类和对象是JAVA语言变成的基础。那么,...
  • LK764265808
  • LK764265808
  • 2016年07月08日 11:05
  • 4689

【C#】——面向对象思想

C#这个东西听说时还是当时自己学C语言的时候,那时甚至都不知道什么叫C++,什么叫Java。更别说是面向对象的思想了。之前学到的都是面向过程的技术,实现一个功能要一点一点去理清逻辑,然后才能勉强的写出...
  • u013045214
  • u013045214
  • 2015年02月01日 19:22
  • 2643

文件对象和文件映射对象

1.内存映射文件          内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,只是内存文件映射的物理存储器来自一个已经存在于磁盘上的文...
  • liang08114
  • liang08114
  • 2016年04月21日 12:02
  • 1063
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于面向对象思想中二维数组如何与对象映射思路的思考
举报原因:
原因补充:

(最多只允许输入30个字)