Java 类成员与函数参数 我有一个问题,涉及如何使用面向对象语言(如C++)设计类。在许多情况下,变量可以分配给类成员或函数参数。我举以下例子来说明我的观点: class MyClass { public: int variable1; int variable2: MyClass (int vr1, int vr2) { variable1 = vr1; variable2 = vr2; } bool perform_one_task() { // do something return true; } }

Java 类成员与函数参数 我有一个问题,涉及如何使用面向对象语言(如C++)设计类。在许多情况下,变量可以分配给类成员或函数参数。我举以下例子来说明我的观点: class MyClass { public: int variable1; int variable2: MyClass (int vr1, int vr2) { variable1 = vr1; variable2 = vr2; } bool perform_one_task() { // do something return true; } },java,c++,class,Java,C++,Class,当我们想要使用此类时,我们可以使用以下代码: int a,b; MyClass mine(a,b); mine.perform_one_task(); 也可以设计一个没有variable1和variable2的类 class MyClass { public: bool perform_one_task(int variabl1, int variable2) { // do something re

当我们想要使用此类时,我们可以使用以下代码:

  int a,b;
  MyClass mine(a,b);
  mine.perform_one_task();
也可以设计一个没有
variable1
variable2
的类

    class MyClass
    {
    public:

      bool perform_one_task(int variabl1, int variable2)
      {
        // do something
        return true;
      }
    }

在这个类中,
variable1
variable2
不是类的成员,而是函数的参数。我的问题是,在哪种情况下,第一种设计策略更可取,在哪种情况下,第二种设计模式更好。给定的示例仅假设
variable1
variable2
的结构很小,但是如果它们很大,例如,
variable1
可能是一个大的数据数组

这门课实际上是什么?什么需要封装?谁实际拥有这些数据

在第一个示例中,成员是一个实现细节。它们对类的用户/客户端是隐藏的,您可以替换它们并完全更改实现。方法
执行一个任务()
的客户端不知道这些字段存在

e、 g.您的类可以表示二维坐标,您的成员可以表示X/Y属性。在某些阶段,您可以更改该类以极坐标表示坐标(角度+半径)。coordinate类的API将保持不变,但实现将有根本的不同

第二个值纯粹是封装功能。该类可以不使用它自己拥有的数据来表示。这并不是不合理的。您可以合法地实现(比如)一个只执行计算并封装该功能的
计算器
类。将其放入类中的好处是,它实现了一些可重用性,并且与原始源代码无关


底线是您可以编写接受/持有/拥有数据的类,以及不持有状态的类。这两种方法在不同的场景中都是合理的。基本问题仍然是谁拥有/控制这些数据。

当您需要在类实例生命周期的其他地方使用值时,应该使用第一种模式(成员):否则,如果您只需要在方法中使用值,则应该根据面向对象编程的原则使用第二种模式()开发类时,通常选择对象属性(状态)和对象方法(行为)。这里的方法可以有输入参数。因此,我们可以将您的问题改写为:对象属性和方法参数之间有什么区别。

对象属性是其表征该对象的属性(状态特征),例如,3D点由3个坐标表示:x、y、z;圆由中心坐标和半径表示

对象方法(行为)是应用于此对象的计算,例如,三角形可以有诸如calculateSquare()、calculatePerimeter()、rotate(angle)、move(newX、newY)等方法


最后,方法参数是此方法的输入数据,但它们不是对象属性。例如,2D形状对象可以具有方法旋转(角度),其中角度不是形状对象的属性,而是旋转方法的输入参数,即旋转形状的角度。

您的第一个示例是面向对象的(假设
perform\u one\u task()
使用变量!)。第二个示例不是,它只是一个封装在空类包装器中的函数

一般来说,面向对象类是打包一些数据和所有相关操作(方法)的一种方式。类在对某些真实对象或概念建模时工作得最好。封装在类中的数据受到保护,只能通过类提供的操作访问或操作。通常,您会期望一个类有多个方法以不同方式对同一数据进行操作,因此您的示例有点过于简单


如果您尝试将另一个任务添加到示例中,那么您将看到,在第二个示例中,您只会得到两个不相关的函数,而在第一个示例中,每个任务都能够对相同的数据进行操作。

类成员是类成员。这些是类对象实例的属性或整个类使用的静态值类-与类密切相关的so值

除非您需要,否则您不会在类中存储不建模的值(然后它们会实际建模您的类)。这是不必要的,也是对资源的浪费。始终避免不必要的变量。 所以基本上:

class MyClass{
public:
  bool perform_one_task(int onlyMethodArg1, int onlyMethodArg2){
    // do something
    return true;
    // onlyMethodArgs are gone since nobody really needs them, we are interested 
    // only in result of calculation
  }
void saveProperties(int prop1, prop2){
    property1=prop1;
    property2=prop2;
} 
private:
    int property1;
    int property2;
};
当设计类(类型)时,总是问自己一个问题:MyClass是否有这样的属性?