"Xin chào, Amigo! Hôm nay tôi sẽ nói với bạn về kiểu mã và tầm quan trọng của kiểu mã."

"Tôi sẽ bắt đầu với những gì quan trọng nhất.  Mã Java phải dễ đọc.  Cách tiếp cận chung đối với mã là: mã được viết một lần nhưng được đọc hàng trăm lần."

"Giả sử bạn và 10 lập trình viên khác đang viết một ứng dụng. Bạn làm việc trên ứng dụng đó trong ba năm, với các bản phát hành trung gian ba tháng một lần."

"Lâu như vậy?"

"Đây là Java, con châu chấu non của tôi! "Còn một hệ thống doanh nghiệp chạy trên hàng tá máy chủ và được viết bởi 100 người trong hơn 6 năm thì sao? Điều đó đôi khi cũng xảy ra."

"Ái chà."

"Dù sao, quy tắc chính, yêu cầu chính đối với mã là nó phải dễ dàng cho các nhà phát triển khác đọc."

"Trong các ngôn ngữ lập trình khác, mọi người thường làm việc theo nhóm nhỏ trong các nhiệm vụ nhỏ, vì vậy họ có thể có một quy tắc chính khác, chẳng hạn như 'Nó hoạt động? Xuất sắc'."

"Trong vòng vài năm, tất cả các thành viên trong nhóm của bạn sẽ thực hiện một số thay đổi đối với mã mà bạn đã viết. Và mỗi lần họ sẽ phải hiểu mã hoạt động như thế nào."

"Và mã không thể hiểu được nhưng hoạt động hoàn hảo thì rất khó thay đổi.  Họ sẽ loại bỏ nó và viết lại theo cách riêng của họ.  Vì vậy, hãy viết mã mà người khác có thể hiểu được.  Nếu bạn có thể cải thiện mã của mình, thì hãy cải thiện nó. Nếu có thể cải thiện được, thì nó cần phải được cải thiện! "

"Nếu bạn viết mã trong 15 phút và sau đó dành hai giờ để cải thiện nó, thì bạn đang làm đúng. Bạn tiết kiệm được bao nhiêu thời gian cho nhóm?"

"'2 giờ để hiểu mã của bạn' x '100 lần khi mọi người cần hiểu nó' = 200 giờ."

"Tôi đã lôi những con số này ra khỏi không khí, nhưng tôi muốn bạn hiểu vấn đề và phạm vi của nó.  Mã của bạn được tạo ra để các lập trình viên khác đọc được.  Mọi thứ khác chỉ là thứ yếu."

"Mã không hoạt động chính xác? Chúng tôi sẽ sửa nó. Chưa được tối ưu hóa? Chúng tôi sẽ tối ưu hóa. Không được ghi lại? Chúng tôi sẽ thêm nhận xét."

" Mã có khó đọc không? Vứt cái thứ rác rưởi đó vào thùng rác và viết lại mọi thứ từ đầu! "

"Tôi không nghĩ đó là một vấn đề lớn như vậy."

"Một trong những lý do khiến Java trở thành ngôn ngữ lập trình hàng đầu là tất cả mã Java được viết để các lập trình viên khác đọc được."

"Bây giờ hãy chuyển sang câu hỏi thứ hai: làm thế nào để bạn làm cho mã của mình dễ đọc nhất có thể? "

"Ai cũng có thể hiểu khi ai đó nói những từ quen thuộc bằng ngôn ngữ mẹ đẻ của mình. Điều này cũng đúng ở đây. Mã dễ đọc khi lập trình viên có thể dễ dàng đoán được:

A)  Mỗi ​​phương thức làm gì

B)  Mục đích của mỗi lớp học

C)  Chính xác những gì mỗi biến lưu trữ.

Tất cả điều này được truyền đạt trong các tên: tên lớp, tên phương thức và tên biến. Ngoài ra, có phong cách khi đặt tên biến. Và có kiểu mã."

"Tôi sẵn sàng lắng nghe."

" Lập trình dựa trên tiếng Anh tốt!  Một chương trình được viết tốt đọc giống như tài liệu kỹ thuật thông thường. "

" Hãy bắt đầu với những cái tên. "

"Tên phương thức nên mô tả ngắn gọn những gì phương thức làm. Sau đó, mã có thể được đọc như văn xuôi đơn giản."

Chương trình
public String downloadPhoto(String url)
{
 String resultFileName = TempHelper.createTempFileName();

 Downloader downloader = new SingleFileDownloader(new Url(url));
 downloader.setResultFileName(resultFileName)
 downloader.start();
 while(downloader.isDone())
 {
  Thread.sleep(1000);
 }

 if (downloader.hasError())
  return null;

 return resultFileName;
}

"Đây là cách một chương trình như vậy được đọc."

Dòng 1.

"Phương thức này được gọi là 'downloadPhoto'. Có vẻ như nó tải xuống một tệp ảnh từ Internet. Nó tải xuống ở đâu? Chúng tôi chưa biết. Từ đâu? Phương thức này có một tham số có tên là url — đó có thể là URL của tải về."

Dòng 3.

"Biến resultFileName được khai báo và gán giá trị bởi TempHelper.createTempFileName();"

Vì vậy, đây phải là đường dẫn cục bộ đến tệp mà chúng tôi sẽ lưu tệp đã tải xuống của mình.

"Cái tên 'TempHelper' không cho chúng ta biết bất cứ điều gì. Hậu tố 'Trợ giúp' nói rằng đây là một loại lớp tiện ích không chứa logic kinh doanh quan trọng, mà được sử dụng để đơn giản hóa các tác vụ thông thường xảy ra thường xuyên."

"Tên phương thức 'createTempFileName' cho biết phương thức này tạo và trả về tên của tệp tạm thời (tệp tạm thời). Tệp tạm thời là tệp tạm thời được tạo trong một thời gian và sau đó thường bị xóa khi đóng chương trình. "

Dòng 5.

"Một đối tượng SingleFileDownloader được tạo và gán cho trình tải xuống biến."

Đây là đối tượng sẽ tải xuống tệp của chúng tôi từ Internet.

"Một đối tượng SingleFileDownloader được gán cho biến downloader. Từ cái tên, chúng ta có thể cho rằng chương trình có một số loại lớp downloader. Một lớp được viết để tải xuống các tệp đơn lẻ và chúng ta có thể mong đợi gặp các trình tải xuống khác trong mã cho các nhóm của các tệp có tên như: MultiFileDownloader, FileGroupDownloader hoặc DirectoryDownloader"

Dòng 6.

"Chúng tôi đặt thuộc tính resultFileName của đối tượng trình tải xuống bằng với giá trị của biến resultFileName. Nói cách khác, chúng tôi cho trình tải biết nơi lưu tệp đã tải xuống. Như bạn mong đợi. Vì vậy, về cơ bản, chúng tôi đang dự đoán mã!"

Dòng 7.

"Chúng tôi gọi phương thức bắt đầu. Quá trình tải xuống bắt đầu. Điều đó có ý nghĩa. Tôi tự hỏi quá trình tải xuống diễn ra như thế nào: từng phần, trên một chuỗi riêng biệt hay toàn bộ ngay tại đây? Nếu chúng tôi tải xuống toàn bộ nội dung ngay tại đây, có thể mất một khoảng thời gian lâu dài và để lại hậu quả."

Dòng 8-11.

"À. Ở đây chúng ta thấy vòng lặp tiêu chuẩn được viết bởi ai đó đang chờ quá trình tải xuống hoàn tất. Đối tượng downloder có thuộc tính done, thuộc tính này được trả về bởi phương thức isDone(). Bởi vì phương thức này được gọi là isDone(), thay vì getDone( ), chúng tôi kết luận rằng biến done là một boolean hoặc có lẽ là một Boolean."

Dòng 13-14.

"Nếu xảy ra lỗi trong quá trình tải xuống, thì phương thức downloadPhoto trả về null. Thật tốt khi nó xử lý lỗi. Thật tệ khi nó chỉ trả về null—không rõ lỗi là gì. Sẽ tốt hơn nếu đưa ra một ngoại lệ với thông tin về lỗi."

Dòng 16.

msgstr "Chúng tôi trả lại đường dẫn đến tệp cục bộ chứa tệp đã tải xuống."

"Ái chà!"

"Mã của chương trình này làm cho nó hoàn toàn rõ ràng về những gì nó làm. Bạn thậm chí có thể đoán về cách chương trình được tổ chức và những lớp/phương thức nào khác mà chúng tôi sẽ tìm thấy."

"Bây giờ tôi đã hiểu tầm quan trọng của những cái tên."

"Thông tin thêm về tên. Bạn thường có thể đoán một đối tượng/lớp có các phương thức nào. Ví dụ: nếu một đối tượng là một tập hợp, thì rất có thể nó sẽ có một phương thức size() hoặc count() để lấy số phần tử. Ngoài ra , nó có thể sẽ có phương thức add() hoặc insert(). Các phần tử được truy xuất từ ​​các lớp tập hợp bằng cách sử dụng các phương thức get/getItem/getElement."

"Nếu một biến được gọi là i, j hoặc k, thì rất có thể đó là bộ đếm vòng lặp."

"Nếu một biến được gọi là m hoặc n, thì rất có thể đó là kích thước của một mảng/bộ sưu tập."

"Nếu một biến được gọi là tên, thì rất có thể đó là một Chuỗi chứa tên của ai đó."

"Nếu một lớp được gọi là FileInputStream, thì nó đồng thời là một tệp và một luồng đầu vào."

"Bạn càng xem nhiều mã thì càng dễ đọc mã của người khác."

"Nhưng đôi khi có mã rất khó đọc. Trong trường hợp này, đây là một lời khuyên rất thiết thực:"

Mẹo
Viết mã như thể nó sẽ được duy trì bởi một kẻ tâm thần bạo lực biết bạn sống ở đâu .

"Điều đó thật buồn cười và không buồn cười cùng một lúc."

"Bây giờ là một chút về phong cách được sử dụng để đặt tên biến."

"Các nhà phát triển Java cố gắng đặt tên có tính thông tin cao cho các biến và phương thức. Do đó, tên thường bao gồm một số từ. Có 4 kiểu viết hoa tên ghép."

1) Chữ thường  – Tất cả các từ được viết bằng chữ thường. Ví dụ:

'Ngôi nhà xanh'  trở thành 'nhà kính'

'Cô gái Hollywood'  trở thành  'cô gái Hollywood'

Phong cách này được sử dụng cho tên gói.

2) Chữ hoa  – Tất cả các từ được viết bằng chữ in hoa và được phân tách bằng dấu gạch dưới. Ví dụ:

'Giá trị tối đa'  trở thành MAX_VALUE

'Số lượng mèo'  trở thành CAT_COUNT

"Kiểu này được sử dụng cho tên của hằng số (trường tĩnh cuối cùng)."

3) CamelCase  – Tất cả các từ được viết bằng chữ thường, ngoại trừ chữ cái đầu tiên của mỗi từ là chữ hoa. Ví dụ:

'Ngôi nhà xanh'  trở thành  'Ngôi nhà xanh'

'Cô gái Hollywood'  trở thành 'Cô gái Hollywood'

Kiểu này được sử dụng cho tên của các lớp và giao diện.

4) Chữ thường CamelCase (chữ thường)  – Tất cả các từ được viết bằng chữ thường, ngoại trừ chữ cái đầu tiên của mỗi từ ngoại trừ chữ cái đầu tiên là chữ hoa. Ví dụ:

'Nhận chiều rộng' trở thành 'getWidth'

'Nhận tên cô gái Hollywood' trở thành  'getHollywoodGirlName'

"Kiểu này được sử dụng cho tên của các biến và phương thức."

"Vì vậy, không có quá nhiều quy tắc."

1)  Mọi thứ được viết bằng Lower CamelCase.

2)  Tên của các lớp và giao diện luôn được viết hoa.

3)  Tên gói luôn là chữ thường.

4)  Các hằng số luôn viết hoa.

"Có một vài sắc thái, nhưng nói chung là như vậy."

"Bây giờ về các phương thức.  " Tên phương thức hầu như luôn bắt đầu bằng một động từ! 'đếm' là một tên xấu cho một phương pháp. Tốt hơn nên gọi nó là getCount(). Một phương thức thực hiện một số hành động trên đối tượng:  startDownload , interrupt  , sleep  , loadPirateMusic ."

"Như bạn đã biết, có các getters và setters để làm việc với các thuộc tính/trường của đối tượng:  getName / setName , getCount / setCount , v.v."

"Ngoại lệ duy nhất là đối với boolean. Đối với boolean, tên getter sử dụng 'is', không phải 'get', ví dụ: isDone, isEmpty. Bằng cách này, nó gần với cách nói thông thường hơn."

"Làm việc hai giờ một ngày thay vì 8 giờ thì sao? Bị cám dỗ?"

"Đúng!"

"Như bạn nên làm. Đối với một nhà phát triển Java mới vào nghề, yêu cầu cơ bản là hiểu biết xuất sắc về những điều cơ bản của Java, tức là Java Core."

"Tôi có một câu hỏi khác. Tại sao chúng ta có những phương pháp khác nhau này để lấy số phần tử?"

Lớp học Phương thức/thuộc tính để lấy số phần tử
Sợi dây chiều dài ()
Mảng chiều dài
Lập danh sách kích thước ()
Chủ đềNhóm số lượng hoạt động ()

"Trước hết, Java đã được phát minh ra cách đây hơn 20 năm, trước khi các yêu cầu như setCount / getCount được thiết lập và có một cách tiếp cận chung được lấy từ ngôn ngữ C là 'làm cho nó càng ngắn càng tốt'."

"Thứ hai, ngữ nghĩa đóng một vai trò ở đây. Khi nói về một mảng, chúng ta nói về độ dài của nó. Khi nói về một bộ sưu tập, chúng ta nói về kích thước của nó."

"Thật là một bài học thú vị."

"Tôi muốn nói với bạn nhiều hơn nữa, nhưng tôi sợ rằng bạn sẽ không nhớ hết ngay. Tốt hơn là nên chia nhỏ cho bạn nghe."

"Nhưng tôi muốn đề cập đến phong cách liên quan đến việc sử dụng dấu ngoặc nhọn: {}. Có hai cách tiếp cận:"

1)  Mỗi ​​lần dấu ngoặc lại ở một dòng mới

2)  Dấu ngoặc mở nằm ở cuối dòng trước, trong khi dấu ngoặc đóng nằm trên một dòng mới. Phong cách này được gọi là 'Niềng răng Ai Cập'.

"Thành thật mà nói, bạn có thể chọn cách viết mã. Nhiều người sử dụng dấu ngoặc mở trên cùng một dòng. Nhiều người đặt nó trên một dòng mới. Nó giống như cuộc tranh luận xem nên đập đầu nào của quả trứng: đầu nhỏ hay đầu lớn kết thúc."

"Điều duy nhất tôi có thể khuyên bạn là tuân theo bất kỳ phong cách nào đang được sử dụng trong dự án mà bạn đang thực hiện. Đừng thay đổi mã của người khác để phù hợp với phong cách ưa thích của bạn.  Mọi người đều không hoàn hảo. Tôi đang nói với bạn điều này với tư cách là Tiến sĩ Bilaabo. "

"Cảm ơn vì bài học thú vị, Bilaabo. Tôi sẽ suy nghĩ về những gì bạn đã nói."