编码数学类/函数时的最佳实践是什么?

Isa*_*rke 3 c++ math

介绍性说明:我自愿选择了一个广泛的主题.你知道关于学习捕鱼的报价,就是这样.我不需要回答我的问题,我需要一个解释和建议.我知道你们擅长这个;)


嗨,大家好,

我目前正在将一些算法应用到现有程序中.长话短说,我创建了一个新类"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]; 
};
Run Code Online (Sandbox Code Playgroud)

由于此对象用作另一个类的成员,因此它在*.h中声明:

private:
  Adder adder_;
Run Code Online (Sandbox Code Playgroud)

通过这样做,我无法直接在构造函数中初始化数组(alpha/beta/delta)(int T [3] = {1,2,3};),而不必遍历三个数组.我想把它们放在静态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];
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我的奖金问题是:你有没有看到一些错误或不良做法?

Joh*_*web 5

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

  • 注意你的周围环境

我经常看到代码与代码库中的其他地方做同样的事情.确保您的队友或前任尚未解决您尝试解决的问题.

  • 尽量不要重新发明轮子

我前一点的延伸.

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

  • 考虑一下如何测试代码

测试驱动开发(TDD)是确保代码可测试和测试的一种方式(但不是唯一的方法).如果您考虑从一开始就测试代码,那么测试将非常容易.然后测试一下!

  • 写SOLID代码

维基百科页面对此的解释远远超出了我的能力.

  • 确保您的代码可读

有意义的标识符只是一个开始.不必要的注释也会降低可读性,因为长函数,具有长参数列表的函数(例如第二个setter)等等.如果您有编码标准,请坚持下去.

  • 使用const更多

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

  • 确保您的代码可维护

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

  • 确保您的库可用

如果您遵循最小惊讶原则并使用单元测试来记录您的库,那么使用它的程序员将会遇到更少的问题.

前一点的延伸.尽你所能减少代码重复.今天我目睹了一个必须在十五个不同的地方执行的错误修复(并且只在其中的十三个中执行).