3

作为一名 Objective-C 编码员,我习惯于描述方法名称,例如

[car insertFuelWithAmount:fuelAmount
                     type:fuelType
  causesCarToSelfDestruct:NO];

大多数程序员如何在 C++ 中命名相应的方法?我特别有两个问题:

  1. 我的“C++ Primer”第 4 版副本提到(第 46 页)这gosh_this_is_an_impossibly_long_name_to_type是一个“非常糟糕的标识符名称”。这与 Objective-C 中的心态不同,后者鼓励描述性很强的名称,即使它们很长。为什么 C++ 编码人员不喜欢长的?

  2. 也许这不是一味的迁移,而是彻底改变一个人的心态?如果是这样,需要进行哪些更改?

如果您不介意,请随意允许您自己提出一些进一步的一般性想法。(我知道这不是一个讨论笼统和模糊问题的论坛。因此,我试图在上面说得更具体一些。)

4

5 回答 5

5

正如费尔南德斯指出的那样,您需要找到某种平衡。但请记住,这完全取决于品味,尽管大多数 C++ 程序员都倾向于使用较短但有点描述性的方法名称。

对任何事情都使用极长的名称是不可取的,因为代码实际上将变得不可读。我个人觉得这对我的程序员来说非常令人不安。

当然,语言是不同的,但过渡阶段的重点是删除无关的名称。就像你上面的方法一样。我注意到 Obj-C 程序员到处使用“WithSomething”扩展。例如,这里要改变的一件事是通过使用重载来摆脱那些。

你描述的方法我可能会这样写:

car.insertFuel<int>(amount, false);

如果以整数形式假设一定量的燃料。

于 2012-08-16T10:27:53.370 回答
2

作为一名 Objective-C 编码人员,我个人在其他编程语言中创建了长方法名称。当我需要从别人那里改变游戏时,我真的很难理解一些代码,因为它使用不可读的方法和变量名称加密。

现在我们不必留意大的源文件,让我们为自己和可能需要更改代码的其他人清楚。

所以对于你的例子,我个人会写:

car.insertFuelTypeAndSelfDestruct(fuelAmount, fuelType, NO);

或者如果你能看到我可以考虑的方法描述car.insert

于 2012-08-16T10:27:38.677 回答
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 特性(范围枚举和统一初始化)。在旧版本的语言中,类似的技术是可能的,但更麻烦。

于 2012-08-16T10:42:40.780 回答
0

我个人(以及迄今为止我工作的所有地方)鼓励在 C++ 代码中使用描述性方法和变量名。然而,大多数程序员倾向于不喜欢太长的名字。在这种情况下,通常必须做出妥协——牺牲一些描述性或考虑一些其他更短或更具描述性的词,以减少长度。

在你的情况下,我会这样做:

car.insertFuelWithAmount(fuelAmount, fuelType, safeDestruct);

将方法的名称保留为 id 并跳过最后一个参数的“causesCarTo”前缀。

于 2012-08-16T10:29:17.240 回答
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实现命名参数习语的类:

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));
于 2012-08-16T10:54:23.710 回答