|
我是给公司内部做C++类库的, 我们的代码规范是: 函数用pascal命名
先看这3个代码, 它们有类似的功能, 只是接口有点区别.
class Temperature;
========================================
代码A: 函数名前面带Get和Set, 接口对称, 不易出错, 但有时很不自然.
class Bird
{
void SetFlying(bool);
bool GetFlying() const;
void SetRunning(bool);
bool GetRunning() const;
bool GetHasFeather() const; // get has ???
Temperature GetTemperature() const;
};
Bird myBird;
myBird.SetFlying(true);
if(myBird.GetFlying())
{
myBird.SetFlying(false);
}
======================================
代码B: 类似自然语言的写法, 但有陷阱, 容易出错
class Bird
{
void Fly();
bool IsFlying() const;
void Land(); // 和Fly相对应
void Run();
bool IsRunning() const;
void Stop(); // 和Run相对应
bool HasFeather() const;
Temperature GetTemperature() const;
};
Bird myBird;
myBird.Fly();
if(myBird.IsFlying())
{
myBird.Stop(); // 错误, 应是Land()
}
=============================================
代码C: 代码A的修改, 去掉Get/Set, 引出了新的问题:
class Bird
{
void Flying(bool);
bool Flying() const;
void Running(bool);
bool Running() const;
bool HasFeather() const;
void Temperature(::Temperature); //函数和类同名, 或多或少会造成一些困扰
::Temperature Temperature() const;
};
========================================
代码D: 代码A的修改版, 用更自然的词代替Get
class Bird
{
void SetFlying(bool);
bool IsFlying() const;
void SetRunning(bool);
bool IsRunning() const;
bool HasFeather() const;
Temperature GetTemperature() const;
};
这几种风格中, 我认为C最好, B最差.
B是不可取的, 因为太容易出错, 代码首先要正确, 才能讲究"风格".
A和C对比, C少了Set/Get, 但从参数形式就可以明显看出, 所以并不需要特意加上.
而重名并不是问题, 因为这两个名字实际在两个不同的空间, 不是真的重名.
D的写法是我最常用的, 但它破坏了对称性, "set"本应对应"get", 而不是"is".
所以我打算在以后开发中采用C的写法, 不用D了.
不知你是否认同我的选择, 或者是否有更好的写法? |
|