2009-01-16 20 views
7

Đối với những người bạn đặt tên cho các biến thành viên của bạn mà không có ký hiệu đặc biệt như m_foo hoặc foo_, làm cách nào để đặt tên cho các tham số của bạn?Quy ước đặt tên cho thông số của ctors và setters

Một số tùy chọn Tôi đã cố gắng cho đến nay ...

Obj(int foo) : foo(foo) { } 
void set_foo(int foo) { this->foo = foo; } 

Obj(int _foo) : foo(_foo) { } 
void set_foo(int _foo) { foo = _foo; } 

Obj(int a_foo) : foo(a_foo) { } // a for "argument" 
void set_foo(int a_foo) { foo = a_foo; } 

Obj(int init_foo) : foo(init_foo) { } 
void set_foo(int new_foo) { foo = new_foo; } 

Trả lời

0

Tôi luôn luôn đi cho một Param hoặc Arg hậu tố nhưng chỉ khi định hướng là cần thiết.

Obj(int fooArg) : foo(fooArg) 
+0

Nhưng không có sự mơ hồ ở đây. –

9

Tôi đang sử dụng foo_, tốt hơn _foo vì nó sẽ không xung đột với tên và từ khóa chức năng cụ thể.

+0

thực sự, dấu gạch dưới được dành riêng cho C++ trình biên dịch thực hiện (+1) – xtofl

+0

nó sẽ không xung đột anyway, bởi vì chỉ dành riêng tên bắt đầu với _ là * toàn cầu * những người;) –

+0

Một số công cụ thực hiện cụ thể thực hiện với #define và macro có thể ' t nói là nó giả sử là toàn cầu hay không. – vava

1

tôi có xu hướng đi theo chữ cái đầu tiên của tham số đó đã được thiết lập, và disambiguate với điều này ...

void setFoo(int f) { foo = f; } 

Đối với một setter đơn giản, đối với một biến, nó là khá tốt rõ ràng.

Ngoài ra, tôi thường làm điều này

int setFoo(const int f) { foo = f; } 

vì vậy tôi có thể chuỗi thứ lại với nhau.

+0

hmm Tôi không hiểu làm thế nào sau này cho phép bạn "chuỗi những thứ với nhau". Nó không giống như việc thực hiện thành ngữ chuỗi –

+0

Tôi cho rằng nó giống như toán tử gán, trong đó bạn có thể gán giá trị của setFoo cho một cái gì đó khác .. – Eclipse

+1

Tôi cho rằng bạn muốn viết {return foo = f ; } – KeithB

6

Tôi đang đi với

Obj(int foo) : mFoo(foo) { } 
void setFoo(int foo) { mFoo = foo; } 

trong chương trình của tôi. Đối với nhà xây dựng bản sao và operator =, tôi có xu hướng gọi nó là

Obj(Obj const& that):mFoo(that.mFoo) { } 

Đối với các nhà khai thác, tôi đang đi với

Obj operator+(Obj const& lhs, Obj const& rhs) { ... } 

Bởi vì đó là những l eft hs ide và r ight hs ide của nó.

0

Đối với các lớp:

Obj(int foo) : _foo(foo) {}; 

Đối với cấu trúc:

obj_t(int foo_) : foo(foo_) {}; 

Setter:

Obj.setFoo(int foo) { _foo = foo; } 

Tôi với litb về việc sử dụng lhsrhs cho các cuộc gọi điều hành.

Tôi sử dụng camelCase cho các chức năng của thành viên lớp học và names_with_underscores cho các trường và phương thức cấu trúc.

+0

Tôi thích điều này, ngoại trừ cái cuối cùng, tại sao nó _foo = foo, và không foo_ = foo? – Frank

+0

Vì tôi đã phạm sai lầm. :) Các tiêu chuẩn de-facto tại nơi làm việc của tôi là các biến riêng được đặt trước bằng dấu gạch dưới, vì vậy tôi đã lấy lại mã setter. Tôi đã sửa nó. – mskfisher

0

Tôi đã sử dụng theo quy ước của Microsoft về tiền tố biến thành viên với m_, như m_foo. Tại công ty hiện tại của tôi, quy ước là dấu gạch dưới cuối cho các biến thành viên: foo_.

Nói chung, nếu bạn đang tự làm việc, hãy sử dụng bất kỳ quy ước nào bạn thích. Nếu bạn đang làm việc trong một nhóm, hãy sử dụng bất cứ điều gì mà nhóm đồng ý. Sự nhất quán chung trong một cơ sở mã là điều quan trọng, chứ không phải là quy ước cụ thể.

+0

vâng tôi đang tìm một cái gì đó mà cả hai (a) đẹp và (b) không gây nhầm lẫn cho các coder trung bình, những người sẽ được đọc nó. foo (foo) và foo (a_foo) có thể thất bại sau, trong khi foo (init_foo) và foo (foo_) thất bại trước đây. heh –

1

Tôi tránh (bằng cách tránh nghĩa là không bao giờ sử dụng) gạch dưới làm ký tự đầu tiên của bất kỳ số nhận dạng nào. Tôi biết quá mức của nó nhưng đáng để nỗ lực.

đọc này: What are the rules about using an underscore in a C++ identifier?

Mặc dù không phải là một quy tắc tôi hạn chế việc sử dụng các dấu gạch dưới và thích trường hợp lạc đà để làm cho các biến của tôi có thể đọc được. Nhưng đó chỉ là sở thích cá nhân và tôi không ngại đọc mã sử dụng nó.

Ngoài ra tôi không bao giờ đặt tên tham số giống như biến thành viên của mình. Trình biên dịch sẽ không giúp bạn nắm bắt các loại lỗi này có thể tạo ra (và đây là tất cả về việc trình biên dịch thực hiện công việc thực để bạn có thể thực hiện công việc biểu cảm mà trình biên dịch không thể làm).

int X::setWork(int work) 
{ 
    this->work = work; // OK. But more Java like. 

    work = work;  // Compiler won't see that problem. 
} 

int X::setWork(int newWork) 
{ 
    work = newWork; // A bit harder to get wrong. 
} 
+1

+1 để làm nổi bật việc đặt tên các tham số giống như các thành viên chỉ cần thiết lập mã cho các lỗi không cần thiết trong tương lai. –

0

Số hai có vấn đề như một quy ước, mặc dù trong trường hợp của bạn nó có thể là vô hại. Tên có dấu gạch dưới hàng đầu theo sau là ký tự chữ hoa được dành riêng cho việc triển khai và tất cả các tên có dấu gạch dưới hàng đầu được đặt trước trong ngữ cảnh chung. Nếu bạn không bao giờ có các thành viên lớp bắt đầu bằng chữ hoa (tôi không), bạn an toàn với quy ước như được hiển thị (chỉ sử dụng _foo làm đối số hàm), nhưng tôi không thích quy ước đặt tên ở bất kỳ đâu gần giới hạn.

1

tôi luôn luôn làm điều này:

Obj(int foo) : foo(foo) {} 

tôi đã sử dụng để chơi trò chơi với phụ thêm những biểu tượng vui cho đến khi một lần tôi bị ảnh hưởng bởi điều này:

Obj(Bar& b) : b_(b_) {} 

Bạn có thể nhìn thấy sai lầm? (Có, b_ là biến tham chiếu thành viên riêng). Nó biên dịch mà không có cảnh báo. Chi phí cho tôi 3 ngày gỡ lỗi (Tôi là một lập trình viên xanh).

Bây giờ tôi luôn sử dụng cùng tên để tránh lỗi chính tả (và các sự cố tiếp theo) như thế. Không có sự mơ hồ trong danh sách khởi tạo. Phần này của ngôn ngữ được thiết kế chỉ dành cho trường hợp này, vì vậy hãy tận dụng nó.

0

Tôi đặt tên cho các thành viên thực tế với dấu gạch trailing, vì vậy tôi làm điều này:

Foo(int bar) : bar_(bar) { } 

Lý do là vì vậy tôi có thể sử dụng chức năng getter mà không cần bất cứ điều gì như getBar() (bar() là tốt hơn).

0

tôi làm điều đó như thế này:

obj(int foo) : _foo(foo) { } 
int foo() const { return _foo; } 
void foo(int value) { _foo = value; } 

Bí quyết duy nhất ở đây là để đảm bảo rằng lá thư sau đây gạch dưới là chữ thường. Tuy nhiên, tôi tránh chữ hoa trong các tên định danh ở khắp mọi nơi, vì nó không phù hợp với các quy ước được thư viện chuẩn sử dụng (sử dụng foo_bar_baz cho tất cả các số nhận dạng).

0

Tôi làm theo các Google C++ Style Guide

tên Variable là tất cả chữ viết thường, dấu gạch giữa các từ.Biến thành viên lớp có dấu gạch dưới. Ví dụ: my_exciting_local_variable, my_exciting_member_variable_.

Các vấn đề liên quan