介绍性说明:我自愿选择了一个广泛的主题.你知道关于学习捕鱼的报价,就是这样.我不需要回答我的问题,我需要一个解释和建议.我知道你们擅长这个;)
嗨,大家好,
我目前正在将一些算法应用到现有程序中.长话短说,我创建了一个新类"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() - 会初始化数组会更好吗?或者有更好的方法吗?
我的奖金问题是:你有没有看到一些错误或不良做法?
你选择了一个非常广泛的主题,所以这里有一个更广泛的答案.
我经常看到代码与代码库中的其他地方做同样的事情.确保您的队友或前任尚未解决您尝试解决的问题.
我前一点的延伸.
虽然每个人都应该编写链表或字符串类作为练习,但是没有必要为生产代码编写一个.您可以访问MFC,OWL,STL,Boost等等.如果已经发明了车轮,请使用它并继续为真正的问题编写解决方案!
测试驱动开发(TDD)是确保代码可测试和测试的一种方式(但不是唯一的方法).如果您考虑从一开始就测试代码,那么测试将非常容易.然后测试一下!
维基百科页面对此的解释远远超出了我的能力.
有意义的标识符只是一个开始.不必要的注释也会降低可读性,因为长函数,具有长参数列表的函数(例如第二个setter)等等.如果您有编码标准,请坚持下去.
const
更多我对C++的主要抱怨是默认情况下不是const!在您的示例中,应声明您的getter,const
并且您的setter应将其参数作为const
(和 - const
数组的引用)传入.
单元测试(如上所述)将确保下一个更改代码的人不会破坏您的实现.
如果您遵循最小惊讶原则并使用单元测试来记录您的库,那么使用它的程序员将会遇到更少的问题.
前一点的延伸.尽你所能减少代码重复.今天我目睹了一个必须在十五个不同的地方执行的错误修复(并且只在其中的十三个中执行).