当前位置: 首页 > news >正文

设计心得——抽象

一、抽象

抽象这个词,大家用得非常多。比如画家里的抽象派,说某个知识点很抽象…,总之,抽象是在人们的普遍交流中经常遇到的一个词。当然,在计算机世界中,抽象也是很普遍用到一个词。那么什么是抽象?
说一句简单的,抽象就是一种普遍的具象。人类不可能接触到纯抽象的东西,这种东西无论多抽象,一定是可以被描述的,哪怕这种描述很难懂。但人们在接触这种描述时,这种抽象就是一种具像化的过程。
抽象,抽是抽出来本质,象是一个形象、具象,就是从所有类似的东西中抽取出一个能够描述他们共同、本质特征的形象。也可以理解为一种去芜存菁的过程。

二、抽象的发展

人类的社会的发展,一定是从实体的、具象的东西向抽象的非实体化的东西演进的过程。最常见的文字和语言其实就可以理解为一种抽象的最典型的范例。从一个物品抽象出一个文字,又从一些文字通过一系列的发展,抽象出本身更深层次的意思。比如火,最初可能只有人们认知中的火焰的火的意思,可后来,它抽象出来可以形容一个事物发展的很快很好,也可以形容一个脾气太急等等。
还有一个大家常见的例子,比如八卦周易,它就是从古人的结绳记事演进过来的,这个大家有兴趣可以看看相关的书籍,挺有意思的。其实大家在日常生活中也经常接触到类似的抽象,比如“骂人不加们,加们得罪人”。 骂一个特定的人,可能是有矛盾等原因,但加上们,把一大群人都骂了,这可就不妥了。这个们字,其实就可以理解成一种抽象,抽象出某一特定的人群。

三、如何抽象

抽象是一个由浅到深,由表及里的过程。它可以划分为表征性抽象和原理性抽象。表征抽象好理解,比如正方形,大家都会在头脑里有一个四个边相等的一个角为直角的四方形。而大家接触到的一些高深的定理、定律等,一般都属于原理性抽象,这种抽象,更复杂,更深层,更不容易理解。
一般来说,在编程遇到的抽象,大多仍然属于前者即表征性抽象,只不过这种表征,不太如正方形这种实质可以理解的东西,它更倾向于一种文字的抽象,即用来抽象的描述一种共同的特征和事物的本质。
抽象,抽是关键,象是结果。在实际应用中,要找到编程内容的描述的共同特征,然后对比分析,不断的进行总结。然后在此基础上进一步的拆分、总结。找出更高一级的共同的特征。如果反复,直到一个合适的结果即象。
在得到这个结果后,还需要对其进行准确的语言(即某一种编程或设计语言等)的高度准确、精炼的描述。这就达到了抽象的最终目的。
不过一般来说,在编程过程中,很难也不会如定理、定律一样的那样精炼,只要描述准确,就不必过于苛求于精炼,当然,这个因环境和开发者不同而有所不同,大家根据自身实际决定即可。

四、抽象的场景和应用

这里只谈在设计中的、开发中的抽象,而撇开哲学意义上的抽象。在实际的设计和开发过程中,抽象有两种有两重含义:
1、思想的抽象
思想的抽象,包括设计思想、设计理念和设计层次、架构、逻辑上的抽象,让设计更加的普遍化而不是只适应于某一种特定的情况,这是抽象的一种深层次的境界。这种境界一旦入门,就是真正的架构师的合格的标准。
2、代码的抽象
这种抽象更为开发者所容易接受,就是抽象一些开发功能、模块等为库、模板或者框架等。或者干脆就是抽象类、抽象函数等等。它一种基本入门的抽象。但它也最能体现前者即思想的抽象的结果。或者这样说,思想的抽象,是靠代码的抽象来体现出来的。

明白了上面两重含义就明白了抽象的场景和应用。抽象最重要的应用就是在设计上,正如盖高楼,没有一个好的设计,想盖好它,那基本是痴人说梦;同样,如果设计的很好,没有一个好的代码展现,则是明珠蒙尘。
抽象在开发中的应用,就是为了更好的解耦和更好的实现封装。它能在更高的层次上实现细节的隐藏,从而达到更好的设计的可扩展和和灵活性。不同层次的抽象,进一步降低了开发者的难度,降低了结构的复杂度,使得维护性也变得更好。
编程要依赖于抽象而不是具体,就是这个道理。依赖抽象,抽象的东西不易变化,而具体的东西容易变化。这里面的问题可就非常容易理解了。

五、总结

抽象在设计中是一个简单的问题,更是一个复杂的问题。它是对开发者,特别是设计者来说,一个入门难,精通更能的思想问题。大家都明白,千军易得,一将难求这个道理。而这个道理和抽象在设计、编程中一样。
要想这好抽象,就要有好的思想发展的思维和学习方式。那就是不断的学习各种理论知识特别是新的理论知识,再加上不断的编码对这些理论进行验证、实践并反馈之。如此反复,必有所成。

http://www.xdnf.cn/news/759925.html

相关文章:

  • Leetcode 3566. Partition Array into Two Equal Product Subsets
  • Go 语言中的 panic 详解
  • 【模拟电子电路-工具使用】
  • C++四种类型转换方式
  • 【DAY36】复习日
  • python学习打卡day42
  • python爬虫:RoboBrowser 的详细使用
  • 【目标检测】检测网络中neck的核心作用
  • c++ 类型转换函数
  • Relational Algebra(数据库关系代数)
  • ps中通过拷贝的图层和通过剪切的图层
  • Scratch节日 | 六一儿童节抓糖果
  • Qt|实现将QTreeWidget类item对象鼠标左键拖拽效果到QWidget接收
  • PCIe Gen6相比Gen5的新特性、优化点
  • c++之数组
  • latex 三线表-算法对比表
  • 理解解释器架构:原理、组成与运行机制全解析
  • leetcode hot100 二叉树(一)
  • c++之分支
  • SOC-ESP32S3部分:24-WiFi配网
  • 【PyQt5】从零开始的PyQt5 - QLabel篇
  • 18. Qt系统相关:多线程
  • Matlab作图之 subplot
  • 抖音客户端训练营--day2
  • 一:UML类图
  • JMeter 直连数据库
  • 1Remote远程会话管理以及一键启动虚拟机
  • Spring 中 @Value 注解多实例配置方案详解
  • 看问题的本质背后是什么?
  • pycharm打印时不换行,方便对比观察