作为Objective-C编码器,我习惯于描述方法名称,例如
[car insertFuelWithAmount:fuelAmount
type:fuelType
causesCarToSelfDestruct:NO];
大多数程序员如何在C ++中命名相应的方法?我特别提出两个问题:
我的“C ++ Primer”第4版提到(第46页)gosh_this_is_an_impossibly_long_name_to_type
是一个“非常糟糕的标识符名称”。这与Objective-C中的心态不同,后者鼓励非常具有描述性的名称,即使它们很长。为什么C ++程序员不喜欢长篇文章?
也许这不仅仅是盲目迁移,而是完全改变一个人的心态?如果是这样,需要做出哪些改变?
如果你不介意的话,请随意让自己的一些进一步的想法浮出水面。 (我知道这不是一般性和模糊问题的论坛。因此,我试图在上面做一些更具体的事情。)
答案 0 :(得分:5)
正如费尔南德斯指出的那样,你需要找到各种各样的平衡点。但请记住,这完全取决于品味,尽管大多数C ++程序员都会选择较短但有点描述性的方法名称。
对于任何事物,使用极长的名称是不可取的,因为代码几乎变得不可读。我个人觉得这对我的程序员来说非常令人不安。
当然,语言是不同的,但过渡阶段的重点是删除无关的名称。跟你上面的方法一样。我注意到Obj-C程序员在这里和那里使用“WithSomething”扩展。这里要改变的一件事是通过使用重载来摆脱它们。
您描述的方法我可能会这样写:
car.insertFuel<int>(amount, false);
如果以整数形式假设一定量的燃料。
答案 1 :(得分:2)
作为Objective-C编码器,我个人在其他编程语言中创建了长方法名称。 当我需要从别人那里改变游戏时,我真的很难理解一些代码,因为它是用不可读的方法和变量名加密的。
现在我们不必注意大量的源文件,请让我们为自己以及可能需要更改代码的其他人清楚。
所以对于你的例子我个人会写:
car.insertFuelTypeAndSelfDestruct(fuelAmount, fuelType, NO);
或者,如果您可以看到方法说明,我可以只考虑car.insert
答案 2 :(得分:2)
函数参数的这种描述性水平最好通过为它们定义类型,并使函数名称本身简短且可读,例如:
enum class fuel_type { petrol, diesel, coal, coffee };
enum class self_destruct { no, yes };
car.insert(amount, fuel_type::petrol, self_destruct::no);
由于函数可以针对不同的参数类型进行重载,因此可以通过不同的重载来插入其他内容:
car.insert(amount, oil_type::crude, self_destruct::yes);
您可能希望进一步采用此方法,并为数字参数引入类型;特别是如果你没有“类型”参数来重载:
struct fuel_amount {double litres;};
struct oil_amount {double litres;};
car.insert(fuel_amount{100});
car.insert(oil_amount{3});
请注意,这些技术依赖于新的C ++ 11功能(范围枚举和统一初始化)。在旧版本的语言中,类似的技术是可能的,但更加混乱。
答案 3 :(得分:0)
我个人(以及我迄今为止所有工作的地方)都鼓励在整个C ++代码中使用描述性方法和变量名。但是,大多数程序员往往不喜欢太长的名字。在这种情况下,通常必须做出妥协 - 牺牲一些描述性或思考一般较短或更具描述性的其他词语,以缩短篇幅。
在你的情况下,我会这样做:
car.insertFuelWithAmount(fuelAmount, fuelType, safeDestruct);
将方法的名称保留为id并跳过最后一个参数的'causeCarTo'前缀。
答案 4 :(得分:0)
如果你想坚持一个简单的方法调用,我会做类似的事情:
car.insertFuel(amount, type, false);
或者,您可以使用简单的构造函数创建Fuel
类:
class Fuel {
public:
Fuel(int amount, int type, bool selfDestruct)
: amount(amount), type(type), selfDestruct(selfDestruct) {}
int amount;
int type;
bool selfDestruct;
};
car.insert(Fuel(amount, type, false));
您还可以创建一个Fuel
类来实现命名参数idiom:
class Fuel {
public:
Fuel() : amount(0), type(0), selfDestruct(false) {}
Fuel& Amount(int amount) {
this->amount = amount;
return *this;
}
Fuel& Type(int type) {
this->type = type;
return *this;
}
Fuel& SelfDestruct(bool selfDestruct) {
this->selfDestruct = selfDestruct;
return *this;
}
int amount;
int type;
bool selfDestruct;
};
car.insert(Fuel().Amount(amount).Type(type).SelfDestruct(false));