2010-01-29 34 views
5

Mã này có mơ hồ hoặc là nó hoàn toàn tốt (được chấp thuận bởi các tiêu chuẩn/có hành vi nhất quán đối với bất kỳ trình biên dịch nào tồn tại)?Điều này không rõ ràng hay nó hoàn toàn ổn?

struct SCustomData { 
    int nCode; 
    int nSum; 
    int nIndex; 
    SCustomData(int nCode, int nSum, int nIndex) 
     : nCode(nCode) 
     , nSum(nSum) 
     , nIndex(nIndex) 
    {} 
}; 

chỉnh sửa:
vâng, tôi đề cập đến thực tế là các biến thành viên có cùng tên với các thông số chính thức của các nhà xây dựng.

+3

Tôi sẽ thành thật, tôi phải đọc nó hai lần ... Tôi có thể là một nhà phát triển không hài lòng nếu tôi phải tiếp tục đọc cùng một mã hai lần. –

+3

Xin lỗi, nhưng những gì được cho là mơ hồ về điều đó? Có vẻ đơn giản với tôi. –

+0

Điều mơ hồ (đối với con người) là có cùng mã định danh cho cả thuộc tính và tham số ... –

Trả lời

6

Không, trong trường hợp này không có sự mơ hồ, nhưng xem xét sau đây:

struct SCustomData { 
//... 
    void SetCode(int nCode) 
    { 
      //OOPS!!! Here we do nothing! 
      //nCode = nCode; 

      //This works but still error prone 
      this->nCode = nCode; 
    } 
}; 

Bạn nên chú ý đến một trong những phong cách mã hóa hiện có. Ví dụ: General Naming Rule in Google C++ Coding Styles hoặc đọc sách tuyệt vời "C++ Coding Standards: 101 Rules, Guidelines, and Best Practices" của Herb Sutter và Andrei Alexandrescu.

+0

Quy tắc đơn giản tôi sử dụng tất cả các thời gian: chữ hoa đầu tiên cho các thông số, chữ thường cho các trường riêng. –

+0

Tôi thích phong cách của Sutter: lạc đà Case - cho tham số (mã - trong ví dụ này), lạc đà Case và gạch dưới (_) - cho các trường riêng (code_ - trong ví dụ này). –

4

Ví dụ của bạn rõ ràng (đối với tôi), nhưng nó không thực hành tốt, bởi vì nó có thể nhanh chóng trở nên mơ hồ như địa ngục.

Đó là một thời gian dài kể từ khi tôi đã viết bất kỳ C + + trong sự tức giận, vì vậy tôi đoán những gì sau đây sẽ làm.
Bạn có BIẾT những gì nó sẽ làm gì? Bạn có chắc không?

class Noddy 
{ 
    int* i; 
    Noddy(int *i) 
    : i(i) 
    { 
     if(i == NULL) 
      i = new int; 
    } 
}; 
+1

Vâng, tôi biết nó sẽ làm gì, nhưng tôi sẽ không đặt cược tiền mà đồng nghiệp của tôi làm :) –

+0

Nói cho tôi biết Hãy cho tôi biết! Bên trong là 'i' đề cập đến 'tuyên bố gần nhất': đối số? (Danh sách khởi tạo rõ ràng chỉ có thể chỉ thành viên) – xtofl

+2

@xtofl: Đúng, để làm những gì nó "trông" như nó phải làm, nó sẽ cần phải được "this-> i" bên trong các dấu ngoặc nhọn {} –

1

Nếu bạn đang đề cập đến việc sử dụng cùng một tên cho các thành viên và đối số hàm tạo, thì điều đó hoàn toàn ổn. Tuy nhiên, bạn có thể tìm thấy một số người nhấn mạnh rằng đó là thực hành xấu vì một lý do nào đó.

Nếu bạn cần truy cập các thành viên trong phần thân của hàm tạo, thì bạn cần cẩn thận - hoặc đặt cho các đối số các tên khác nhau hoặc sử dụng this-> để truy cập thành viên.

Nếu bạn đang đề cập đến việc sử dụng mụn cóc giả để nhắc mọi người rằng số nguyên là số nguyên, thì về mặt kỹ thuật được phép, nhưng hoàn toàn không có lợi ích và làm cho mã khó đọc hơn nhiều. Làm ơn đừng làm thế.

+1

Là một trong những "người đó", lý do của tôi là a) OP phải hỏi về điều này - vì vậy có lẽ những người khác sẽ đọc mã đó và b) xem đoạn thứ hai của bạn. –

+1

@Neil: (a) không thể viết C++ theo cách mà mọi người đọc nó không cần biết C++, (b) Tôi hoàn toàn đồng ý, trong một hàm có nội dung không trống, ẩn các biến thành viên với các tham số đang yêu cầu sự cố. Sự khác biệt là trong (b), thật dễ dàng để vô tình làm lẫn lộn cả hai ngay cả khi bạn biết ngôn ngữ tốt, chỉ vì bạn quên mất việc ẩn từ một phút đến lần tiếp theo. Điều này dẫn đến lỗi. Trong (a), chỉ có một ý định chính đáng của mã và câu hỏi là liệu bạn có nhận thức được rằng đó là hợp pháp. Điều này dẫn đến một khoảnh khắc giáo dục. –

1

Nói chung, tôi đã đặt trước các biến mẫu với dấu gạch dưới và các tham số được đặt tên trong hàm tạo mà không có bất kỳ tiền tố nào. Ít nhất, điều này sẽ làm sáng tỏ các tham số của bạn từ các biến cá thể của bạn. Nó cũng làm cho cuộc sống ít bận rộn hơn nếu khởi tạo trong cơ thể của nhà xây dựng.

struct SCustomData { 
    int _nCode; 
    int _nSum; 
    int _nIndex; 
    SCustomData(int nCode, int nSum, int nIndex) 
     : _nCode(nCode), _nSum(nSum), _nIndex(nIndex) 
    {} 
}; 

// Alternatively 
struct SCustomData { 
    int _nCode; 
    SCustomData(int nCode) 
    { 
     this->_nCode = nCode; 
    } 
}; 

Tôi không thích xếp các biến theo cách viết trong câu hỏi. Tôi muốn tiết kiệm không gian dọc, và tôi cũng dễ đọc hơn từ trái sang phải. (Đây là một sở thích cá nhân của tôi, không phải là quy tắc bắt buộc hay bất cứ điều gì tương tự.)

+4

Thật không may, tên định danh bắt đầu bằng dấu gạch dưới được dành riêng cho cả C và C++. – aib

0

Đó là tiêu chuẩn hoàn toàn phù hợp, nhưng có trình biên dịch không chấp nhận các biến thành viên có cùng tên . Trong thực tế, tôi đã phải thay đổi thư viện nguồn mở của tôi vì lý do đó. Xem this patch

1

Tôi có thể nói rằng điều này hoàn toàn ổn.

Đây là phong cách ưa thích của tôi cho các nhà xây dựng sử dụng danh sách khởi tạo và không có bất kỳ mã nào. Tôi nghĩ rằng nó làm giảm sự nhầm lẫn bởi vì nó là hiển nhiên mà tham số constructor đi đến thành viên nào.

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