Số ma (lập trình)

Trong lập trình, số ma có thể được hiểu là:

 Các giá trị khác thường chưa được giải thích hoặc đặt tên. Thường xuất hiện nhiều lần trong một chương trình và có thể ( theo nguyên tắc ) nên được thay thế bằng một hằng số đã được định nghĩa.
 Một hằng số hoặc chuỗi xác định định dạng tệp hoặc loại giao thức, chẳng hạn như UNIX.
 Một giá trị không dễ bị nhầm lẫn với các giá trị khác, chẳng hạn như UUID

Giá trị cụ thể chưa được đặt tên[sửa | sửa mã nguồn] 
Số ma có thể đề cập đến các giá trị cụ thể được mã hóa cố định trong mã chương trình (chẳng hạn như "10", "123" và các giá trị khác được viết trực tiếp bằng số). Ví dụ: 1,05 là một số ma điển hình trong đoạn mã sau để tính giá sau thuế:
 price_tax = 1.05 * price
Đôi khi người sáng tạo ra chuơng trình có thể hiểu ý nghĩa của giá trị khi họ viết nó, nhưng đối với các lập trình viên khác, ngay cả bản thân tác giả, sau một thời gian, cũng sẽ cảm thấy khó hiểu mục đích của giá trị này, vì vậy nhiều khi họ cảm thấy thật buồn cười và đùa rằng “Mặc dù không hiểu ý nghĩa của giá trị này. nhưng ít nhất chương trình có thể chạy, nó thực sự là một con số ảo ma” (nguồn gốc đề cập đến thuật toán tốc độ đối ứng căn bậc hai).

Các tác dụng không mong đợi phổ biến của số ma bao gồm:

 Ý nghĩa của giá trị khó hiểu, ảnh hưởng đến việc đọc hiểu.
 Khi giá trị cần được thay đổi, có thể cần phải thay đổi nhiều nơi.
 Khi số ma thuật là số thập phân, thì các giá trị có độ chính xác khác nhau , có thể khó xác định lỗi . Ví dụ: 3.14159 được sử dụng cho pi ở một nơi trong chương trình và 3.1415926 lại được sử dụng ở một nơi khác.

Do đó, người ta thường tin rằng một hằng số có tên có ý nghĩa nên được thay thế số ma.Ví dụ, ví dụ trên có thể được thay đổi thành:
 TAX = 0.05
 price_tax = (1.0 + TAX) * price
Thông tin khác được biểu thị dưới dạng số trong máy tính cũng có thể là số ma , chẳng hạn như màu ở định dạng RGB được biểu thị dưới dạng số thập lục phân:
 setColor("text", 0xffffff)
Khi đọc mã này, thật khó để hiểu ngay rằng 0xffffff đại diện cho màu trắng. Chương trình có thể rõ ràng hơn nếu bạn sử dụng các hằng số được đặt tên rõ ràng:
 WHITE = 0xffffff
 setColor("text", WHITE)
Số ma cũng có thể đề cập đến các giá trị không phải là số khác, chẳng hạn như ký tự, chuỗi, v.v.

Tuy nhiên, không phải tất cả các số cụ thể không tên đều là số ma. Miễn là con số có ý nghĩa rõ ràng và ít có khả năng cần phải thay đổi, thì nó không được coi là một con số ma. Các ví dụ phổ biến bao gồm:

 Giá trị ban đầu và giá trị bước của vòng lặp, hoặc như 0 và 1 trong for (int i = 0; i < max; i += 1).
 Hằng số đơn giản trong công thức toán học, chẳng hạn như số 4 trong công thức d = b * b - 4 * a * c

Ngoài ra số ma cũng được sử dụng trong việc lưu trữ. Thêm các giá trị cố định và chuỗi cố định trong một định dạng tệp cụ thể, rồi xác định định dạng tệp bằng cách kiểm tra xem tệp có chứa các dữ liệu này hay không.

Ví dụ: phần đầu của tệp GIF sẽ chứa hai chuỗi: GIF89a (47 49 46 38 39 61) hoặc GIF87a (47 49 46 38 37 61).