Tại sao không phải là cả hai?
Trước hết, "mô tả" và "dài dòng" không giống nhau. Ví dụ: nếu bạn đang viết một vòng lặp khá cục bộ, i
là một tên biến rất tốt cho biến vòng lặp; current_iteration_index
, trong khi có thể mô tả nhiều hơn và chắc chắn dài dòng hơn, thì tệ hơn nhiều và không thêm bất kỳ thông tin nào, bởi vì việc sử dụng i
như một biến vòng lặp được chấp nhận rộng rãi và không có ý nghĩa nào khác i
hơn thế.
Tên biến tốt là mô tả, trong đó một lập trình viên quen thuộc với thành ngữ của ngôn ngữ và các quy ước của cơ sở mã hóa có thể dễ dàng đoán được vai trò của họ là gì, nhưng chúng cũng đủ ngắn gọn để giữ cho mọi thứ nhỏ gọn.
Giới hạn 80 ký tự, mặc dù ban đầu là hậu quả của các hạn chế kỹ thuật của thiết bị đầu cuối văn bản năm 1970, vẫn được nhiều người coi trọng ngày nay và mặc dù vẫn có những lý do kỹ thuật (độ dài dòng tối đa trong một số giao thức mạng, đáng chú ý nhất là liên quan đến e-mail), những lý do hấp dẫn hơn là tâm lý và xã hội. Nó chỉ ra rằng độ dài dòng xung quanh dấu 66 ký tự mang lại trải nghiệm đọc thoải mái nhất cho văn xuôi ngôn ngữ tự nhiên (kích thước phông chữ thú vị không tạo ra nhiều khác biệt, và do đó, cả màn hình hay khổ giấy); Giới hạn dòng 80 ký tự khá gần với giới hạn đó, nhưng vì phần lớn một đoạn mã thông thường thường được thụt vào ít nhất một hoặc hai cấp (có nghĩa là từ 4 đến 16 ký tự, tùy thuộc vào cài đặt thụt lề),
Một tác dụng khác của việc gắn bó với các dòng 80 ký tự là đó là một chỉ báo khá hay về thời điểm mọi thứ quá phức tạp. Các dòng dài thường được gây ra bởi một trong những điều sau đây:
- Các hàm với một danh sách dài các đối số; đây không phải là một điều tốt đẹp vì chúng cản trở khả năng đọc và có thể dễ dàng gây ra các lỗi tinh vi, ví dụ như khi mọi người trao đổi thứ tự đối số theo cách mà trình biên dịch không nắm bắt được.
- Biểu thức phức tạp, thường được tìm thấy trong các điều kiện (ví dụ
if ((user.isLoggedIn && user.hasPermission(page.getRequiredPermission()) && !user.isBanned) || page.getRequiredPermission() == null)
); điều này cũng thường khá khó để giải mã và mã nên được viết lại thành một cái gì đó có cấu trúc hơn. Rất có thể, biểu thức thực hiện quá nhiều và nên được đưa vào một phương thức hoặc hàm.
- Chữ dài được sử dụng trong các cuộc gọi chức năng hoặc biểu thức, ví dụ
print(translate(LANG_EN, LANG_ES, "This is the home page. Feel welcome to click around and see what we have."));
. Di chuyển nghĩa đen thành một biến hoặc hằng; nó vẫn có thể vượt quá độ dài dòng, nhưng nếu bạn thực hiện một cách nhất quán, người đọc ít nhất có thể bỏ qua phần vô hình của dòng một cách an toàn, giả sử rằng chỉ có phần còn lại của nghĩa đen theo sau. Hoặc tốt hơn nữa, di chuyển các chữ ra khỏi mã và vào một kho lưu trữ dữ liệu ngoài (tệp, cơ sở dữ liệu, bất cứ thứ gì).
- Các câu lệnh lồng nhau sâu, ví dụ sáu mức
if
câu lệnh trong một phương thức lớp (đó là 32 cột thụt cho các cài đặt điển hình). Một lần nữa, việc làm tổ sâu tạo ra mã phức tạp và khó đọc, và nên tránh như bệnh dịch hạch - nói một cách đơn giản, việc làm tổ sâu tràn qua ngăn xếp của bộ não con người trong khi đọc.
Tất cả những điều này cuối cùng là triệu chứng của những thứ bạn không muốn có trong cơ sở mã của mình trong thời gian dài và thực thi các giới hạn 80 ký tự là một cách hay và đơn giản giúp giảm độ phức tạp và dễ đọc. (Điều đó không có nghĩa là bạn không thể viết mã hoàn toàn không thể đọc được trong 80 cột: các cuộc thi mã bị che khuất khác nhau là một ví dụ phản đối rõ ràng).