Làm sao để sử dụng biến hiệu quả hơn (part1)

Khi chương trình còn đơn giản thì việc sử dụng biến thường không thành vấn đề, nhưng khi bạn làm những chương trình lớn hơn thì việc sử dụng biến thế nào cho dễ quản lí, tránh lỗi không mong muốn và dễ bảo trì, nâng cấp sau này thì không đơn giản tí nào :blush:

#Part1: Một số lưu ý về khi khai báo biến và khởi tạo biến (Declarations and Initializing Variables)

##Không sử dụng tính năng khai báo ẩn(Implicit Declarations)

Một số ngôn ngữ hỗ trợ khai báo ẩn, tức là khi bạn quên mất không khai báo biến nào đó thì compiler sẽ tự động khai báo cho bạn (ví dụ như Visual Basic). Chức năng này thực sự rất nguy hiểm và đây là một số lưu ý với tính năng này:

Tắt khai báo ẩn. Một số trình biên dịch cho phép tắt khai báo ẩn. Ví dụ, trong Visual Basic bạn có thể dùng câu lệnh Option Explicit, câu đó sẽ bắt bạn phải khai báo toàn bộ các biến trước khi bạn sử dụng chúng.

Khai báo tất cả các biến. Khi bạn gõ một biến mới, hãy khai báo nó, dù cho compiler không yêu cầu

##Khởi tạo biến

Đây là 3 trường hợp phổ biến về việc biến tự dưng có những giá trị mà bạn không ngờ tới:

  • Biến từ đầu đã chưa hề được gán giá trị. Vì thế nên giá trị của nó có thể là bất kì giá trị nào trong bộ nhớ từ khi khởi động chương trình.

  • Giá trị của biến đã “hết hạn sử dụng”. Biến đã được gán một giá trị tại một số thời điểm nào đó, nhưng giá trị đó sau này không còn hợp lệ nữa.

  • Làm việc với con trỏ. Khi làm việc với con trỏ nếu không cẩn thận bạn rất dễ bị dính những lỗi cực kì khó debug, vì triệu chứng lỗi của con trỏ thường hay thay đổi theo thời gian nên có thể nói lỗi về con trỏ là "nỗi khiếp sợ " của lập trình viên.

Và đây sẽ là cách để bạn tránh những trường hợp như vậy xảy ra:

Khởi tạo biến ngay khi nó được khai báo.

 float studentGrades[ MAX_STUDENTS ] = { 0.0 }

Khởi tạo biến ngay trước khi nó được dùng lần đầu tiên.

Ví dụ:


Dim accountIndex As Integer

accountIndex = 0
' code using accountIndex
...

Dim total As Double
total = 0.0       <-- 1
' code using total
...

Dim done As Boolean
done = False       <-- 2
' code using done
While Not done
...
(1) total được khai báo và khởi tạo gần với vị trí nó được sử dụng lần đầu tiên
(2) done cũng được khai báo và khởi tạo gần với vị trí nó được sử dụng lần đầu tiên

Đây chính là ví dụ cho Nguyên Tắc Tiệm Cận: “Hãy giữ những thứ có liên quan ở gần nhau”. Ta có thể áp dụng nguyên tắc này trong việc giữ những comment gần với code mà được chúng giải thích, hoặc là giữ sự thiết lập vòng lặp gần vòng lặp hoặc là giữ những lời gọi (tham chiếu) đến 1 biến gần nhau (cái này sẽ được nói chi tiết trong bài nói về phạm vi biến) và còn rất nhiều trường hợp để áp dụng nguyên tắc này nữa.

Sử dụng final hoặc là const khi có thể.Với những biến mà được khai báo bằng final trong Java hoặc const trong C++, bạn có thể bảo vệ biến của bạn từ khi bạn khởi tạo cho nó một giá trị nào đó.

Và bạn hãy nhớ chú ý đến các biến kiểu như biến đếm. Những biến như là i, j, k,sumtotal thường được sử dụng làm biến đếm, biến tích trữ. Lỗi cơ bản trong lập trình là việc quên mất không reset các biến đếm trước khi sử dụng chúng tiếp ở lần sau.

Hãy tận dụng lợi thế của các cảnh báo của compiler. Nhiều trình biên dịch cảnh báo bạn rằng bạn quên khởi tạo biến.

Luôn kiểm tra tính hợp lệ của các tham số truyền vào. Trước khi bạn gán giá trị truyền vào, hãy chắc chắn rằng nó hợp lệ.

Sử dụng memory-access checkers để debug mấy lỗi về con trỏ (chưa dùng cái này bao giờ, bác nào biết xin chỉ giáo :joy:)

Debug lỗi con trỏ bằng cách nhập những giá trị đặc biệt. Giá trị 0 là lựa chọn tốt vì nó dễ bị phát hiện ra hơn khi chúng được sử dụng. Với vi xử lí Intel, 0xCC là một giá trị khá tốt để sử dụng. Một ích lợi khác của giá trị 0xCC là nó rất dễ dàng nhận ra trong memory dump - và nó ít khi được sử dụng với lí do chính thống. Ngoài ra, bạn cũng có thể sử dụng hằng số 0xDEADBEEF cho việc này. (vãi cả thịt bò chết :smile: hình như có liên quan đến câu hỏi tuyển dụng của google thì phải)

Và cuối cùng là đừng quên khởi tạo bộ nhớ làm việc khi bắt đầu chương trình.


Bài viết có tham khảo một số nội dung trong cuốn Code Complete và các tài liệu khác :blush:


Part2 ở đây: Làm sao để sử dụng biến hiệu quả hơn (part2)
Part3 ở đây: Làm sao để sử dụng biến hiệu quả hơn (part3)
Part4 ở đây: Làm sao để sử dụng biến hiệu quả hơn (part 4)

13 Likes

Hay lắm! Dịch tiếp đi bạn ơi!

2 Likes

Mình thì dùng tới đâu tạo biến đến đó. Nhiều khi khá rắc rối.

1 Like

Bài này hay, mà có vài đoạn đọc hơi khó hiểu. Vì có một số thuật ngữ ít được dùng trong tiếng Việt, Thành cố gắn thêm từ tiếng Anh vào bên cạnh thuật ngữ tiếng Việt, ví dụ như thế này là ổn

Không sử dụng tính năng khai báo ẩn(Implicit Declarations)

2 Likes

Anh xem đoạn nào không ổn để em sửa luôn , tại có cái em còn chưa học, không biết nên dùng tiếng anh hay tiếng việt :blush:

1 Like

À, anh chỉ góp ý chỗ này, phần khai báo và khởi tạo. Nhiều bạn nắm được thuật ngữ tiếng Việt nhưng không nắm thuật ngữ tiếng Anh. Anh nghĩ nên thêm vào.


P/S: Lần đầu tiên đi phỏng vấn anh cũng gặp câu hỏi phân biệt definedeclare bằng tiếng Anh. Lúc đó anh khá choáng, may mà nhìn mấy câu tiếp theo, thấy cách người ta dùng chữ definedeclare nên anh mới đoán ra được :smiley:

2 Likes

Anh @ltd giải thích luôn câu này để anh em lỡ sau này có gặp hoàn cảnh tương tự còn biết cách giải quyết đi anh :smile:

Đạt có viết một bài ở đây:

2 Likes

Bài viết rất hay, mình đang đọc quyển “The art of readable code” chắc lúc nào rảnh cũng theo chân chủ top dịch cho mọi người.

2 Likes

Tuyệt vời!!! :smile: hóng bài dịch của bác đấy :blush:

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?