对算法和分支的一点点体会

宏哥 发布于 2012/07/09 16:01
阅读 954
收藏 6

早年因为为证券和银行做接口, 需要做一些数据转换,来实现对接交易.

根源是因为双方业务模式不同,各自需要的信息也不同.

宏哥因为"聪明",就设计了一个算法, 来通过配置文件,实现不同银行和不同证券公司之间的交叉对接.

这个算法可以减少代码, 并且可以通过配置文件来适应业务修改.

另外一个同事非常"SB",他在做另一个实施, 我问他,你是怎么写的. 他说,太简单了,我每个分支函数对应一个交易类型,然后写代码手工把信息填写进去,缺的补, 不匹配的匹配. 很快啊. 几个小时就写完一个月要做的事情了. ----- 这能算是编程吗?

结果就是, 宏哥凌晨2点还在银行调试,业务变化导致的算法变化要持续改进.........

那个"SB"同事早早开溜了,去梅里雪山了

很多年过去了,  我到现在也没有去过梅里雪山

NND, 我宁可要梅里雪山也不要算法了.

 如果再来一次, 我就用if else. 然后去爬山,跑牛.... 滚 T M  D 算法

加载中
0
景愿
景愿

一开始都追求设计,到最后为了设计只能堆砌一堆堆杂乱无章且只有你自己看的懂的代码,还不如一个个if else下去来的清楚

"设计是为了未来" 是最大的谎言

宏哥
宏哥
未来是 T M D 不能被兼容的!
1
宏哥
宏哥

引用来自“逝水fox”的答案

了解下宏哥的算法怎么写的,类似的东西不是if-else思路解决吗。最多就是if-else里面执行的东西让他们封装成对象或者函数,或者根据既定规则读约定好名字的配置文件。

我以文中提到为例:

我的设计目标是, 抽取数据转换规则, 统一入口. 所有的业务,都通过一个配置数据结构 来转换 数据.这个转换逻辑,我把它称为算法.

 好处是减少了代码容易,当业务逻辑变更,修改配置即可. 

 坏处是当业务逻辑无法被覆盖,就要修改这个算法, 这个算法一旦修改,就需要对所有业务进行回归测试.

 现实是, 业务的变化无法预测,通常都是会影响到这个算法,所以我很辛苦.

我的同事, 他将每种业务对应一个函数. Copy & Paste & Modify. 判断交易代码之后,就直接执行函数.

坏处就是 代码行数比较多,很多重复代码.

好处就是 特定的业务规则修改,他只需要修改影响到的业务,修改简单,也不需要对其他进行回归测试.

我现在的理解是, 他的设计才是好的设计. 这种设计,最重要的就是 隔离度 非常高,易于测试,软件质量也高. 只用简单的分支就完全隔离了业务.

很多的算法,以及面向对象设计背离一个最重要的目标,就是隔离度. 如果对象之间发生关系,或者有所谓的通用算法,就意味着相互之间依赖度很高, 减低了测试的可能,而且,实际上,未来不可预测.实现当前目标比兼容未来重要得多.

逝水fox
逝水fox
明白,多谢。 遇到过类似问题,不过业务的变化程度可能没有你所说的这么大了,最多就是确定不变的统一到一个过程里面,要变的用接口做成可扩展的,基本上也是if-else解决问题了。 在提前可预测的变化范围内按照面向对象思想设计其实还是可以省很多事的,如果超出预测,需要动到已经写定了的或者不易扩展的部分和类结构,就是大麻烦了。你说的就是这个意思吧
0
JackyYong
JackyYong
一个算法或者说产品,  设计是一方面, 同时必要的UI工具、自动化工具等的支持也是必须的!
0
中山野鬼
中山野鬼

楼主,你这个还是在应用算法,不是实现算法将算法作为业务。

例如realplay推出自己的视频压缩算法,并售卖版权,甚至可能是SOC里的一个IP,那么这个算是在折腾算法业务。再例如,做指纹识别,然后买算法,或指纹识别的核心模块,也是算法业务。

能将算法本身作为业务的公司,肯定不会受具体客户的影响而调整核心算法。

oracle其实也在做算法。无论内存的管理,还是磁盘的管理,包括关联表的查询,底层实际的查询方式实现。他可能会针对不同业务面的类型,做出不同版本来,但绝对不会因为一个具体客户而改底层的东西。无非让客户自己调来调去。

再说个例子,开发OS的人,开发方式,开发习惯,和开发中考虑的问题,和在OS上开发其他APP的是不一样的。如果一样,OS就没有存在的必要性了。两者均不能相互完全引荐。

 

0
宏哥
宏哥

引用来自“中山野鬼”的答案

楼主,你这个还是在应用算法,不是实现算法将算法作为业务。

例如realplay推出自己的视频压缩算法,并售卖版权,甚至可能是SOC里的一个IP,那么这个算是在折腾算法业务。再例如,做指纹识别,然后买算法,或指纹识别的核心模块,也是算法业务。

能将算法本身作为业务的公司,肯定不会受具体客户的影响而调整核心算法。

oracle其实也在做算法。无论内存的管理,还是磁盘的管理,包括关联表的查询,底层实际的查询方式实现。他可能会针对不同业务面的类型,做出不同版本来,但绝对不会因为一个具体客户而改底层的东西。无非让客户自己调来调去。

再说个例子,开发OS的人,开发方式,开发习惯,和开发中考虑的问题,和在OS上开发其他APP的是不一样的。如果一样,OS就没有存在的必要性了。两者均不能相互完全引荐。

 

的确是应用层面.

首先分支处理而非算法.

Realplay, Oracle 的那些玩意,肯定有算法,不仅复杂,而且价值高,对手一直想搞明白 -- 有一点可以肯定, 它们有特定的数据结构支持.

0
逝水fox
逝水fox
了解下宏哥的算法怎么写的,类似的东西不是if-else思路解决吗。最多就是if-else里面执行的东西让他们封装成对象或者函数,或者根据既定规则读约定好名字的配置文件。
0
RainJ
RainJ

追求,收获,境界。

 有的人享受旅行的收获,有的人喜欢解决问题的快乐。

0
LimSteven
LimSteven
知道错了吧。以后少折腾这种事情。
0
尼莫
尼莫
这个貌似听楼主吐槽过。。好像是讨论面向对象那个贴
0
opal
opal
我的做法是用类似mapping的方法处理,如.xls用office打开,.txt用记事本打开
宏哥
宏哥
好方法
返回顶部
顶部