2009-06-08 41 views
24

Tôi tiếp tục bối rối về quyết định thiết kế này rất nhiều khi tôi viết chương trình, nhưng tôi không chắc chắn 100% khi tôi làm chức năng thành viên một lớp, khi để nó như một hàm bình thường trong đó các tệp nguồn khác có thể gọi hàm khi khai báo hàm được hiển thị trong một tệp tiêu đề. Liệu truy cập mong muốn vào các biến thành viên của một lớp có liên quan đến quyết định hầu hết thời gian không?Chức năng thành viên C++ so với chức năng miễn phí

+9

Cũng xin lưu ý rằng "phương pháp" là thuật ngữ chung hướng đối tượng. C++ không có "phương thức", chỉ là "hàm". Tiêu chuẩn C++ không bao giờ sử dụng thuật ngữ "phương thức". Thay vào đó, thích sử dụng "chức năng thành viên" hoặc "chức năng miễn phí". –

+1

Nhận xét của Brian thực sự phải là câu trả lời. Đó là điều mà hầu hết mọi người đến đây đang tìm kiếm ... câu hỏi này thậm chí không đề cập đến phương pháp. –

+0

Đồng ý. Có lẽ nên thay đổi tiêu đề của câu hỏi, nó thực sự là gây hiểu nhầm. – Ben

Trả lời

26

Giao diện Nguyên tắc bởi Herb Sutter

Đối với một lớp X, tất cả các chức năng, bao gồm cả chức năng miễn phí, mà cả
(a) "đề cập đến" X, và
(b) đều được "cung cấp với" X
là logic một phần của X, bởi vì họ là một phần của giao diện của X.

Đối với trong cuộc thảo luận sâu đọc Namespaces and the Interface Principle bởi Herb Sutter.

EDIT
Trên thực tế, nếu bạn muốn hiểu C++ đi và đọc mọi thứ gì Herb Sutter đã viết :)

+0

Cảm ơn câu trả lời của bạn. Liên kết khá mô tả. – stanigator

+8

(+1). Tôi cũng thích cái này của Scott Meyers: http://www.ddj.com/cpp/184401197. Các bài báo của Scott và Herb rất bổ ích cho nhau, tôi nghĩ vậy. –

+1

Tôi đang bối rối. Bài viết được liên kết là về các không gian tên, nhưng câu hỏi không hỏi về các không gian tên. Nó hỏi khi nào có "chức năng tự do" so với "chức năng thành viên". –

0

Nếu có gì cần phải truy cập các biến thành viên hoặc một số khía cạnh của một thể hiện của đối tượng, sau đó nó nên được thực hiện một phương pháp.

Nếu nó liên quan chặt chẽ đến lớp, nhưng không cần truy cập bất kỳ thông tin cụ thể nào, thì nó phải được tạo thành hàm chia sẻ (hoặc hàm lớp hoặc hàm tĩnh phụ thuộc vào ngôn ngữ lập trình bạn đang xử lý).

Thậm chí nếu nó chỉ là một chức năng chung, rất có thể là bạn sẽ có nhiều hơn một trong số chúng và chúng có thể được tổng hợp/tổ chức theo một số khái niệm. Sau đó, bạn có thể tạo một lớp đại diện cho khái niệm đó và làm cho chúng được chia sẻ các chức năng.

Với phần trên, tôi không bao giờ thấy bất kỳ lý do nào để tạo các hàm độc lập nữa.

+0

C++ không có khái niệm về phương pháp. –

+4

phương thức == chức năng thành viên – PSkocik

2

Tôi sử dụng các lớp khi tôi cần duy trì trạng thái. Nếu một hàm không cần quyền truy cập vào thông tin trạng thái được duy trì, thì tôi thích một hàm miễn phí hơn vì nó làm cho việc thử nghiệm và sử dụng lại mã dễ dàng hơn.

Nếu tôi có một loạt chức năng liên quan nhưng không cần phải duy trì trạng thái, thì tôi thích đặt các chức năng miễn phí vào không gian tên.

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