2010-08-12 46 views
36

Tôi thấy mình không có chức năng lớp riêng. Nếu có thể, tất cả các ứng cử viên cho hàm lớp riêng thay vì tôi đặt vào không gian tên không tên và chuyển tất cả các thông tin cần thiết như các tham số hàm. Tôi không có một lời giải thích lý do tại sao tôi làm điều đó nhưng ít nhất nó trông tự nhiên hơn với tôi. Kết quả là tôi cần hiển thị ít chi tiết bên trong hơn trong tệp tiêu đề.Chức năng lớp riêng vs Chức năng trong không gian tên chưa đặt tên

Ý kiến ​​của bạn là gì - thực hành có đúng không?

+2

Tôi nghĩ đó là một câu hỏi thực sự khó khăn (+1). Và tôi nghĩ rằng vẫn còn một số câu trả lời hợp lệ mở ... – Wolf

Trả lời

16

Trong các dự án bán lớn nơi tôi thường làm việc (hơn 2 triệu dòng mã), tôi sẽ cấm các chức năng lớp riêng tư nếu có thể. Lý do là một hàm lớp riêng tư là riêng tư nhưng nó được hiển thị trong tệp tiêu đề. Điều này có nghĩa là nếu tôi thay đổi chữ ký (hoặc bình luận), dù sao tôi cũng được thưởng đôi khi với một biên dịch đầy đủ, tốn vài phút (hoặc vài giờ tùy thuộc vào dự án).

Chỉ cần nói không với điều đó và ẩn nội dung riêng tư trong tệp cpp.

Nếu tôi bắt đầu làm mới trên dự án C++ lớn, tôi sẽ thực thi PIMPL Idiom: http://c2.com/cgi/wiki?PimplIdiom để chuyển các chi tiết riêng tư khác vào tệp cpp.

+1

Nó không phải là một quy tắc 100%. Không gian tên ẩn danh có một nhược điểm lớn khi không thể viết UT cho các hàm trong đó.Biên dịch lại đầy đủ có thể là một mức giá không đáng kể để trả so sánh. Cá nhân, tôi chỉ cấm các vùng tên vô danh và thực thi bảo hiểm UT cho các hàm lớp riêng tư, ít nhất là cho các dự án không ổn định. – sankalpn

3

Tôi nghĩ đây là một thực hành tốt. Nó thường có lợi ích của việc ẩn các cấu trúc auxiallary và các kiểu dữ liệu, làm giảm tần suất và kích thước của các rebuild. Nó cũng làm cho các chức năng dễ dàng hơn để tách ra thành một mô-đun khác nếu nó chỉ ra rằng chúng hữu ích ở nơi khác.

5

Về cơ bản, câu hỏi đặt ra là liệu hàm trong câu hỏi có thực sự hợp lý như một phần của lớp hay không. Nếu ý định duy nhất của bạn là giữ các chi tiết của lớp ra khỏi tiêu đề, tôi sẽ xem xét sử dụng thành ngữ pimpl thay thế.

10

Tôi đã thực hiện việc này trước đây và nó luôn kết thúc tồi tệ. Bạn không thể truyền các đối tượng lớp vào các hàm, vì chúng cần truy cập các thành viên riêng, có lẽ là tham chiếu (hoặc bạn kết thúc với các danh sách tham số phức tạp), do đó bạn không thể gọi các phương thức lớp công khai. Và bạn không thể gọi các hàm ảo, vì cùng một lý do. Tôi mạnh mẽ tin tưởng (dựa trên kinh nghiệm) rằng đây là một ý tưởng tồi.

Dòng dưới cùng: Điều này nghe có vẻ như là loại ý tưởng có thể hoạt động khi "mô-đun" triển khai có quyền truy cập đặc biệt vào lớp, nhưng đây không phải là trường hợp trong C++.

+0

Bạn đúng rằng đôi khi danh sách tham số đủ lớn. Đó chắc chắn là nhược điểm của phương pháp này. Mặt khác, tôi đang cố gắng tránh xa việc sử dụng bất kỳ chức năng ảo nào, vì vậy tôi rất hiếm khi cần phải gọi chức năng ảo. Dù sao cảm ơn cho câu trả lời! – drumsta

+2

@kriau Tại sao tránh xa việc sử dụng các chức năng ảo? Và bạn đã không loại bỏ sự phụ thuộc của bạn trên tiêu đề. Nó đánh tôi rằng những gì bạn có thể tìm kiếm ở đây là thành ngữ PIMPL. –

+0

+1 cho Pimpl (mặc dù nó không phải là một phần của câu trả lời gốc) –

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