面向对象设计——最简单的例子,但我';反正我也糊涂了! 当我在一个类中封装一些程序代码(在我的例子中是C++,但这可能不是这里的意思)时,我常常困惑于最好的方法。对于过程代码,我指的是可以很容易地放入过程中的东西,其中使用周围的对象主要是为了清晰和易于使用(错误处理、日志记录、事务处理…)
例如,我想写一些代码,从数据库中读取数据,对其进行一些计算,并对数据库进行一些更改。为了能够做到这一点,它需要来自调用者的数据 这些数据是如何以最佳方式进入对象的。假设它需要7个值和一个整数列表 我的想法是:面向对象设计——最简单的例子,但我';反正我也糊涂了! 当我在一个类中封装一些程序代码(在我的例子中是C++,但这可能不是这里的意思)时,我常常困惑于最好的方法。对于过程代码,我指的是可以很容易地放入过程中的东西,其中使用周围的对象主要是为了清晰和易于使用(错误处理、日志记录、事务处理…),c++,oop,C++,Oop,例如,我想写一些代码,从数据库中读取数据,对其进行一些计算,并对数据库进行一些更改。为了能够做到这一点,它需要来自调用者的数据 这些数据是如何以最佳方式进入对象的。假设它需要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);
}