MyException - 我的异常网
当前位置:我的异常网» C++ » 有关问题解决——复合检测项目的定义和使用

有关问题解决——复合检测项目的定义和使用

www.MyException.Cn  网友分享于:2015-08-24  浏览:0次
问题解决——复合检测项目的定义和使用

=================================版权声明=================================

版权声明:本文为博主原创文章 未经许可不得转载 

请通过右侧公告中的“联系邮箱(wlsandwho@foxmail.com)”联系我

未经作者授权勿用于学术性引用。

未经作者授权勿用于商业出版、商业印刷、商业引用以及其他商业用途。                   

 

本文不定期修正完善,为保证内容正确,建议移步原文处阅读。                                                               <--------总有一天我要自己做一个模板干掉这只土豆

本文链接:http://www.cnblogs.com/wlsandwho/p/4736084.html

耻辱墙:http://www.cnblogs.com/wlsandwho/p/4206472.html

=======================================================================

这篇文章基于STL容器,并不能面向“HelloWorld”读者。

=======================================================================

因为加了好多的技术群,经常有人问一些奇怪的问题,有时间的时候当然会自己去想一想,模拟实践嘛。

=======================================================================

 先说一下为什么会有这个方案:

  假如有一个项目叫做ABC,

  它是由A、B、C三个子项目组成的,

  子项目A有两条检测规则:“+”是异常,“-”是正常,

  子项目B有三条检测规则:“+”是轻度异常,“++”是中度异常,“+++”是重度异常,“-”是正常,

  子项目C有两条检测规则:“+”是异常,“-”是正常。

  那么问题来了:怎样组织这个项目的组成?

         又怎么组织子项目的检测规则?

         如果又添加一个叫做AC的项目(由A和C组成)又该怎么做?或者添加一个ABCD(由A、B、C、D组成的项目)又该如何处理?

这就是本文要说的东西。

=======================================================================

先自己想想然后再看下面我的分析,毕竟有些东西过程很重要,万一你自己有更好的方法呢。

=======================================================================

其实本文并没有什么技术含量,然而,重要的是思想。

===============================小广告====================================

求工作

  部分技能:Windows平台,VC++、MFC、核心编程、SQL Server,

  期望岗位:技术管理,

  期望地点:青岛高新区。

 

  (不做C#,因为C#不在“MASM==>C/C++==>VC++==>C++/CLI”这个子技能树里。)

=======================================================================

 显然需要详细的分析下,毕竟有的子项目会在不同的项目里出现,对它的修改应该是同步影响的——最好是能且只能存储1份。

=======================================================================

先从子项目入手。

子项目有若干个条件和结果

例如

A可以由正常、异常、无效组成,也可以由正常、轻度异常、中度异常、重度异常、无效组成。

那么子项目的模型肯定是要能变化的、不限定数量。

再仔细考虑一下,重度异常就是重度异常,不存在什么所谓的“重度异常1”、“重度异常2”、“重度异常3”之类的再次划分,

也就是说,一个子项目的每一个条件结果都是一个不可再次分割的元素,也不可能是重复的。

所以

参考值——结果

采用map来存储所有的判断标准:map<参考值,结果>

这样一个map就代表了匿名子项目的判断标准,只知道是一个判断标准,但不知道是哪个子项目的。

由于一个子项目对应一套判断标准,即

子项目名——map<参考值,结果>

这样就完整的表示了一个子项目的所有信息。

下面的结构表示了若干个子项目的集。

map<子项目名,map<参考值,结果>>

=======================================================================

 再看复合项目

项目ABC包含了子项目A,子项目B,子项目C,所以一个项目对应了多个子项目。

项目名——map<子项目名,map<参考值,结果>>

下面的结构表示了所有的项目的详细信息,包括了项目由哪些子项目组成、对应子项目的检测规则、检测规则的详细内容。

map<项目名,map<子项目名,map<参考值,结果>>>

=======================================================================

简单的分析就到这里。

分析后的结果就是:

map<项目名,map<子项目名,map<参考值,结果>>>

不过,要是直接这样用,是人都要发疯的。对内层的访问会吓死人。而且VC++上编译信息也不好看。

(我敢肯定直接用过的人都说好,不信自己动动手。不管你试不试,我反正试了。)

所以要适当的拆分一下。

=======================================================================

适当的信息冗余是可以的,用少量的冗余来得到一定的可读性并且简化编程,这点代价是可以接受的。

拆分的过程就是简化上面的复杂的结构。

=======================================================================

拆分map<项目名,map<子项目名,map<参考值,结果>>>为

multimap<项目名,子项目名>

先拆掉一层map,便于进行项目名——子项目名的访问。在添加一个set来辅助multimap统计项目名的种类,

毕竟multimap不能方便的检索到底有多少种key。(当然你也可以不加。)

(另一个方法是把它拆分为map<项目名,set<子项目名>>,看个人心情了。)

拆分外层map其实是很重要的,只有这样才能重用一个子项目的所有信息。

虽然这实际上是很简单的一步。

 

剩下的结构不变,还是map<子项目名,map<参考值,结果>>来表示一个子项目的所有信息。

(当然内层的map<参考值,结果>也可以单独定义拆分一下。但这个不重要。)

=======================================================================

基本分析就是这个样子,可以

生成项目信息,只包括由哪些含子项目组成。

生成子项目信息,只包括项目名和对应的检测规则。

 

分析是一回事,但编码是另一回事。

======================================================================= 

1 并不能通过子项目的数目来确定项目名。

2 一个由A、B、C、D组成的项目和由A、D、C、B组成的项目其实是一个项目。

 

简要的说一说我的方法吧,只希望不丢人现眼。

 

1 写一套代码来表示具体定义

2 写一套代码来表示具体使用

=======================================================================

定义就是上面分析的结果,写出来就行。

使用呢?就要略微分析一下了。

=======================================================================

怎样确定若干个子项目代表的是什么项目呢?

从数量上分,1个组成项的可能是A、B、C、D,2个组成项可能是AB、AC、AD、BC、BD、CD,三个组成项的可能是ABC、ABD、ACD、BCD,四个组成项的只能是ABCD。

从名称上分,A、B组成的和B、A组成的都叫AB,A、B、C组成的和A、C、B组成的、(此处省略若干)、还有C、B、A组成的都叫做ABC。

=======================================================================

这样就明朗了,我的做法是:

先看看手头上有几个子项目,

然后看看这几个子项目名会组成一个什么样子的字符串。

这是最简单的做法。

我用了一个小技巧,set是有序存储的——这要求提供一个比较大小的“<”——把A、B放到set里同B、A放到set里的结果是一样的。

(当然合成字符串会有一定的时间和空间消耗,也可以看心情用其他方法。)

=======================================================================

实际上,做的这两套东西所用的额外空间在大量数据面前真的是微不足道的,关键是可支持后续定义的各种项目。

其实直接用数据库也可以,为什么我要费劲在内存里做这么多事情呢?

因为有时候,一件事情你能且只能做一次。并不是你想访问数据库就能访问数据库的。

好像也可以用XML之类的样子,不过我不喜欢。

=======================================================================

其实我是个轮子制造家。

1楼王林森
一老头说:”当日华山论剑,先是他用黯然销魂掌,破了我的七十二路空明拳;然后我改打降龙十八掌,却不防他伸开右手食指中指,竟是六脉神剑商阳剑和中冲剑并用,又胜我一筹。可见天下武功彼此克制,武学之道玄之又玄!”少年听得心驰目眩,正要在问,旁边老太太骂道:mb玩个石头剪子布都说得这般威风!,,基础的东西大家都知道,可是同样的积木游戏,有的人却能拼出一个世界。我也得赶紧学学怎么理狗窝。

文章评论

做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
每天工作4小时的程序员
每天工作4小时的程序员
那些争议最大的编程观点
那些争议最大的编程观点
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
我的丈夫是个程序员
我的丈夫是个程序员
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
程序员必看的十大电影
程序员必看的十大电影
为什么程序员都是夜猫子
为什么程序员都是夜猫子
旅行,写作,编程
旅行,写作,编程
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
代码女神横空出世
代码女神横空出世
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
10个调试和排错的小建议
10个调试和排错的小建议
程序员和编码员之间的区别
程序员和编码员之间的区别
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
漫画:程序员的工作
漫画:程序员的工作
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
程序员应该关注的一些事儿
程序员应该关注的一些事儿
中美印日四国程序员比较
中美印日四国程序员比较
总结2014中国互联网十大段子
总结2014中国互联网十大段子
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
如何成为一名黑客
如何成为一名黑客
老程序员的下场
老程序员的下场
Java程序员必看电影
Java程序员必看电影
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序员都该阅读的书
程序员都该阅读的书
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
我是如何打败拖延症的
我是如何打败拖延症的
鲜为人知的编程真相
鲜为人知的编程真相
程序员的鄙视链
程序员的鄙视链
一个程序员的时间管理
一个程序员的时间管理
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有