博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
认识抽象的陷阱-过度设计
阅读量:4031 次
发布时间:2019-05-24

本文共 1657 字,大约阅读时间需要 5 分钟。

原文链接:

提到过度设计,大概很多人都知道。但怎么样界定过度设计,确是很难说的清楚。

 

就是因为难以界定,所以就出现了可意会不可言传的意味。仿佛成为了一种非常高深的传统文化。

 

那么怎么界定呢?要界定,那么就应该要有衡量的标准。找到这个衡量标准,而且是可以描述的,可量化的,可理解的。

 

历经这么多年,脱离局部的思想,抛开代码。往着宏观方向,系统层的思考。反而得到了一些答案。

 

那么再来思考一个问题。在做抽象的时候,或者在利用一些设计模式的时候(其实这也是一种抽象,只不过是利用前人总结好的抽象)。目的是为了什么?

 

在我的上一篇文章中 《》提到了系统复杂度的概念与描述。

 

那么抽象的目的是什么?本质上来说是为了减少复杂度。

 

认识这个目的之后,一个衡量的标准就是,目前所做的抽象(使用设计模式、领域、分层隔离等)是不是将复杂度降低了?或者使用了某个抽象之后,反而是增加复杂度了。

 

很多人之所以会有着喜欢用设计模式,有一个思维是在于,我手中有一把锤子,看见什么都想去锤下。这种的是在于,从自身主观思维出发,只看到局部,而未见整体的系统结构。

 

评判的标准界定,我认为是应该是从系统的角度,去做评判才是正确的。这个评判不是以个人主观意识出发的。而是这个系统,在用了某个抽象之后。

 

两个方面:

总结为在现有的架构下,从两个方向去解决:1、减少元素,元素少了是不是复杂度就少了?2、减少元素之间的联系。领域的方案,其实就是采用了这种方式去将复杂度降低。

龚浩华,公众号:月牙寂道长

 

1、可以减少元素

    这个是非常常见的。利用抽象类、抽象接口等等

2、可以减少元素之间的联系。

    这个也是非常常见的。利用分层隔离,领域隔离等等

    隔离,封装的好处,会降低联系。也会将部分的完整逻辑封装成黑盒。其往外暴露的联系、逻辑就很少。

 

但并不是说,所有所做的抽象,都是全部往好的一面。有时候也会出现矛盾的地方:

抽象了元素,实现了减少元素。但联系确增加了,使得复杂度增加了。

分层隔离做了,但元素确增多了。

 

但总体而言,这个并不是一个纯粹的线性描述。但结果是纯粹的,复杂度。

如果优化复杂度,也许存在最优解。但更多的,现实中,还存在很多其他的因素。我们寻找的其实是一个增加了更多因素考虑的局部最优解。比如,我们要考虑项目的紧急度,成本等。

 

 

若在此基础上,再往上一层去思考。就像我们从地球上坐飞船,慢慢的离开地球,我们从最初的大地,看到海洋,再看到一个球,看到月球围绕地球。再慢慢的离开,我们离开太阳系,再继续,我们看到银河系。

 

随着我们的视角的逐渐上升,映入眼帘的是什么?系统架构映入眼帘的是一个网络。一个网络的复杂度,应该有哪些来描述?

 

目前我所能了解到的一些方向:

 

1、petril网络

Petri网是Carl Adam Petri于1962年在博士论文中首次提出来的。作为描述系统元素的异步并发操作的工作模型,Petri网在计算机等许多领域都获得了广泛的应用。Petri网是完全从过程的角度出发为复杂系统的描述与分析设计提供的一种有效的建模工具,能自然的描述并发、冲突、同步、资源争用等系统特性,并带有执行控制机制,同时还具备形式化步骤及数学图论相支持的理论严密性。值得一提的是Petri网的图形表达的直观性和便于编程实现的技术特点,使得它已经成为工作流及作业流建模的主要工具之一。本小节将使用Petri网作为作业流建模的工具,对网络自动攻击系统上的网络攻击作业流进行建模。首先将对Petri网的相关概念进行介绍。

 

 

2、复杂网络 

复杂网络(Complex Network),是指具有自组织、自相似、吸引子、小世界、无标度中部分或全部性质的网络。特征:小世界、集群即集聚程度的概念、幂律的度分布概念。    

 

具体专业化细节,可以自行了解。

 

 

 

龚浩华

月牙寂道长

qq:29185807

2020年05月23日16:09:28

 

 

如果你觉得本文对你有帮助,可以转到你的朋友圈,让更多人一起学习。

第一时间获取文章,可以关注本人公众号:月牙寂道长,也可以扫码关注

 

转载地址:http://jiebi.baihongyu.com/

你可能感兴趣的文章
Android计算器实现源码分析
查看>>
Android系统构架
查看>>
Android 跨应用程序访问窗口知识点总结
查看>>
各种排序算法的分析及java实现
查看>>
SSH框架总结(框架分析+环境搭建+实例源码下载)
查看>>
js弹窗插件
查看>>
自定义 select 下拉框 多选插件
查看>>
js判断数组内是否有重复值
查看>>
js获取url链接携带的参数值
查看>>
gdb 调试core dump
查看>>
gdb debug tips
查看>>
arm linux 生成火焰图
查看>>
jtag dump内存数据
查看>>
linux和windows内存布局验证
查看>>
linux config
查看>>
linux insmod error -1 required key invalid
查看>>
linux kconfig配置
查看>>
linux不同模块completion通信
查看>>
linux printf获得时间戳
查看>>
C语言位扩展
查看>>