【问题标题】:Objective-C coder moving to C++ - method naming conventionsObjective-C 编码器迁移到 C++ - 方法命名约定
【发布时间】:2012-08-16 10:16:45
【问题描述】:

作为一名 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. 也许这不是盲目迁移的问题,而是要彻底改变一个人的心态?如果有,需要做出哪些改变?

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

【问题讨论】:

  • 我认为每个人都需要短名称。就像每个人都需要描述性名称一样(不,描述性并不意味着长)。困难的部分是取得适当的平衡。例如,在您展示的 Objective-C 示例中,我没有看到使用 insertFuelselfDestructs 而不是其中的两个最长标识符的损失。

标签: c++ objective-c


【解决方案1】:

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

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

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

你描述的方法我大概会这样写:

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

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

【讨论】:

  • +1 用于提及重载/类型。很多类型命名可以从方法名称中删除,因为 C++ 是更强类型的。当实现对参数使用正式类时,这会增加很多transitive 的可读性,编译器也会检查这一点,并且可以转换为参数的类型(如果已定义)。
【解决方案2】:

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

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

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

car.insertFuelTypeAndSelfDestruct(fuelAmount, fuelType, NO);

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

【讨论】:

    【解决方案3】:

    函数参数的这种描述级别最好通过为它们定义类型来完成,并使函数名称本身简短易读,例如:

    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 特性(范围枚举和统一初始化)。类似的技术在旧版本的语言中是可能的,但比较麻烦。

    【讨论】:

      【解决方案4】:

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

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

      car.insertFuelWithAmount(fuelAmount, fuelType, safeDestruct);
      

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

      【讨论】:

        【解决方案5】:

        如果您想坚持使用简单的方法调用,我会这样做:

        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));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-07-02
          • 1970-01-01
          • 1970-01-01
          • 2012-12-19
          • 2011-02-09
          • 2015-07-05
          • 2018-05-06
          相关资源
          最近更新 更多