面向对象设计——最简单的例子,但我';反正我也糊涂了! 当我在一个类中封装一些程序代码(在我的例子中是C++,但这可能不是这里的意思)时,我常常困惑于最好的方法。对于过程代码,我指的是可以很容易地放入过程中的东西,其中使用周围的对象主要是为了清晰和易于使用(错误处理、日志记录、事务处理…)

面向对象设计——最简单的例子,但我';反正我也糊涂了! 当我在一个类中封装一些程序代码(在我的例子中是C++,但这可能不是这里的意思)时,我常常困惑于最好的方法。对于过程代码,我指的是可以很容易地放入过程中的东西,其中使用周围的对象主要是为了清晰和易于使用(错误处理、日志记录、事务处理…),c++,oop,C++,Oop,例如,我想写一些代码,从数据库中读取数据,对其进行一些计算,并对数据库进行一些更改。为了能够做到这一点,它需要来自调用者的数据 这些数据是如何以最佳方式进入对象的。假设它需要7个值和一个整数列表 我的想法是: 构造函数的参数列表 设置函数 中心函数的参数列表 第一种解决方案的优点是,调用方必须准确地提供类执行任务所需的内容,并确保在创建类之后数据立即可用。然后,对象可以存储在某个地方,调用方可以随时触发中心函数,而无需与对象进行任何进一步的交互 在第二个示例中几乎相同,但现在中心函数必须检查

例如,我想写一些代码,从数据库中读取数据,对其进行一些计算,并对数据库进行一些更改。为了能够做到这一点,它需要来自调用者的数据

这些数据是如何以最佳方式进入对象的。假设它需要7个值和一个整数列表

我的想法是:

  • 构造函数的参数列表
  • 设置函数
  • 中心函数的参数列表
第一种解决方案的优点是,调用方必须准确地提供类执行任务所需的内容,并确保在创建类之后数据立即可用。然后,对象可以存储在某个地方,调用方可以随时触发中心函数,而无需与对象进行任何进一步的交互

在第二个示例中几乎相同,但现在中心函数必须检查调用方是否已交付所有必要的数据。问题是,对于每一组数据,你是否有一个单一的集合函数,或者你是否只有一个集合函数

最后一种解决方案只有一个优点,即在执行之前不必存储数据。但是,它看起来像一个普通的函数调用,类的好处消失了

你是怎么做到的?我的考虑对吗?我错过了一些优点/缺点

这东西很简单,但我找不到任何资源

编辑:我不是说数据库连接。我的意思是完成这个过程所需要的所有数据。例如,记账交易的所有信息

让我们做一个调查,你更喜欢什么:

class WriteAdress {
  WriteAdress(string name, string street, string city);
  void Execute();
}


界面设计非常重要,但在您的情况下,您需要的是了解这一点

首先选择最简单的解决方案,现在就写。 然后你会看到什么是缺陷,所以修复它们。 重复上述步骤,直到修复它们不再重要

这样做的目的是,您必须获得经验,以了解如何直接获得某种类型问题的“最佳”或更好地说是“较差”解决方案(这就是我们所称的“设计模式”)。要获得这种体验,你必须快速解决问题,解决问题,并努力深入理解问题的原因


这就是你每次尝试“新”事物时必须做的事情。如果您修复错误并从中学习,那么错误就不是问题

如果需要由多个成员函数使用,则值应为数据成员。所以数据库句柄就是一个很好的例子:打开与数据库的连接并获取句柄,然后将其传递给多个函数对数据库进行操作,最后关闭它。根据您的情况,您可以直接在构造函数中打开它,然后在析构函数中关闭它,或者只在构造函数中接受它作为值并存储它以供成员函数稍后使用

另一方面,仅由一个成员函数使用且每次调用可能不同的值应保留为函数参数,而不是构造函数参数。如果它们在每次调用函数时总是相同的,则将它们设置为构造函数参数,或者只是在构造函数中初始化它们


不要进行两阶段施工。在调用成员函数之前,要求在构造函数之后调用类上的一组setXYZ函数是一个糟糕的计划。要么在构造函数中初始化必要的值(无论是直接初始化,还是从构造函数参数初始化),要么将它们作为函数参数。是否提供可以在构造后更改值的setter是一个不同的决定,但对象在构造后应始终立即可用。

您应该为所有值使用构造函数参数,这在任何情况下都是必要的(考虑到许多编程语言也支持构造函数重载)。 这导致了第二个问题:Setter应用于引入可选参数或更新值

您还可以加入这些方法:在构造函数中预期必要的参数,然后调用它们的setter函数


中心函数应该只使用临时参数(时间戳,…)

首先,听起来您试图一次做的事情太多了。读取、计算和更新都是独立的操作,它们本身可能会进一步分解

我在考虑方法或类的设计时使用的一种技巧是:“我希望最高级别的方法在理想情况下是什么样子?”也就是说,考虑方法的独立组件并将其拆分。这是自上而下的设计

在你的情况下,我在脑海中设想了这一点(C#):

然后对这些方法中的每一种都执行相同的操作

当你把参数传递给你的方法时,你需要考虑你传递的数据是否被存储——也就是说,如果你的类是静态的(它不能被实例化,而只是一个方法集合等)。也就是说,类的每个对象都有一个状态

如果参数确实可以被认为是类的属性,那么它们定义了类的状态,并且应该作为私有变量存储,在必要的情况下,每个参数都有getter和setter。如果类没有状态,那么它应该是静态的,并且
class WriteAdress {
  void Execute(string name, string street, string city);
}
class WriteAdress {
  void SetName(string Name);
  void SetStreet(string Street);
  void SetCity(string City);
  void Execute();
}
class WriteAdress {
  void SetData(string name, string street, string city);
  void Execute();
}
public static void Dostuff(...)
{
    Data d = ReadDatabase(...);
    d.DoCalculations(...);
    UpdateDatabase(d);
}