Oop &引用;告诉我,唐';“不要问”;当一个类正在使用另一个类的数据执行和存储计算时

Oop &引用;告诉我,唐';“不要问”;当一个类正在使用另一个类的数据执行和存储计算时,oop,tell-dont-ask,Oop,Tell Dont Ask,请告诉我,如果我在应用这个例子中的“告诉,不要以正确的方式问”原则 我有两个类,CalculationResults有一个函数calculateMe(),它使用数据进行一些计算。存储结果很重要 class Data { private: int dataForCalculations; public: void calculate(CalculationResults& calculationResults) { calculationResults.calculateM

请告诉我,如果我在应用这个例子中的“告诉,不要以正确的方式问”原则

我有两个类,
CalculationResults
有一个函数
calculateMe()
,它使用
数据进行一些计算。存储结果很重要

class Data {
private:
  int dataForCalculations;
public:
  void calculate(CalculationResults& calculationResults) {
    calculationResults.calculateMe(dataForCalculations);
  }
};

class CalculationResults {
private:
  int calculatedData;
public:
  void calculateMe(int dataForCalculations) {
    calculatedData = someCalculations(dataForCalculations);
  }
};

// somewhere else:
Data data;
CalculationResults calculationResults;
data.calculate(calculationResults);
这段代码的第一个版本(在应用Tell之前,不要问)没有使用
Data::calculate
函数,但是它有一个
getter
用于
dataForCalculations
,所以我在某处调用了
calculationResults.calculateMe(Data.getDataForCalculations())

新版本更好吗

新版本更好吗

这取决于你问谁。但可以肯定的是,新版本是100%告诉,不要问。很容易判断,因为您的方法返回void

就我个人而言,我曾经尝试过完全遵循“告诉”、“不问”的原则,出于几个原因,我已经放弃了

首先,告诉,不要问原则可能会导致概念上混乱的对象交互。以您的代码为例。我不希望
数据
对象能够自行计算。我希望
数据
是其他东西的输入

再举一个例子。如果我正在编写一个模拟打电话给某人的程序,我可能有一个
电话
,和
电话号码
,以及一个
对象。现在,根据tell,不要问,你应该用数据问对象来完成某个动作。因此,在本例中,
PhoneNumber
可能有一个dial()方法:
PhoneNumber.dial()
。但这在概念上有意义吗?实际上,
人将
电话号码
拨入
电话

所以,这是我的第一个问题。我发现它更难理解,我发现更难想出对象之间的自然交互,告诉,不要问,这让我慢下来

其次,当两个对象需要共享数据时,通常不清楚应该首先调用哪个对象。以
为例。你是说用钢笔写的书还是用钢笔写的书?也许可以用这个例子来进行论证,但很多时候你会发现区别是任意的,我讨厌这样

第三,有了告诉,不要问,一个对象会慢慢地建立起越来越多的责任。您是否告诉对象保存自身?你让它自己展示吗?如果您有多个视图技术,该怎么办?如果需要以不同格式显示对象,该怎么办?您是否要求对象自行发送电子邮件?拥有一个有很多责任的对象并不一定是坏事。它的更改灵活性较低,但提供了更易于使用的API。然而,大多数人更喜欢灵活性,拥有一个职责很少的对象是可靠代码的一部分

第四,通过使用tell、don't ask(当您需要共享数据时)和getter,让您的对象将它的私有信息传递给其他对象之间的区别到底是什么?不多,如果你问我的话

我知道这是一个非常有挑战性的版本,但我更喜欢你的第一个版本,因为它更简单,更清晰。但是,我会将其写为:

calculationResults.calculate(data);
不管怎样,只要我的2美分

新版本更好吗

这取决于你问谁。但可以肯定的是,新版本是100%告诉,不要问。很容易判断,因为您的方法返回void

就我个人而言,我曾经尝试过完全遵循“告诉”、“不问”的原则,出于几个原因,我已经放弃了

首先,告诉,不要问原则可能会导致概念上混乱的对象交互。以您的代码为例。我不希望
数据
对象能够自行计算。我希望
数据
是其他东西的输入

再举一个例子。如果我正在编写一个模拟打电话给某人的程序,我可能有一个
电话
,和
电话号码
,以及一个
对象。现在,根据tell,不要问,你应该用数据问对象来完成某个动作。因此,在本例中,
PhoneNumber
可能有一个dial()方法:
PhoneNumber.dial()
。但这在概念上有意义吗?实际上,
人将
电话号码
拨入
电话

所以,这是我的第一个问题。我发现它更难理解,我发现更难想出对象之间的自然交互,告诉,不要问,这让我慢下来

其次,当两个对象需要共享数据时,通常不清楚应该首先调用哪个对象。以
为例。你是说用钢笔写的书还是用钢笔写的书?也许可以用这个例子来进行论证,但很多时候你会发现区别是任意的,我讨厌这样

第三,有了告诉,不要问,一个对象会慢慢地建立起越来越多的责任。您是否告诉对象保存自身?你让它自己展示吗?如果您有多个视图技术,该怎么办?如果需要以不同格式显示对象,该怎么办?您是否要求对象自行发送电子邮件?拥有一个有很多责任的对象并不一定是坏事。它的更改灵活性较低,但提供了更易于使用的API。然而,大多数人更喜欢灵活性,拥有一个职责很少的对象是可靠代码的一部分

第四,通过使用tell、don't ask(当您需要共享数据时)和getter,让您的对象将它的私有信息传递给其他对象之间的区别到底是什么?不多,如果你问我的话