你考虑多个初始化步骤吗?糟糕的形式;? 我写的是C++中的物理模拟(Ising模型),它是用正方格来操作的。我的程序的核心是我的Ising类,它带有一个调用晶格的行和列维度的构造函数。我还有另外两种方法来设置系统的其他参数(温度和初始状态)在进化系统之前必须调用它们例如,示例程序可能如下所示 int main() { Ising system(30, 30); system.set_state(up); system.set_temperature(2); for(int t = 0; t < 1000; t++) { system.step(); } return 0; } intmain(){ 伊辛系统(30,30); 系统。设置状态(设置); 系统。设置温度(2); 对于(int t=0;t Ising < /Cord>类.@ Alxand R.C,确实,如果参数太多,就有必要引入一个参数对象。但是IMHO 4参数还不是一个大问题。请注意,构造函数只实现一次,但可以从许多不同的位置调用,从而增加错误概率。谢谢!这几乎就是为什么我认为这可能是一个坏主意(措辞有了很大改进)。虽然我从未想过要添加一个单独的类来初始化…但我必须尝试一下!不,它不是糟糕的形式,就像绝对初学者的代码是糟糕的形式一样。这就像是绝对的初学者代码。通过更多的经验,您将了解类不变量和RAII(两者都需要单个构造步骤),并了解支持简单构造函数使用的技术,例如NPI。 SimulationInfo si; // accept all defaults Simulation sim(si); sim.simulate(1000);
如果在system.step()之前未调用system.set_*()方法,system.step()将引发异常,提醒用户该问题。我以这种方式实现它以简化我的构造函数;这是一种不好的做法吗?建议尽可能将所有强制参数都放在构造函数中(当然也有例外,但到目前为止应该很少)。通过这种方式,您可以使您的类更容易和更安全地使用你考虑多个初始化步骤吗?糟糕的形式;? 我写的是C++中的物理模拟(Ising模型),它是用正方格来操作的。我的程序的核心是我的Ising类,它带有一个调用晶格的行和列维度的构造函数。我还有另外两种方法来设置系统的其他参数(温度和初始状态)在进化系统之前必须调用它们例如,示例程序可能如下所示 int main() { Ising system(30, 30); system.set_state(up); system.set_temperature(2); for(int t = 0; t < 1000; t++) { system.step(); } return 0; } intmain(){ 伊辛系统(30,30); 系统。设置状态(设置); 系统。设置温度(2); 对于(int t=0;t Ising < /Cord>类.@ Alxand R.C,确实,如果参数太多,就有必要引入一个参数对象。但是IMHO 4参数还不是一个大问题。请注意,构造函数只实现一次,但可以从许多不同的位置调用,从而增加错误概率。谢谢!这几乎就是为什么我认为这可能是一个坏主意(措辞有了很大改进)。虽然我从未想过要添加一个单独的类来初始化…但我必须尝试一下!不,它不是糟糕的形式,就像绝对初学者的代码是糟糕的形式一样。这就像是绝对的初学者代码。通过更多的经验,您将了解类不变量和RAII(两者都需要单个构造步骤),并了解支持简单构造函数使用的技术,例如NPI。 SimulationInfo si; // accept all defaults Simulation sim(si); sim.simulate(1000);,c++,oop,C++,Oop,如果在system.step()之前未调用system.set_*()方法,system.step()将引发异常,提醒用户该问题。我以这种方式实现它以简化我的构造函数;这是一种不好的做法吗?建议尽可能将所有强制参数都放在构造函数中(当然也有例外,但到目前为止应该很少)。通过这种方式,您可以使您的类更容易和更安全地使用 还要注意的是,通过简化构造函数,客户机代码反而变得更加复杂,这在IMO中是一个糟糕的权衡。构造函数只编写一次,但调用方代码可能需要编写多次(增加了编写代码的数量和出错的可能性).如
还要注意的是,通过简化构造函数,客户机代码反而变得更加复杂,这在IMO中是一个糟糕的权衡。构造函数只编写一次,但调用方代码可能需要编写多次(增加了编写代码的数量和出错的可能性).如果必须按特定顺序调用初始化方法,那么我会将对它们的调用包装在它们自己的方法中,因为这表明这些方法本身不是原子的,因此应该将如何调用它们的“知识”保存在一个地方
无论如何,这是我的意见 IMO如果每次都必须调用所有这些初始化步骤,那么这是一种糟糕的形式。设计良好的软件的目标之一是最大限度地减少出错的机会,而在对象“可用”之前必须调用多个方法只会使其更难正确运行。如果这些调用是可选的,那么将它们作为单独的方法就可以了
分享和享受。我一点也不喜欢。从外部文件加载数据时,我面临着同样的问题。创建对象时(即调用其各自的CTOR),数据仍然不可用,只能在稍后阶段检索。因此,我将初始化分为不同阶段:
但是,如果在调用ctor时知道变量,最好不要使代码复杂化。对于任何使用您的代码的人来说,这都可能是一个令人头疼的问题。类中的全部要点是呈现某种抽象。作为一个类的用户,我应该能够假设它的行为类似于它所建模的抽象
部分原因是类必须始终有效。一旦创建了对象(通过调用构造函数),类必须处于有意义的有效状态。它应该可以随时使用。如果不是,那么它就不再是一个好的抽象。如果您计划在同一个晶格上初始化并运行多个瞬态,那么设置初始条件应该与构造函数分开 如果运行瞬态并停止,则可以在构造函数内移动初始条件设置,但这意味着您必须传入参数值才能执行此操作
我完全同意这样一种观点,即一个对象应该在其构造函数被调用后100%准备好使用,但我认为这与设置初始温度场的物理过程是不同的。该对象可以完全可用,但问题中的每个节点都处于相同的绝对零度温度。从热传递的角度来看,隔热体中的均匀温度场没有多大意义。正如另一位评论员指出的那样,必须调用一系列初始化函数是一种糟糕的形式。我会在课堂上总结这一点:
class SimulationInfo
{
private:
int x;
int y;
int state;
int temperature;
public:
SimulationArgs() : x(30), y (30), state(up), temperature(2) { }; // default ctor
// custom constructors here!
// properties
int x() const { return x; };
int y() const { return y; };
int state() const { return state; };
int temperature() const { return temperature; };
}; // eo class SimulationInfo
class Simulation
{
private:
Ising m_system;
public:
Simulation(const SimulationInfo& _info) : m_system(_info.x(), _info.y())
{
m_system.set_state(_info.state());
m_system.set_temperature(_info.temperature());
} // eo ctor
void simulate(int _steps)
{
for(int step(0); step < _steps; ++steps)
m_system.step();
} // eo simulate
}; // eo class Simulation
您还可以考虑一个<代码> ISIGNEXPROSTALSTATE 类,您的用户必须将其填充并作为参数传递给您的代码> Ising < /Cord>类.@ Alxand R.C,确实,如果参数太多,就有必要引入一个参数对象。但是IMHO 4参数还不是一个大问题。请注意,构造函数只实现一次,但可以从许多不同的位置调用,从而增加错误概率。谢谢!这几乎就是为什么我认为这可能是一个坏主意(措辞有了很大改进)。虽然我从未想过要添加一个单独的类来初始化…但我必须尝试一下!不,它不是糟糕的形式,就像绝对初学者的代码是糟糕的形式一样。这就像是绝对的初学者代码。通过更多的经验,您将了解类不变量和RAII(两者都需要单个构造步骤),并了解支持简单构造函数使用的技术,例如NPI。
SimulationInfo si; // accept all defaults
Simulation sim(si);
sim.simulate(1000);