[Training] Học Java từ những điều cơ bản

"Trên đời này không có ông thầy nào dạy được hết kiến thức mà mình muốn cho mình cả ngoài sự nỗ lực tự học của chính bản thân bạn. Hãy cố gắng code những function cơ bản nhất, những dòng code cơ bản nhất Sau đó nhìn lại xem bạn đã chắc chắn mình đã code nó tốt nhất chưa? Xem còn gì có thể tối ưu được không, nó đã đủ ngắn và performance ngon nhất chưa?"

Đó là cách tôi tự học java từ những ngày đầu chuyển qua lĩnh vực IT này và vẫn còn giữ cho đến tận giờ. Có thể điều này không đúng với các bro khác nhưng ít nhất là nó sẽ đúng với các bạn mới học một ngôn ngữ lập trình, hoặc một ngành bất kỳ nào đó đòi hỏi ít bở sự năng khiếu. Và với cá nhân tôi thì điều này luôn đúng, nên hôm nay tôi xin phép chia sẻ đồng quan điểm từ một tác giả nước ngoài

Nâng cao kỹ năng lập trình java từ những điều đơn giản

I. Mở đầu

Trong lĩnh vực lập trình phần mềm thì quan trọng hơn cả việc chăm chăm viết code chính là chất lượng từ những dòng code mà bạn viết ra. Chất lượng ở đây có nghĩa là nó tuân theo 1 chuẩn làm cho nó trở nên dễ đọc (dễ hiểu) và phát sinh ít bug nhất có thể. Và trong bài viết này chúng tôi đưa ra một vài ví dụ để các bạn lập trình viên Java có thể tham khảo. Dưới đây là những bài thực hành giúp bạn có thể viết đưọc một đoạn code chất lượng.

II. Code chất lượng

1. Khai báo biến và hằng số

Với những biến và hằng số được khai báo khi viết code thì các bạn nên dựa theo những điểm dưới đây:

  • Đặt tên biến theo chuẩn quy định, có ý nghĩa. ví dụ
String studentName;
  • Sử dụng hằng số khi nó đưọc sử dụng ở nhiều nơi (nếu dùng lại 2+ lần thì nên tạo hằng)
  • Cung cấp phạm vi truy cập cho các biến (private, protected, public)
  • Các biến thì nên khởi tạo có giá trị

2. Định nghĩa Class và method

  • Nên có mô tả cho từng class và method (chúng làm chức năng gì, dùng như thế nào, trong trường hợp ra sao)
  • Nên khởi tạo constructor cho class (nhiều bạn thường khai báo class mà chẳng có constructor nào cả)
  • Kiểm tra mỗi biến trước khi sử dụng chúng (rất nhiều ứng dụng crash vì 1 vài lỗi sơ đẳng như NullPoiterException, hay giá trị không hợp lệ...)
public void myMethod(String s) {
    If(s!=null){
        // do stuff
    }
  • Nên tạo thư viện hoặc các method để dùng lại các class, method tránh việc trùng lặp nhiều lần (sau này nếu bạn sửa 1 chỗ thì nó sẽ được update đến tất cả các nơi dùng nó)

3. Các phép toán, phép so sánh

  • Luôn sử dụng dấu {} trong các biểu thức để thể hiện sự rõ ràng giữa các khổi code (code block)
if(a == b){
    return;
}
//do something

hơn là

if(a==b) return;

với những đoạn code hoặc phép so sánh dài thì nhiều khi gây khó hiểu, nhầm lẫn khi review code.

  • Luôn kiểm tra thứ tự ưu tiên của các phép toán hơn là 1 biểu thức
  • Kiểm tra xem liệu rằng có phép toán nhị phân AND(&) / OR(|) được sử dụng đúng thay vì phép toán logic AND(&&) / logical OR(||) hay không

4. Kiểm tra luồng chạy

  • Luôn khởi tạo case default nếu bạn dùng switch/case và nhớ đặt break cho các khổi code nhé nếu không thì thật là tai hại, thiếu 1 dấu break đổi khi gây hỏng logic của cả sản phẩm. Cá nhân tôi thì thích dùng if/else hơn 😃
  • Sử dụng for each thay vì for để lặp
  • Nếu có những phương pháp đệ quy (recursive) thì hãy kiểm tra điều kiện để dừng nó. Nếu không có điều kiện để dừng thì bạn sẽ gặp lỗi StackOverflowError (chạy vô hạn làm treo bộ nhớ)
  • Sử dụng loại exception thích hợp (NullpointerException, FormatException...)
  • Với những nơi dùng try/catch mà chú ý xem chỗ nào cần khối finally để giải phóng tài nguyên
  • Nếu có quá nhiều khối if/else thì nên dùng switch/case ( tôi không thích điều này)

5. Comment code – JavaDoc

  • Luôn tạo comment trên đầu mỗi class, method để giải thích rõ hơn cho các đối tượng này. Mô tả xem những đối tượng này có mục đích gì, cần điều kiện gì, và output ra là cái gì...
  • Cung cấp mô ta cho các đoạn logic mà ta xử lý trong method đó.
  • Cũng cần comment các biến, các hằng là giá trị mà nó được quy định là gì, có giá trị khởi tạo (default) hay không.

6. Xử lý với input/output

  • Luôn phải đóng các file (InputStream, InputFileStream, OutputStream...) để giải phóng bộ nhớ
  • Kiểm tra xem file có tồn tại không trước khi xử lý nó
  • Cần xử lý mọi loại exception với input/output

7. Các vấn đề khác

Khi cần so sánh đối tượng string với một đoạn văn bản có sẵn luôn đặt đoạn văn bản đó phía trái của phép toán so sánh để tránh lỗi null pointer exception

if(“arun”.equals(name)){
}

Nếu giá trị này còn được dùng lại thì bạn nên lưu nó để dùng tránh việc phải tính toán lại 1 lần nữa. Khi viết khối if/else luôn viết điều kiện đúng xảy ra với tần suất lớn trước, và phần còn lại trong điều kiện else.

Trong đoạn code dưới nếu giá trị lớn nhất có thể hơn 100

if(value >= 100){
    //
} else if(value >= 50){
    //
} else {
    //
}

Không nên viết một method quá 50 dòng code. Chuyển những đoạn code dùng dung thành từng method riêng rẽ để dùng lại. Một class không nên dài quá 1500 dòng. Sắp xếp các đoạn logic xử lý theo thứ tự dùng từ phổ biến đến ít dùng, ví dụ thay vì viết

 if((a || b) && c)

thì chúng ta nên viết

if(c && (a || b))

vì nếu c = false thi chả cần a||b làm gì cả

Ngay khi đối tượng hay mảng không đưọc dùng thì hãy set giá trị null cho nó.

Để kiểm tra 1 mảng có chứa phần tử hay không đừng dùng đoạn code

list.size()>0

Thay vì đó hãy dùng

!list.isEmpty()

Tất nhiên bạn phải check điều kiện null trước khi sử dụng rồi

if(list!=null && !list.isEmpty()) { /* Do some work */}

Với những đoạn code if/else thì bạn có thể xem thêm ở http://wiki.c2.com/?GuardClause

III. Kết luận

Mỗi lần code là một lần học, học đi học lại, học mãi cũng thành quen. Nếu có lúc nào đó bạn nản chí với món lập trình hãy xem những đoạn code đơn giản như ở trên nhé, hãy biến những thứ phức tạp thành những thứ đơn giản. Kho tri thức là vô tận, hãy hòa mình vào nó chứ đừng cố gắng biến mình thành nó. Chúc các bạn luôn là những lập trình viên sáng giá mà công ty nào cũng muốn nhận 😃

St from http://www.javatechblog.com/java/best-coding-practices-for-java-developers/