面向对象的设计 - 最简单的情况,但无论如何我都很困惑!

use*_*471 4 c++ oop

当我在一个类中包含一些过程代码时(在我的情况下是c ++,但这可能不是我感兴趣的)我常常对最好的方法感到困惑.使用过程代码我的意思是你可以很容易地放入一个过程中,你使用周围的对象主要是为了清晰和易用(错误处理,日志记录,事务处理......).

例如,我想编写一些代码,从数据库中读取内容,对其进行一些计算并对数据库进行一些更改.为了能够这样做,它需要来自呼叫者的数据.

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

我的想法是:

  • 构造函数的参数列表
  • 设置功能
  • 中央功能的参数列表

第一种解决方案的优点是调用者必须准确地提供类所需的工作,并确保在创建类之后数据可用.然后可以将对象存储在某处,并且可以在没有任何与对象的进一步交互的情况下由调用者触发中心函数.

它在第二个例子中几乎相同,但现在中央功能必须检查调用者是否已传送所有必要的数据.问题是,如果您对每个数据的和平有一个单一的功能,或者如果您只有一个.

Last解决方案的唯一优势是,在执行之前不会存储数据.但是它看起来像一个正常的函数调用,并且类接近的好处消失了.

你怎么做那样的?我的考虑是否正确?我错过了一些优点/缺点?

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

编辑:我不是在谈论数据库连接.我的意思是完成程序所需的所有数据.例如,簿记交易的所有信息.

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

class WriteAdress {
  WriteAdress(string name, string street, string city);
  void Execute();
}
Run Code Online (Sandbox Code Playgroud)

要么

class WriteAdress {
  void Execute(string name, string street, string city);
}
Run Code Online (Sandbox Code Playgroud)

要么

class WriteAdress {
  void SetName(string Name);
  void SetStreet(string Street);
  void SetCity(string City);
  void Execute();
}
Run Code Online (Sandbox Code Playgroud)

要么

class WriteAdress {
  void SetData(string name, string street, string city);
  void Execute();
}
Run Code Online (Sandbox Code Playgroud)

Ant*_*ams 5

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

另一方面,仅由一个成员函数使用并且每次调用可能不同的值应该是函数参数而不是构造函数参数.如果它们对于函数的每次调用总是相同的,那么使它们成为构造函数参数,或者只是在构造函数中初始化它们.

不要做两阶段施工.要求在构造函数之后调用一组setXYZ函数,然后才能调用成员函数,这是一个糟糕的计划.在构造函数中初始化必要的值(无论是直接还是从构造函数参数),或将它们作为函数参数.是否提供可在施工后更改值的定位器是一个不同的决定,但是一个对象应该在施工后立即可用.