44. Ưu tiên viết các hàm không phải thành viên và không phải hàm bạn (nonmember nonfriend functions).

Estimated reading: 4 minutes 213 views

Tóm tắt

Tránh các khoản phí thành viên: Bất cứ nơi nào có thể, hãy ưu tiên biến các hàm thành hàm không phải thành viên và không phải hàm bạn (nonmember nonfriends).

Thảo luận

Các hàm không phải thành viên và không phải hàm bạn cải thiện tính đóng gói (encapsulation) bằng cách giảm thiểu sự phụ thuộc (dependencies): Thân hàm không thể phụ thuộc vào các thành viên không công khai (nonpublic members) của lớp (Mục 11). Chúng cũng phá vỡ các lớp nguyên khối (monolithic classes) để giải phóng các chức năng có thể tách rời, giảm thiểu hơn nữa sự kết hợp (coupling) (Mục 33). Chúng cải thiện tính tổng quát (genericity), bởi vì rất khó để viết các mẫu (templates) mà không biết liệu một thao tác có phải là thành viên của một kiểu nhất định hay không (Mục 67).

Sử dụng thuật toán này để xác định xem một hàm nên là thành viên (member) và/hoặc bạn (friend):

				
					// Nếu bạn không có lựa chọn nào khác thì đành chịu; hãy biến nó thành thành viên nếu bắt buộc:
If (hàm là một trong các toán tử =, ->, [], hoặc (), vốn bắt buộc phải là thành viên) {
    Biến nó thành một thành viên.
}

// Nếu nó có thể là một hàm không phải thành viên không phải bạn,
// hoặc hưởng lợi từ việc là một hàm bạn không phải thành viên, hãy làm điều đó:
Else if (
    a) hàm cần một kiểu khác làm đối số bên tay trái (ví dụ như các toán tử >> hoặc <<); HOẶC
    b) nó cần chuyển đổi kiểu trên đối số ngoài cùng bên trái của nó; HOẶC
    c) nó có thể được cài đặt chỉ bằng cách sử dụng giao diện công khai (public interface) của lớp
) {
    Biến nó thành một hàm không phải thành viên (và là friend nếu cần trong trường hợp a) và b)).
    
    If (nó cần hành xử một cách ảo - virtually) {
        Thêm một hàm thành viên ảo để cung cấp hành vi ảo,
        và cài đặt hàm không phải thành viên dựa trên nó.
    }
}

Else {
    Biến nó thành một thành viên.
}				
			

Ví dụ

Ví dụ: basic_string. Lớp chuẩn std::basic_string là một lớp nguyên khối (monolithic) một cách không cần thiết với 103 hàm thành viên—trong đó 71 hàm có thể được viết dưới dạng hàm không phải thành viên không phải bạn mà không làm mất đi hiệu quả. Nhiều trong số chúng sao chép các chức năng đã có sẵn dưới dạng thuật toán (algorithms), hoặc bản thân chúng là các thuật toán sẽ hữu ích rộng rãi hơn nếu chúng không bị chôn vùi bên trong basic_string. (Mục 5 và 32, và [Sutter04])

Leave a Comment

Chia sẻ:

44. Ưu tiên viết các hàm không phải thành viên và không phải hàm bạn (nonmember nonfriend functions).

Or copy link

CONTENTS