2012-04-20 28 views
14

Tôi tự hỏi nếu thực hành tốt là sử dụng cùng tên cho cả biến thành viên và tham số hàm trong C++. Tôi đến từ một nền Java, nơi mà điều này là phổ biến. Tôi tự hỏi nếu trong C++ có nhược điểm cách làm như sau (mã công trình):Tôi có nên sử dụng cùng một tên cho biến thành viên và tham số hàm trong C++

class Player 
{ 
    public: 
    void setState(PlayerState *state) 
    { 
     this->state = state; 
    } 

    private: 
     PlayerState *state; 
} 

Cảm ơn bạn đã trả lời. Theo tôi được biết trong khi nó hoạt động, một thực hành tốt hơn là nên đặt một số loại đánh dấu để phân biệt biến thành viên từ các thông số chức năng như:

_ or m_ 

Trong một số biên tập viên (như Qt Designer), các biến thành viên là các chương trình trong một khác nhau màu. Đây là lý do tại sao nó không có vẻ cần thiết để thêm bất kỳ tiền tố.

+1

Hoàn toàn là vấn đề lựa chọn và quy ước theo các nguyên tắc mã hóa của tổ chức của bạn. –

+1

Tôi không nghĩ có bất kỳ dấu hiệu nào ngoài việc không phải viết 'this-> '. Tôi luôn luôn sử dụng một số loại gạch dưới trước đây, nhưng nó là một vấn đề của hương vị. –

+0

Một số người, bắt đầu tên attrib với m, ví dụ ở đây sẽ là mState, tốt hơn là làm theo cách đó nếu mã được sửa đổi bởi người khác, bao giờ dễ đọc hơn là mã của bạn, tốt hơn – DGomez

Trả lời

11

Điều đó đúng và được phép theo tiêu chuẩn. Nhưng cách tiếp cận tốt hơn là sử dụng một số quy ước đặt tên cho các biến thành viên. Ví dụ: bạn có thể sử dụng tiền tố m_ cho tất cả các biến thành viên, sau đó bất kỳ ai cũng có thể suy ra những gì m_state là. Nó làm tăng khả năng đọc mã và tránh những lỗi phổ biến.

Ngoài ra, nếu m_state là thành viên, thì bạn không phải viết this->m_state = state trong chức năng thành viên, bạn chỉ có thể viết m_state = state. Trong mã hiện tại của bạn, phần this-> trở nên cần thiết, mà không cần state = state sẽ tự chuyển nhượng.

+0

Điều gì sẽ xảy ra nếu "điều này" bị loại trừ (state = state)? Điều đó có nghĩa là tham số chức năng có thể mất ưu tiên hơn và do đó biến lớp không được thiết lập tôi đoán! – Rajesh

0

Tôi khuyên bạn nên tuân theo một số quy ước kiểu mã hóa. Cá nhân tôi sử dụng:

class Player 
{ 
    public: 
    void setState(PlayerState *state) 
    { 
     _state = state; 
    } 

    private: 
     PlayerState* _state; 
} 
+1

Cá nhân tôi tôi thích các dấu gạch dưới hàng đầu vì chúng thường dành cho các hàm thư viện chuẩn và trình biên dịch. Tôi thích dấu gạch dưới. – 111111

+0

Tôi không thích bất kỳ dấu gạch dưới nào! Với tên mangling, __attrib vv Tôi đã nhìn thấy đủ dấu gạch dưới trong C + + như nó được! –

+0

Tất cả những điều này phụ thuộc vào kiểu mã hóa mà công ty của bạn đang theo dõi. Dấu gạch dưới hàng đầu khá phổ biến trong nhiều hướng dẫn về phong cách mã hóa java và C#. – AlexTheo

7

Thông thường mọi người chỉ đặt dấu gạch dưới sau biến hoặc sử dụng tên biến đổi ít mô tả ngắn hơn cho tham số hàm.

Cá nhân tôi không thích điều trùng tên vì khi đọc nó, rất dễ mắc lỗi.

0

Thật tốt, trên thực tế, nó thậm chí có thể là hình thức tốt, miễn là nó chỉ có trong nhà xây dựng của bạn.

1

Không có bất kỳ sự khác biệt nào giữa C++ và java, nhược điểm duy nhất là bạn phải gõ this-> state = state thay vì state = arg. Nhưng mã của bạn là hoàn toàn chấp nhận được, nó có nhiều kiểu dáng hơn bất cứ thứ gì khác.

0

Hãy làm theo cách này:

class Player 
{ 
    public: 
    void setState(PlayerState *state) 
    { 
     this->m_state = state; 
    } 

    private: 
     PlayerState *m_state; 
} 

Bạn sẽ cảm ơn tôi một thời gian sau này. Haha .. (:

Các "m_" ("Thành viên") tiền tố phân biệt thành viên từ các chức năng và các công cụ khác Rất hữu ích với các công cụ như IntelliSense (hoặc bất kỳ IDE tự động gợi ý khác)

Ngoài ra, dấu ấn.. .. m_state như const nếu bạn không có ý định thay đổi nó sau Chỉ trong trường hợp

+1

Làm 'm_state'' const' có nghĩa là bạn không thể hỗ trợ bài tập. –

+0

@ JamesKanze nó thực sự phụ thuộc vào nơi bạn đặt từ khóa 'const' - trước loại, sau nó, hoặc sau dấu hoa thị vv ':) – Poni

+1

Cho rằng' m_state' có kiểu con trỏ, nơi duy nhất bạn có thể đặt 'const 'để làm cho nó' const' là sau '*'. Nếu không, bạn không tạo 'm_state'' const', bạn đang tạo ra những gì nó trỏ đến 'const'. (Và nếu tôi định bình luận về một điều gì đó ngoài câu hỏi thực sự, tôi sẽ hỏi tại sao nó lại là một con trỏ để bắt đầu. 'PlayerState' có vẻ như là một giá trị đối với tôi.) –

0

Đây là thêm một vấn đề phong cách hơn bất cứ điều gì khác Hầu hết thời gian, không có vấn đề:. state là một cái tên rất nghèo cho một biến hoặc giá trị, dưới dạng biến và giá trị phải là danh từ đủ điều kiện, ví dụ:

void setState(PlayerState* newState) 
{ 
    currentState = newState; 
} 

Về lý thuyết, dù sao đi nữa.Trong thực tế, tôi đã tìm thấy nó hữu ích để sử dụng các tiền tố, dọc theo dòng:

class Player 
{ 
    PlayerState* myState; 
public: 
    void setState(PlayerState* newState) 
    { 
     myState = newState; 
    } 
}; 

Khi đọc mã, nếu tên bắt đầu bằng my, nó rõ ràng là một biến thành viên (và nếu nó bắt đầu với our, nó là một thành viên tĩnh biến).

Note quá rằng trong các nhà xây dựng, bạn có thể làm những việc như:

Player::Player(PlayerState* state) 
    : state(state) 
{ 
} 

Tôi không chắc chắn điều này không cho dễ đọc, tuy nhiên:

Player::Player(PlayerState* initialState) 
    : myState(initialState) 
{ 
} 

trông rõ ràng hơn rất nhiều (nhưng đối với các chủ sở hữu dữ liệu đơn giản, sự khác biệt có thể là không quá quan trọng).

0

Tôi tìm thấy nó là một lựa chọn tốt để cung cấp cho các biến thành viên cùng tên với tham số khởi tạo hàm tạo. Dưới đây là lý do của tôi:

  • giảm số lượng các định danh = giảm sự phức tạp
  • bạn không cần phải phát minh ra rất nhiều định danh
  • điều tương tự nên có cùng tên nếu có thể, đó là nói một cách logic , Tôi biết tham số! = Thành viên.
    • bối cảnh và các chỉ số có thể cho phép để cung cấp cho cùng tên để điều tương tự
  • bạn dễ dàng tìm thấy tài liệu tham khảo (định danh) để điều hợp lý bằng cách tìm kiếm, nếu tất cả các tài liệu tham khảo có cùng tên
1

Xin lưu ý rằng một số trình biên dịch (vs 2015) có thể tạo ra một cảnh báo nếu một biến đổ bóng khác. Tất nhiên, người ta có thể vô hiệu hóa các loại cảnh báo này. Nhưng tôi nghĩ rằng đó là thực hành tốt để có các kiểm tra được kích hoạt.

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