zoukankan      html  css  js  c++  java
  • 什么是一个对象?

    原文链接:https://dzone.com/articles/who-is-an-object

    DZone MVB 的DZone MVB Yegor Bugayenko 不同意在OOP下对象的定义,要介绍一个更好的例子。

    现在已经有上千本的面向对象编程的书和上百种的编程语言,我相信大多数(“所有”)的书在对象上都下了一个不正确的定义。这就是为什么整个OOP世界充斥着概念理解偏差和错误。由于工作和在硬件架构下,他们对于对象的定义是有局限性的,这也是为什么对象是原始的,是机械的。我想要介绍一种更好的方式。

    什么是一个对象?首先做一个调查,例如:

    ·“在对象的区域中,它总是包含数据(属性);执行时候的代码(方法)”  来自维基百科(Wikipedia)

    ·“一个对象在它的区域中存放声明,把行为放在方法中。”—来自甲骨文公司 What Is an Object? (什么是一个对象?)

    ·“每一个对象看起来都有点像是电脑 — 有一个声明和你可以要求执行的操作。”Thinking in Java(java编程思想)第四版,Bruce Eckel,第16页

    ·“一个类是拥有值和方法(操作这些值)的数据域的集合”— Java in a Nutshell 第六版,Evans and Flanagan,p98

    ·“一个对象是持有一些类型值的内存空间”The C++ Programming Language 第四版,Bjarne Stroustrup p40页

    ·“一个对象是由一些私有的内存空间和一组操作组成”—Smalltalk-80, Goldberg and Robson,第6页

    以上这些叙述中最多出现的就是“contains”(持有,组成,拥有,等等)。他们都认为对象是一个装着数据的盒子。这些观点就是我所强烈反对的。

    我们从C++和java的实现角度看,这些对象的结论看起来是正确的。对于每一个对象,java虚拟机分配一部分字节的内存来存储对象属性。因此,我们在这些语言中就可以说一个对象是内存中存放数据的盒子。

    但这只是一部分的情况。

    试想一下,一个没有存储对象属性在内存中的面向对象的语言。很疑惑?跟着我几分钟。(怎么翻译,好慌0.0)。我们来定义在这种语言下的对象:

     

    c {
      vin: v,
      engine: e
    }

     

     

    这里面,vin和Engine是对象c的属性(c是一辆车;首先忘记类的定义,把注意力集中到对象上来)。这是一个拥有两个属性的简单对象。第一个属性是car的Vin,第二个是Engine.Vin的对象v,Engine的对象e。为了便于理解,列出一个类似于java的表达:

     

    char[] v = {'W','D','B','H',...'7','2','8','8'}; // 17 chars
    Engine e = new Engine();
    Car c = new Car(v, e);

    我不完全确定在JVM的情况,但在C++中这个对象(c)会占有25个字节的空间(假设是64位 x86架构的电脑)。在c++中,对象是在数据结构中清楚定义分配了的数据属性。

    上面例子中,Vin和Engine属性是不相等的:Vin是一个“数据”,Engine是一个“指针”指向一个对象。我特地用这种方式为了能够证实调用数据盒子中的对象可能只与vin有关。只有当数据被存放在对象内部的时候我们才能够说对象是存放数据的盒子。对于Engine,这是不正确的,因为他没有数据在对象内部。它只有一个指向其他对象的指针。如果对象只拥有engine属性,它只会在内存中占用八个字节的空间,没有一个实际上是占有真实的数据。

    现在,让我们再回到之前的假设的语言。让我们假设,这个语言比C++更加难对待对象。它没有在内存中存储对象属性。它没有指针,也不知道任何关于x86架构。它只知道什么属性属于对象。

    因此,在我们的语言中,对象不再是存放数据的盒子。他们知道数据是什么,但他们不包含数据。他们展示数据,其他对象和实体。对象c在我们的假设语言中展示了两个对象:一个VIN和一个engine.

    总的来说,我们要知道,即使当下机械的定义对象在大多数的语言中是正确的。但它概念上是很不正确的,因为它把对象看做一个数据对外界可见的盒子。这样的可见性激起我们去想象它的执行和尽可能地尝试访问数据。

    如果我们认为对象是替代容器的一个数据代表(即把对象看成是容器),我们不想马上得到所有的数据。我们想知道遥远的数据和我们不能简单访问的数据。我们应该通过与一个对象的交互,如何与一个数据交互则不是我们应该关心的。

    我希望在不远的将来,业界能够在介绍新的面向对象的语言中(不会存储对象在内存的数据结构中),即使这很科学。(ps.就是对象只是获得了对象的指针)

    这是我最喜欢的定义对象的书。Object Thinking by David West, p. 66。

    An object is the equivalent of the quanta from which the universe is constructed.

    一个对象与构造宇宙量子是等同的。

    你怎么认为,是和我所说的想接近吗?

    个人总结,本文从面向对象的组成出发。罗列了有一些比较常见的观点,对象就是由数据和方法组成(函数或者是数据操作)。作者引入了一个对象指针的概念,表示这个对象只是存放了一个指针,并没有拥有这个真实的对象。来表示对于存储数据盒子的否定(a box with data)。

     

     

     

    纸上得来终觉浅,绝知此事要躬行
  • 相关阅读:
    (C#) 设定时间格式
    (WPF) MVVM: 动态添加控件及绑定。
    (WPF) MVVM: DataGrid Binding
    (WPF) MVVM: ComboBox Binding, XML 序列化
    (C#) 判断相等?
    ASP.NET MVC过滤器中权限过滤器ValidateAntiForgeryToken的用法(Post-Only)
    根据2个经纬度点,计算这2个经纬度点之间的距离
    ASP.NET导出Excel(利用NPOI和EPPlus库,无需安装Office)
    nopcommerce 二次开发
    SQL效率低下原因主要有
  • 原文地址:https://www.cnblogs.com/asheng/p/5697115.html
Copyright © 2011-2022 走看看