Một biến có thể có tên ngắn [như x và y] hoặc tên mô tả hơn [tuổi, carname, total_volume]
Quy tắc cho các biến Python
- Tên biến phải bắt đầu bằng một chữ cái hoặc ký tự gạch dưới
- Tên biến không được bắt đầu bằng số
- Tên biến chỉ có thể chứa các ký tự chữ và số và dấu gạch dưới [A-z, 0-9 và _ ]
- Tên biến phân biệt chữ hoa chữ thường [tuổi, Tuổi và TUỔI là ba biến khác nhau]
Thí dụ
#Tên biến pháp lý.
myvar = "John"
my_var = "John"
_my_var = "John"
myVar = "John"
MYVAR = "John"
myvar2 = "John"
#Tên biến không hợp lệ.
2myvar = "John"
my-var = "John"
my var = "John"
Hãy nhớ rằng tên biến phân biệt chữ hoa chữ thường
DCL01-C-EX2. Biến tạm thời trong phạm vi mới bên trong macro có thể ghi đè giá trị nhận dạng trong phạm vi chứa. Tuy nhiên, ngoại lệ này không áp dụng cho các đối số của chính macro
Maximiliano Contieri
Theo dõi
Ngày 1 tháng 12 năm 2021
·
2 phút đọc
Tiết kiệm
Mã mùi 107 — Tái sử dụng biến
Việc sử dụng lại các biến làm cho phạm vi và ranh giới khó theo dõi hơn
Ảnh của Sigmund trên Bapt
Các vấn đềTL; DR. Không đọc và viết cùng một biến cho các mục đích khác nhau
- khả năng đọc
- Vấn đề tiềm ẩn
1. Không sử dụng lại các biến
2. Phương pháp trích xuất để cô lập phạm vi
Định nghĩa bài vănKhi lập trình một tập lệnh, người ta thường sử dụng lại các biến
Điều này dẫn đến sự nhầm lẫn và làm cho việc gỡ lỗi trở nên khó khăn hơn
Chúng ta nên thu hẹp phạm vi càng nhiều càng tốt
Mã mẫuSai
// print line total
double total = item.getPrice[] * item.getQuantity[];
System.out.println[“Line total: “ + total ];// print amount total
total = order.getTotal[] — order.getDiscount[];
System.out.println[ “Amount due: “ + total ];// variable is reused
Đúng
function printLineTotal[] {Phát hiện
double total = item.getPrice[] * item.getQuantity[];
System.out.println[“Line total: “ + total ];
}function printAmountTotal[] {
double total = order.getTotal[] — order.getDiscount[];
System.out.println[ “Amount due: “ + total ];
}
[X] Tự động
Linters có thể sử dụng cây phân tích cú pháp để tìm định nghĩa và cách sử dụng biến
thẻ- khả năng đọc
Tránh sử dụng lại tên biến. Sử dụng các tên cụ thể và khác biệt hơn
quan hệMã mùi 03 — Các chức năng quá dài
Con người cảm thấy buồn chán ngoài dòng 10
Blog. thiên tài. io
Thêm thông tinTái cấu trúc 002 — Phương pháp trích xuất
Tìm một số đoạn mã có thể được nhóm lại và gọi nguyên tử
Blog. thiên tài. io
Đơn giản trước tính tổng quát, dùng trước dùng lại
Kevlin Henney
Báo giá tuyệt vời về kỹ thuật phần mềm
Đôi khi một suy nghĩ ngắn có thể mang lại những ý tưởng tuyệt vời
Blog. thiên tài. io
Bài viết này là một phần của Series CodeSmell
Cách tìm các phần hôi thối trong mã của bạn
Mã có mùi khó chịu. Hãy xem cách thay đổi mùi hương
Blog. thiên tài. io
Thêm nội dung tại blog. thiên tài. io
Một số quyền được bảo lưu
\[ \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \] \[ \newcommand{\vecd}[1]{\overset{-\. -\. \rightharpoonup}{\vphantom{a}\smash {#1}}} \]\[\newcommand{\id}{\mathrm{id}}\] \[ \newcommand{\Span}{\mathrm{span} . #1 \. }\] \[ \newcommand{\inner}[2]{\langle #1, #2 \rangle}\] \[ \newcommand{\Span}{\mathrm{span}}\] \[\newcommand{\ . #1 \. }\] \[ \newcommand{\inner}[2]{\langle #1, #2 \rangle}\] \[ \newcommand{\Span}{\mathrm{span}}\]\[\newcommand{\ . 8,0]{x212B}}\]
không có tiêu đềHãy xem lại một vài dòng mã từ hàm drawWorm[]
wormSegmentRect = pygame.Rect[x, y, CELLSIZE, CELLSIZE] pygame.draw.rect[DISPLAYSURF, DARKGREEN, wormSegmentRect] wormInnerSegmentRect = pygame.Rect[x + 4, y + 4, CELLSIZE - 8, CELLSIZE - 8] pygame.draw.rect[DISPLAYSURF, GREEN, wormInnerSegmentRect]
Lưu ý rằng hai đối tượng Rect khác nhau được tạo trên dòng 1 [199] và 3 [201]. Đối tượng Rect được tạo ở dòng 1 [199] được lưu trữ trong biến cục bộ wormSegmentRect
và được truyền cho hàm pygame.draw.rect[]
ở dòng 200. Đối tượng Rect được tạo ở dòng 3 [201] được lưu trữ trong biến cục bộ wormInnerSegmentRect
và được truyền cho hàm pygame.draw.rect[]
ở dòng 4 [202]
Mỗi khi bạn tạo một biến, nó sẽ chiếm một lượng nhỏ bộ nhớ của máy tính. Bạn có thể nghĩ rằng sẽ rất thông minh nếu sử dụng lại biến wormSegmentRect
cho cả hai đối tượng Rect, như thế này
wormSegmentRect = pygame.Rect[x, y, CELLSIZE, CELLSIZE] pygame.draw.rect[DISPLAYSURF, DARKGREEN, wormSegmentRect] wormSegmentRect = pygame.Rect[x + 4, y + 4, CELLSIZE - 8, CELLSIZE - 8] pygame.draw.rect[DISPLAYSURF, GREEN, wormInnerSegmentRect]
Vì đối tượng Rect được trả về bởi
function printLineTotal[] {0 trên dòng 1 [199] sẽ không cần thiết sau 2 [200], chúng ta có thể ghi đè giá trị này và sử dụng lại biến để lưu trữ đối tượng Rect được trả về bởi
double total = item.getPrice[] * item.getQuantity[];
System.out.println[“Line total: “ + total ];
}function printAmountTotal[] {
double total = order.getTotal[] — order.getDiscount[];
System.out.println[ “Amount due: “ + total ];
}
function printLineTotal[] {0 trên dòng 3 [201]. Vì chúng ta hiện đang sử dụng ít biến hơn nên chúng ta đang tiết kiệm bộ nhớ, phải không?
double total = item.getPrice[] * item.getQuantity[];
System.out.println[“Line total: “ + total ];
}function printAmountTotal[] {
double total = order.getTotal[] — order.getDiscount[];
System.out.println[ “Amount due: “ + total ];
}
Mặc dù điều này đúng về mặt kỹ thuật, nhưng bạn thực sự chỉ tiết kiệm được một vài byte. Máy tính hiện đại có bộ nhớ vài tỷ byte. Vì vậy, khoản tiết kiệm không phải là lớn. Trong khi đó, việc sử dụng lại các biến làm giảm khả năng đọc mã. Nếu một lập trình viên đang đọc qua đoạn mã này sau khi nó được viết, họ sẽ thấy rằng wormSegmentRect
được chuyển đến lệnh gọi pygame.draw.rect[]
trên dòng 2 [200] và 4 [202]. Nếu họ cố gắng tìm lần đầu tiên biến wormSegmentRect
được gán giá trị, họ sẽ thấy lệnh gọi
function printLineTotal[] {0 trên dòng 1 [199]. Họ có thể không nhận ra rằng đối tượng Rect được trả về bởi lệnh gọi
double total = item.getPrice[] * item.getQuantity[];
System.out.println[“Line total: “ + total ];
}function printAmountTotal[] {
double total = order.getTotal[] — order.getDiscount[];
System.out.println[ “Amount due: “ + total ];
}
function printLineTotal[] {0 của dòng 1 [199] không giống với đối tượng được chuyển đến lệnh gọi
double total = item.getPrice[] * item.getQuantity[];
System.out.println[“Line total: “ + total ];
}function printAmountTotal[] {
double total = order.getTotal[] — order.getDiscount[];
System.out.println[ “Amount due: “ + total ];
}
pygame.draw.rect[]
trên dòng 4 [202]Những điều nhỏ nhặt như thế này khiến bạn khó hiểu chính xác chương trình của bạn hoạt động như thế nào. Sẽ không chỉ có những lập trình viên khác nhìn vào mã của bạn, những người sẽ bối rối. Khi bạn xem lại đoạn mã của chính mình vài tuần sau khi viết nó, bạn có thể gặp khó khăn trong việc nhớ chính xác nó hoạt động như thế nào. Khả năng đọc mã quan trọng hơn nhiều so với việc tiết kiệm một vài byte bộ nhớ ở đây và ở đó
Để thực hành lập trình bổ sung, bạn có thể tải xuống các phiên bản lỗi của Wormy từ http. //invpy. com/buggy/wormy và cố gắng tìm ra cách sửa lỗi
7. 21. Không sử dụng lại tên biến được chia sẻ theo CC BY-NC-SA 3. 0 và do LibreTexts soạn thảo, phối lại và/hoặc quản lý