【问题标题】:What does "data abstraction" exactly mean?“数据抽象”到底是什么意思?
【发布时间】:2011-04-07 18:54:34
【问题描述】:

数据抽象指的是什么? 请提供现实生活中的例子。

【问题讨论】:

标签: c++ abstraction database-abstraction


【解决方案1】:

抽象有两部分:

  • 隐藏从某个角度来看无关紧要的细节
  • 确定从某个角度来看确实重要的细节,如果项目拥有这些细节,则认为它们属于同一类。

例如,如果我正在设计一个处理库存的程序,我希望能够找出系统中有多少特定类型的商品。从接口系统的角度来看,我不关心我是从数据库、csv 文件、通过 SOAP 接口或穿孔卡片的远程存储库获取这些信息的。我只关心我可以说widget.get_items_in_stock() 并且知道它会返回一个整数。

如果我以后决定要以其他方式记录该数字,只要widget 仍然具有get_items_in_stock() 方法,设计界面的人就不需要知道、关心或担心它。同样,如果我对小部件类进行子类化并添加get_square_root_of_items_in_stock() 方法,接口也不需要关心。我也可以将新类的实例传递给它。

所以在这个例子中,我们隐藏了如何获取数据的细节,并确定任何带有get_items_in_stock() 方法的东西都是相同的实例用于特定目的的类(或其子类)。

【讨论】:

    【解决方案2】:

    数据抽象是允许您将数据视为人类遇到的任何设备,而不是存储在机器上的数据。

    在最低级别,所有原始数据类型都是抽象的——作为程序员,我们通常不必处理位级别的数据(这是它最终的存储方式),而是整数、浮点数、字符等。

    然后我们在这个抽象上添加层——也许两个整数代表一个Point,或者我们和枚举来代表一年中的月份、一周中的几天等。

    通过每个抽象层,我们离机器更远,(希望)更接近人类对数据的理解。这可能会降低性能 - 点可能并不总是可以最有效地由两个整数表示。使用抽象时更短的开发(和维护)时间弥补了这一点。

    【讨论】:

      【解决方案3】:

      创建非常适合要编程的应用程序的新数据类型的技术称为数据抽象。

      【讨论】:

      • 感谢您的回答。以后请不要全部用粗体发帖;这首先违背了强调的目的。
      【解决方案4】:

      抽象意味着只向外界提供基本信息并隐藏他们的背景细节..examp。在您的计算机中,您只能看到显示器,键盘和鼠标..您对内部布线一无所知,这是抽象。

      【讨论】:

        【解决方案5】:

        数据抽象似乎被解释为尽可能地分解数据。食物将是苹果、橙子、比萨饼的抽象。动物将是猫、牛、猪的抽象。一个食物对象应该是这样的伪代码:

        class food{
        
         name;
         calories;
         weight;
        
         public eat(name);
        
         }
        

        所有食物都有名称、热量和重量。这很抽象。

        然后您可以创建继承的对象,这将不那么抽象。

        class pizza inherits food{
        
          toppings;
        
          say_toppings();
        
        }
        

        披萨现在有配料,但它继承了食物的名称、卡路里和重量。

        基本上抽象被解释为到达每个项目的最低级别并从它们扩展类。它也使您的代码更易于重用...如果您已经足够好地指示您的食物基类,并且包含有关它的所有抽象内容,那么在食品行业工作的任何人都可以使用您的类。

        【讨论】:

          【解决方案6】:

          抽象是对人体隐藏骨骼。皮肤很好地包含它。 (看看我在那里有多抽象?双关语是故意的。我离题了......)

          如果我有一个水瓶,那么我可以打开盖子,扭动它直到它弹出来喝水。

          bool lid_open = false;
          void open_water_bottle_by_twisting() { lid_open = true; }
          

          但水瓶是容器。容器盛放液体,直到它们打开并且可以饮用(假设液体是可饮用的)。

          class Container 
          { 
              bool lid_open = false;
          
          protected: 
              Container() {}
              void open_by_twisting()
              {
                  lid_open = true;
              }
          public:
              virtual ~Container();
          };
          
          class WaterBottle : public Container
          {
              WaterBottle() : Container() {}
          public:
              ~WaterBottle();
          };
          

          但是,并非所有容器的打开方式都相同。一些容器,例如水瓶,有可以拧开的盖子。其他的则没有盖子,例如运动瓶——其中包含可弯曲的吸管,可以弯下存放或向上饮用。

          class Container 
          { 
              bool lid_open;
              bool straw_open;
          
          protected:
              void TurnLid() { lid_open = true; }
              void BendStraw() { straw_open = true; }
              Container() : lid_open(false), straw_open(false){}
          
          public:
              virtual void open() = 0;
              virtual ~Container();
          };
          
          class WaterBottle : public Container
          {
          
          public: 
              WaterBottle() : Container() {}
              void open()
              {
                  TurnLid();
              }
              ~WaterBottle();
          };
          
          class ExerciseBottle : public Container
          {
          public:
              ExerciseBottle() : Container() {}
              void open()
              {
                  BendStraw();
              }
              ~ExerciseBottle();
          };
          

          但是客户端不知道ExerciseBottleExerciseBottleopen()的实现是什么。它调用BendStraw(),然后将straw_open 设置为true。但是ExerciseBottle 只是调用一个函数来完成所有这些工作。客户端不必执行在open() 的实现中使用的多个操作。 WaterBottle 的情况与此类似。 这就是抽象让客户知道后端将为它完成所有工作。当使用术语“将实现与接口分离”时,就是这个意思。

          【讨论】:

            【解决方案7】:

            是使用易于与人类交互或遇到的数据细节的复杂系统,这与计算机系统存储的方式(例如二进制数系统)不同。 由 Neema、Rohan 和 Upendo(程序员)回答

            【讨论】:

              【解决方案8】:

              根据给定的软件开发场景限制数据属性并删除所有不相关属性的技术。这使得软件开发更简单。

              【讨论】:

              • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post
              【解决方案9】:

              让我们以电视为例,您可以打开和关闭它、更改频道、调节音量,以及添加扬声器、录像机和 DVD 播放器等外部组件,但您不知道它的内部细节也就是说,你不知道它是如何通过无线或电缆接收信号,如何转换它们,最后将它们显示在屏幕上的。

              【讨论】:

                【解决方案10】:

                指在不包括背景细节或解释的情况下表现本质特征的行为

                【讨论】:

                  【解决方案11】:

                  很难找到 DATA 抽象的日常生活示例。但是,编程语言中的任何数据类型、DBMS 中的表和视图、LinkedList、List、Queue、Stack 等数据结构都是数据抽象。这些抽象为您提供了以特定方式访问数据的方法。

                  This article可以帮助你深入理解数据抽象和控制抽象。它还有一些控制和数据抽象的真实例子。

                  【讨论】:

                    【解决方案12】:

                    抽象是指在不包括背景细节或解释的情况下表示基本特征的行为。

                    【讨论】:

                      【解决方案13】:

                      简单的数据抽象只不过是向用户隐藏不必要的数据。 示例:某人只是想打电话,他只是选择或拨没有。并单击呼叫按钮此信息。对他来说已经足够了。他不想知道连接是如何建立的,以及拨打电话背后的任何过程或语音是如何传输的。

                      【讨论】:

                        【解决方案14】:

                        我知道很久以前有人问过这个问题。但还是想分享一个现实生活中的例子,这可能有助于其他人很容易理解abstraction的概念。

                        现实世界中的抽象类比可能是这样的: 你(对象)正在安排相亲并决定要说什么以便他们在餐厅认出您。您决定包括有关您的位置、身高、头发颜色和夹克颜色的信息。这是所有有助于程序(您找到您的日期)顺利进行的数据。您应该包括所有这些信息。另一方面,有很多关于你的信息与这种情况无关:你的社会安全号码、你最喜欢的足球运动员都与这种特殊情况无关,因为它们不会帮助你找到约会对象你。

                        【讨论】:

                          【解决方案15】:

                          数据抽象: 它用于向用户提供必要的信息,并向用户隐藏不必要的信息。它被称为数据抽象。 它将向外界隐藏您的业务逻辑。

                          技术示例:Console.WriteLine();

                          非技术示例:电视遥控器、汽车遥控器。

                          更多详情:Data Abstraction with real-time example

                          【讨论】:

                            【解决方案16】:

                            数据隐藏处理 oops 的安全特性。根据这个属性,一个类的私有数据成员只能在类内部而不是类外部访问或可见。

                            【讨论】:

                            • 不完整。通过这种推理,您可以拥有使用公共函数bar 的函数foo。公共函数bar 将用于foo 的内部实现,但bar 可以由客户端调用。不完整。
                            猜你喜欢
                            • 2011-06-13
                            • 1970-01-01
                            • 2020-10-23
                            • 2017-08-07
                            • 2017-07-20
                            • 2014-09-23
                            • 2014-07-25
                            • 2012-09-17
                            • 1970-01-01
                            相关资源
                            最近更新 更多