gpt4 book ai didi

c++ - 编写数学类/函数时的最佳做法是什么?

转载 作者:太空狗 更新时间:2023-10-29 19:50:21 27 4
gpt4 key购买 nike

我目前正在将一些算法应用到现有程序中。长话短说,我创建了一个新类“Adder”。 Adder 是另一个类的成员,表示实际执行微积分的物理对象,它调用 adder.calc() 及其参数(仅仅是一个对象列表来执行数学)。

为了进行这些数学计算,我需要一些参数,这些参数在类之外不存在(但可以设置,见下文)。它们既不是配置参数也不是其他类的成员。这些参数是 D1 和 D2、距离和三个固定大小的数组:alpha、beta、delta。

我知道你们中的一些人阅读代码比阅读文本更舒服,所以现在开始:

class Adder
{
public:

Adder();
virtual Adder::~Adder();

void set( float d1, float d2 );
void set( float d1, float d2, int alpha[N_MAX], int beta[N_MAX], int delta[N_MAX] );

// Snipped prototypes
float calc( List& ... );
// ...

inline float get_d1() { return d1_ ;};
inline float get_d2() { return d2_ ;};

private:

float d1_;
float d2_;

int alpha_[N_MAX]; // A #define N_MAX is done elsewhere
int beta_[N_MAX];
int delta_[N_MAX];
};

由于这个对象被用作另一个类的成员,所以它在 *.h 中声明:

private:
Adder adder_;

通过这样做,我无法在构造函数中直接初始化数组 (alpha/beta/delta) ( int T[3] = { 1, 2, 3 }; ),没有必须遍历三个数组。我想过将它们放在 static const 中,但我认为这不是解决此类问题的正确方法。

我的第二个猜测是使用构造函数来初始化数组:

Adder::Adder()
{
int alpha[N_MAX] = { 0, -60, -120, 180, 120, 60 };
int beta[N_MAX] = { 0, 0, 0, 0, 0, 0 };
int delta[N_MAX] = { 0, 0, 180, 180, 180, 0 };

set( 2.5, 0, alpha, beta, delta );
}

void Adder::set( float d1, float d2 ) {
if (d1 > 0)
d1_ = d1;

if (d2 > 0)
d2_ = d2;
}

void Adder::set( float d1, float d2, int alpha[N_MAX], int beta[N_MAX], int delta[N_MAX] ) {
set( d1, d2 );

for (int i = 0; i < N_MAX; ++i) {
alpha_[i] = alpha[i];
beta_[i] = beta[i];
delta_[i] = delta[i];
}
}

使用另一个初始化数组的函数 (init()) 会更好吗?或者有更好的方法吗?

您在此过程中是否发现了一些错误或不良做法?

最佳答案

您选择了一个非常广泛的主题,所以这里有一个更广泛的答案。

  • 注意周围环境

我经常看到代码在做与代码库中其他地方相同的事情。确保您要解决的问题尚未被您的队友或前辈解决。

  • 尽量不要重新发明轮子

我之前观点的延伸。

虽然每个人都应该编写链表或字符串类作为练习,但没有必要为生产代码编写一个。您将可以访问 MFC、OWL、STL、Boost 等。如果已经发明了轮子,就使用它并继续编写解决实际问题的代码!

  • 考虑您将如何测试您的代码

Test Driven Development (TDD)是确保您的代码既可测试又经过测试的一种方法(但不是唯一的方法)。如果您从一开始就考虑测试您的代码,那么测试起来会非常容易。 然后测试一下!

  • 编写 SOLID 代码

The Wikipedia page比我能更好地解释这一点。

  • 确保您的代码可读

有意义的标识符仅仅是个开始。不必要的注释也会降低可读性,就像长函数、具有长参数列表的函数(例如您的第二个 setter)等一样。如果你有 coding standards , 坚持下去。

  • 更多地使用const

我对 C++ 的主要提示是默认情况下不是 const!在您的示例中,您的 getter 应该被声明为 const 并且您的 setter 应该将它们的参数作为 const (和 const - 数组的引用).

  • 确保您的代码是可维护的

单元测试(如上所述)将确保下一个更改代码的人不会破坏您的实现。

  • 确保您的图书馆可用

如果你关注Principle of least astonishment并用单元测试记录你的库,使用它的程序员会遇到更少的问题。

前一点的延伸。尽一切可能减少代码重复。今天我目睹了一个必须在 15 个不同的地方执行的错误修复(并且只在其中的 13 个地方执行)。

关于c++ - 编写数学类/函数时的最佳做法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2855504/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com