1.1抽象过程

本贴最后更新于 3567 天前,其中的信息可能已经事过境迁

   所有编程语言都提供抽象机制。可以认为,人们所能够解决的问题的复杂性直接取决于抽象的类型和质量。所谓的“类型”是指”所抽象的是什么“。汇编语言是对底层机器的轻微抽象(这种程度的抽象可以想象当时的汇编程序员编程有点难)。然后出现C、BASIC、FORTRAN等对汇编语言的抽象。虽然它们对汇编语言有了比较高程度的抽象,但是这种程度的抽象依然要求程序员编程时必须要考虑机器模型(”解空间“内,问题建模地,例如:计算机)跟实际问题模型(”问题空间“内,问题存在的地方,例如:一项业务)之间的关联。建立这种映射是费时,难以编写并维护代价高昂。

    另一种对机器建模的方式就是对待问题建模。早期的编程语言,例如:APL和LISP,都选择考虑世界的某些铁定视图。(分别对应:”所有问题都是列表“和”所有问题都是算法“)。PROLOG则将所有问题都转换为决策链。此外还产生了基于”约束条件编程“的语言和专门通过对”图形符号操作“来实现的语言(后者被证明限制性过强)。这些方式对他们要解决的特定类型的问题还是不错的,但是如果超过其特定领域就会力不从心。

   面向对象方式通过向程序员提供表示问题空间中的元素的工具而更进了一步。这种表示方式非常通用,使得程序员不会受限于任何特定类型的问题。我们将”问题空间“中的元素及其在”解空间“中的表示称为对象。(当然,我们还需要一些无法类比为问题空间元素的对象)。这种思想的实质是:程序可以通过添加新类型的对象使自身适应与模特特定问题。因此,你在阅读代码的同时,就是在阅读问题的表述。相比以前的语言,这是一种更灵活和更强有力的语言抽象。所以,OOP允许根据问题描述问题(阅读代码即阅读问题的表述),而不是根据运行解决方案的计算机来描述问题(编程时同时考虑机器模型跟问题模型之间的关联)。但他对计算机仍有联系:每个对象看起来都有点向微型计算机——它具有状态,还具有操作,用户可以要求对象执行这些操作。如果要对现实中的对象作类比,那么说它们有特性和行为似乎是不错的。

   Alan Kay曾经总结了第一个成功的面向对象的语言、同时也是Java所给予的语言之一的Smalltalk的五个基本特性,这些特性表现了一种纯粹的面向对象的程序设计模式:

    1)万物皆对象。将对象视为奇特的变量,它可以存储数据,除此之外,你还可以要求它在自身上执行操作。理论上讲,你可以抽取待解决问题的任何概念化的构件(狗、建筑物、服务等),将其作为程序中的对象。

    2)程序是对象的集合,它们可以发送消息来告知彼此要做的。要想请求一个对象,就必须给给该对象发送一条消息。更具体地说,可以把消息想象成对某个特定对象的方法的调用请求。

    3)每个对象都有自己的由其它对象构成的存储。换句话说,可以通过创建包含现有对象的包的方式来创建新类型的对象。因此,可以在程序中构建复杂的体系,同时将其复杂性隐藏在对象的简单性之后。

    4)每个对象都有其类型。按照通用的说法,”每个对象都是某个类(class)的一个实例(instance)“,这里”类“就是”类型“的同义词。每个类最重要的区别于其它类的特性就是”可以发什么消息给它“。

    5)某一特定类型的所有对象都可以接收同样的消息。这是一句意味深长的表述,你在稍后便会看到。因为”圆形“类型的对象同时是”几何类型“的对象,所以一个”圆形“对象必定能够接收发送给”几何形“对象的消息。这意味着可以编写与”几何形“并自动处理所有与几何形性质相关的事物的代码。这种可替代性(substitutability)是OOP中最强有力的概念之一。

    Booch对对象提出了更加简洁的描述:对象具有状态、行为、标识。这意味着每个对象都可以拥有内部数据(它们给出了对象的状态)和方法(它们产生的行为),并且每一个对象又可以唯一地与其它对象区分开来,具体地说,就是每个对象在内存中都有一个唯一的地址。

相关帖子

2 回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 88250

    昨天设置重定向后,忘记改个配置了,待会解决,多谢反馈🙏

  • 其他回帖
  • someone756
    作者

    @88250 为什么博客文章不能同步到社区??装逼都这么费劲。。。我在博客发布文章的时候没有同步按钮。社区的设置也都对。

推荐标签 标签

  • 工具

    子曰:“工欲善其事,必先利其器。”

    298 引用 • 763 回帖
  • Word
    13 引用 • 41 回帖
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    181 引用 • 400 回帖 • 1 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    326 引用 • 1395 回帖
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    12 引用 • 59 回帖 • 5 关注
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 347 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 63 关注
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    59 引用 • 25 回帖 • 2 关注
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 3 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    56 引用 • 85 回帖 • 1 关注
  • 印象笔记
    3 引用 • 16 回帖 • 1 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    291 引用 • 4495 回帖 • 656 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    86 引用 • 165 回帖 • 4 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 6 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 34 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    240 引用 • 224 回帖 • 1 关注
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用 • 2 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 565 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖 • 1 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    42 引用 • 130 回帖 • 250 关注
  • danl
    172 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    411 引用 • 3588 回帖 • 1 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    20 引用 • 37 回帖 • 579 关注
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    438 引用 • 1250 回帖 • 594 关注
  • AWS
    11 引用 • 28 回帖 • 3 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    29 引用 • 202 回帖 • 27 关注