【问题标题】:Java OOP encapsulation. Why is Object.doSomething(); better than doSomething(Object);?Java OOP 封装。为什么是 Object.doSomething();比 doSomething(Object); 更好?
【发布时间】:2012-02-02 18:38:17
【问题描述】:

我正在努力解释 java 中的 oop 概念。

oop 的一个主要原则是对象有方法。所以 Object.method();作品。 我将此与必须执行方法(对象)的过程编程进行对比。

这叫封装吗?

oop方式的优点是什么?

【问题讨论】:

  • 我不想粗鲁,但是如果你不理解这些概念,你为什么要向任何人解释它们?还是您的意思是您难以理解这些概念?
  • 将此问题移至programmers.stackexchange.com

标签: java oop


【解决方案1】:

这是一个很大的问题,有很多书都有答案,但简而言之,类成员具有访问修饰符(公共、私有、受保护)。私有成员可以被其他类成员(例如方法)访问,但不能被外部函数访问。

【讨论】:

    【解决方案2】:

    在场景 Object.doSomething() 中,对象将完全控制其在方法中使用的属性。

    但是在另一个调用中,doSomething(Object),您必须公开对象的所有属性,以便它们在方法中可用。这不是更安全的操作。

    【讨论】:

    • hmmm,如果在场景 2 中我有可以通过 getter/setter 访问的私有属性怎么办?他们不是还可以吗??
    • @Gevorg 它们是,但是在 getter/setter 中,您仍然可以控制这些私有属性,并且您可以根据需要向外部类显示它​​们。
    • @Gevorg 据我了解您的评论,是的,它们可以访问,并且许多人的代码完全按照您的想法,doSomething(obj.getValue1(), obj.getValue2())。这是一种已知的不良 OO 模式。
    【解决方案3】:

    OOP 的另外两个优点是重用和多态性。

    重复使用: 如果您在一个文件或一个程序中使用doSomething(Object),它可能适用于该程序。现在,假设您需要在另一个程序中使用您的Object。您需要在新程序中复制doSomething() 方法(可能是复制并粘贴它)。这可能会奏效,但这是一种不好的做法,并且会使维护该逻辑成为一场噩梦。如果doSomething() 逻辑是Object 内部的一个函数,那么该逻辑与对象“存在”。

    多态性: 想象另一种情况,其中 Object 只是许多类似类型中的一种。如果您利用接口,许多对象可以实现doSomething() 函数以满足其特定需求。

    例子:

    interface ICar
    {
        void doSomething();
        void getFuel();
    }
    
    class GasCar : ICar
    {
        public void doSomething()
        {
            //do something a gas car would do
        }
        public void getFuel()
        {
            //logic to pull gas out of a tank
        }
    }
    
    class ElectricCar : ICar
    {
        public void doSomething()
        {
            //do something an electric car would do
        }
        public void getFuel()
        {
            //logic to pull fuel out of a battery
        }
    }
    

    【讨论】:

      【解决方案4】:

      要记住的另一个答案。当你做方法(对象)和方法是这样实现的:

      method(obj)
      {
          return obj.getA()+obj.getB()
      }
      

      这很糟糕,因为以后当你想再次做同样的事情时,你的代码在哪里?我的意思是,它使用了 A 和 B,所以你首先要看的地方是 obj,但它不在那里!?!现在你必须去搜索。

      OO 与组织代码以查找和重用代码一样重要。

      tl;博士兰特

      您会看到很多这样的带有 bean 模式的代码——因此,我开始将 bean 视为 OO 编程中更阴险的邪恶之一。理论上,如今大多数 bean 都被称为“Pojos”,因为您可以在其中实现实际方法,但人们仍然坚持使用只有 setter 和 getter 的 bean,这绝不是 OO,实际上它们鼓励特别不是 OO 的代码(与 OO 相比,bean 更类似于 C 等非 oo 语言中的数据结构)。

      【讨论】:

        【解决方案5】:

        OOP 提倡封装;结果,状态和行为被封装在代表对象的类中。根据封装发生的级别,采用基于静态(类级别)或实例(对象级别)的封装。

        【讨论】:

          【解决方案6】:

          method(Object) 是一种适用于数据结构的范例。数据结构是关于对语义一致且相关的信息字段进行分组(即 struct Person {FirstName, LastName, DateOfBirth})。

          面向对象的编程比数据结构高出一步。在 OOP 中,我们不仅对相关的数据字段进行分组,而且还包括与数据相关的函数(方法、成员函数)(并且以正确的方式作用于数据)。

          封装是关于保持部分成员对对象私有。目标是“隐藏”外部世界的内部工作,并保护对象的状态免受“损坏”或被分配不正确的值。 OOP 语言提供了几个“访问修饰符”,用于指定特定类别的对象(子类的实例、同一“包/命名空间/库”中的类、任何其他类等)是否可以访问给定的成员。 )。

          object.method() 通常是关于要求对象执行一些可能涉及访问在类之外无法访问的字段的操作。

          上面是定义和解释成员函数(方法)的概念和封装的概念是如何并行的。

          Referrences:
          http://en.wikipedia.org/wiki/Encapsulation_%28object-oriented_programming%29
          http://en.wikipedia.org/wiki/Object-oriented_programming
          

          【讨论】:

            猜你喜欢
            • 2011-01-12
            • 2022-06-11
            • 2020-02-02
            • 2011-08-30
            • 1970-01-01
            • 1970-01-01
            • 2020-04-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多