簡體   English   中英

Objective-C編碼器轉向C ++ - 方法命名約定

[英]Objective-C coder moving to C++ - method naming conventions

作為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. 也許這不僅僅是盲目遷移,而是完全改變一個人的心態? 如果是這樣,需要做出哪些改變?

如果你不介意的話,請隨意讓自己的一些進一步的想法浮出水面。 (我知道這不是一般性和模糊問題的論壇。因此,我試圖在上面做一些更具體的事情。)

正如費爾南德斯指出的那樣,你需要找到各種各樣的平衡點。 但請記住,這完全取決於品味,盡管大多數C ++程序員都會選擇較短但有些描述性的方法名稱。

對於任何事情,使用極長的名稱是不可取的,因為代碼將變得幾乎不可讀。 我個人覺得這對我的程序員來說非常令人不安。

當然,語言是不同的,但過渡階段的重點是刪除無關的名稱。 跟你上面的方法一樣。 我注意到Obj-C程序員在這里和那里使用“WithSomething”擴展。 這里要改變的一件事是通過使用重載來擺脫它們。

您描述的方法我可能會這樣寫:

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

如果假設一定量的燃料是整數形式。

作為Objective-C編碼器,我個人在其他編程語言中創建了長方法名稱。 當我需要從別人那里改變游戲時,我真的很難理解一些代碼,因為它用不可讀的方法和變量名加密。

現在我們不需要注意大的源文件,請讓我們為自己以及可能需要更改代碼的其他人清楚。

所以對於你的例子,我個人會寫:

car.insertFuelTypeAndSelfDestruct(fuelAmount, fuelType, NO);

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

函數參數的這種描述性級別最好通過為它們定義類型,並使函數名稱本身簡短且可讀,例如:

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

您可能希望更進一步,並為數字參數引入類型; 特別是如果你沒有“type”參數來重載:

struct fuel_amount {double litres;};
struct oil_amount {double litres;};

car.insert(fuel_amount{100});
car.insert(oil_amount{3});

請注意,這些技術依賴於新的C ++ 11功能(范圍枚舉和統一初始化)。 在舊版本的語言中,類似的技術是可能的,但更加混亂。

我個人(以及我迄今為止所有工作的地方)都鼓勵在整個C ++代碼中使用描述性方法和變量名稱。 但是,大多數程序員往往不喜歡太長的名字。 在這種情況下,通常必須做出妥協 - 犧牲一些描述性或思考一般較短或更具描述性的其他一些詞語,以縮短篇幅。

在你的情況下,我會這樣做:

car.insertFuelWithAmount(fuelAmount, fuelType, safeDestruct);

將方法的名稱保留為id並跳過最后一個參數的'causeCarTo'前綴。

如果你想堅持一個簡單的方法調用,我會做類似的事情:

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

您還可以創建一個實現命名參數idiom的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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM