我有一个与如何使用面向对象语言(如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;
}
}
当我们想要使用这个类时,我们可以使用以下代码:
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
可能是一大堆数据。
答案 0 :(得分:0)
实际建模的课程是什么?什么需要封装?谁实际上拥有那些数据?
在您的第一个示例中,成员是实现细节。它们对类的用户/客户端是隐藏的,您可以替换它们并完全更改实现。方法perform_one_task()
的客户端不知道这些字段存在。
e.g。您的类可以表示二维坐标,您的成员可以表示X / Y属性。在某个阶段,您可以更改该类以表示极坐标(角度+半径)中的坐标。坐标类的API将保持不变,但实现方式将根本不同。
您的第二个价值纯粹是封装功能。该类可以表示没有它自己拥有的数据。这不是不合理的。您可以合法地实现(比方说)一个简单执行计算并封装该功能的Calculator
类。将它放在一个类中的好处是它实现了一些可重用性并且不依赖于原始源代码。
最重要的是,您可以编写接受/保留/拥有数据的类,以及不保持状态的类。这两种方法在不同的情况下都是合法的。关于谁拥有/控制数据的基本问题仍然存在。
答案 1 :(得分:0)
当您需要在类实例生命周期中的其他位置使用值时,您应该使用第一个模式(成员):否则,如果您只需要在方法中使用值,则应使用第二个模式
答案 2 :(得分:0)
根据面向对象编程的原则(OOP),在开发类时,通常会选择对象属性(状态)和对象方法(行为)。这里的方法可以具有输入参数。因此,我们可以将您的问题改为:对象属性和方法参数之间的区别。
对象属性是表征该对象的特性(状态特征),例如, 3D点的特征在于3个坐标:x,y,z;圆的特征是中心坐标和半径。
对象方法(行为)是应用于该对象的计算,例如,三角形可以有computeSquare(),calculatePerimeter(),旋转(角度),移动(newX,newY)等方法。
最后方法参数是此方法的输入数据,但它们不是对象属性。例如。 2D形状对象可以有方法旋转(角度),其中角度不是形状对象的属性,而是旋转方法的输入参数,即旋转形状的角度。
答案 3 :(得分:0)
您的第一个示例是面向对象的(假设perform_one_task()
使用变量!)。你的第二个例子不是,它只是一个包装在空类包装器中的函数。
一般而言,面向对象的类是一种打包一些数据和所有相关操作(方法)的方法。当他们模拟一些现实世界的对象或概念时,类最有效。封装在类中的数据受到保护,只能由类提供的操作访问或操作。您通常希望类有多种方法以不同的方式对相同的数据进行操作,因此您的示例有点过于简单。
如果您尝试在示例中添加其他任务,那么您将看到在第二个示例中您将最终得到两个不相关的函数,而在第一个示例中,每个任务都能够对相同的数据进行操作。
答案 4 :(得分:0)
班级成员是班级成员。这些是类对象实例的属性或整个类使用的静态值 - 因此与类密切相关的值。
除非你需要它们,否则你不会在你的类中存储不为你的类建模的值(然后它们会对你的类进行实际建模)。这是不必要的,浪费资源。始终避免不必要的变量 所以基本上:
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;
};