18. Khai báo biến càng cục bộ càng tốt

Estimated reading: 5 minutes 264 views

Tóm tắt

Tránh làm “phình to phạm vi” (scope bloat) bằng cách khai báo biến càng cục bộ càng tốt. Biến tạo ra trạng thái (state), và bạn nên xử lý càng ít trạng thái càng tốt, với dòng đời (lifetime) càng ngắn càng tốt. Đây là một trường hợp cụ thể của Mục 10 và xứng đáng được thảo luận riêng.

Thảo luận

Các biến có dòng đời dài hơn mức cần thiết hoặc có phạm vi quá rộng, có một số nhược điểm:

  • Chúng làm cho chương trình khó hiểu và khó bảo trì hơn: Ví dụ, mã có nên cập nhật chuỗi đường dẫn trên toàn mô-đun nếu nó chỉ thay đổi ổ đĩa hiện tại không? Ví dụ: Giả sử một biến lưu đường dẫn path có phạm vi toàn module. Nhưng khi ta chỉ cần thay đổi ổ đĩa hiện tại, khi đó chương trình có nên cập nhật path hay không? → Giải thích chi tiết kèm ví dụ
  • Gây ô nhiễm mã nguồn bằng chính tên của chúng. Biến có phạm vi rộng sẽ dễ gây xung đột tên, làm mã nguồn khó đọc hơn, biến khai báo ở cấp namespace có phạm vi nhìn thấy lớn nhất nhưng lại là những biến tệ nhất (Mục 10).
  • Chúng không phải lúc nào cũng có thể được khởi tạo hợp lý. Nhớ rằng không bao giờ khai báo một biến trước khi bạn có thể khởi tạo nó một cách hợp lý. Các biến chưa được khởi tạo là nguồn lỗi phổ biến trong tất cả các chương trình C và C++ và chúng cần được chủ động chú ý vì chúng không phải lúc nào cũng có thể được trình biên dịch phát hiện (Mục 19).

Trong các phiên bản C cũ trước đây [C99], biến phải được khai báo ở đầu phạm vi (scope), phong cách này đã lỗi thời trên C++. Một vấn đề nghiêm trọng với hạn chế này là ở đầu phạm vi, bạn thường chưa có đủ thông tin để khởi tạo các biến đúng cách, hợp lý. Điều này dẫn đến 2 lựa chọn và đều không tốt:

  1. Khởi tạo với giá trị mặc định (ví dụ: 0)
    • Tốn bộ nhớ không cần thiết.
    • Có thể gây lỗi nếu biến được sử dụng trước khi có giá trị hợp lệ.
  2. Không khởi tạo gì cả
    • Nguy hiểm, vì giá trị của biến có thể không xác định (undefined behavior).
    • Biến kiểu do người dùng định nghĩa (user-defined types) có thể tự khởi tạo về một giá trị rỗng nào đó.

Cách khắc phục rất đơn giản: Định nghĩa biến cục bộ nhất có thể, thường là ngay tại thời điểm bạn có đủ dữ liệu để khởi tạo và ngay trước khi sử dụng lần đầu tiên.

Ngoại lệ

  • Đôi khi cần kéo biến ra khỏi vòng lặp (Mục 9): Nếu việc khai báo biến bên trong vòng lặp gây tốn kém hiệu năng, có thể khai báo ngoài vòng lặp để tái sử dụng.
  • Hằng số (const) không tạo ra trạng thái, nên không cần áp dụng quy tắc này (Mục 17).

Tham khảo

[DewhurstO3] §3, §48, §66 [StroustrupOO] §4.9.4, §6.3

Link

Leave a Comment

Chia sẻ:

18. Khai báo biến càng cục bộ càng tốt

Or copy link

CONTENTS