Ngôn ngữ lập trình Kotlin – Tại sao phải học?

0
733

Kể từ phiên bản Android Studio 3, Kotlin được tích hợp và người dùng không cần phải cài đặt thêm bất cứ plugin nào giống như Android Studio 2. Điều này càng khẳng định chắc chắn tin đồn trước đó: ngôn ngữ lập trình Kotlin sẽ là ngôn ngữ thay thế cho Java trong các ứng dụng Android.

Bản thân mình là người đã gắn bó với lập trình Android được 5 năm, khi mà Java nó đã ăn sâu vào tâm trí thì sự thay đổi “chóng vánh” này đã làm cho mình gặp đôi chút khó khăn.

Tuy nhiên, thế giới công nghệ luôn thay đổi và chúng ta phải chấp nhận điều đó.

Chúng ta cũng tìm hiểu xem ngôn ngữ lập trình Kotlin là gì và tại sao người ta lại chọn Kotlin để thay thế Java nhé

ngôn ngữ lập trình kotlin

Kotlin là gì?

Kotlin là một ngôn ngữ lập trình mã nguồn mở được phát triển bởi JetBrains (Cha đẻ của  IDE đình đám IntelliJ IDEA – được Google mua lại và chuyển thành Android Studio).

Cũng giống như Java, Kotlin là “ngôn ngữ lập trình kiểu tĩnh”. Tức là các biến cần phải được khai báo trước khi sử dụng. Đối với ứng dụng Android, chúng ta có thể sử dụng Kotlin thay thế cho mã Java hoặc sử dụng đồng thời cả hai trong cùng một project.

Ưu điểm của ngôn ngữ lập trình Kotlin

#1. Hỗ trợ mã JVM bytecode

Kotlin được biên dịch sang mã JVM bytecode hoặc JavaScript. Vì sinh sau đẻ muộn nên Kotlin thừa hưởng những điểm mạnh của các ngôn ngữ tiền bối. Tất nhiên là cũng phải khắc phục những hạn chế của các ngôn ngữ ra đời trước đó.

Mình lấy một ví dụ đơn giản: bạn nào viết ứng dụng Android thì chắc ít nhiều ức chế chuyện ứng dụng “chết” bất thình lình. Kiểm tra Logcat thì NullpointerException xuất hiện đỏ lòm.

Kotlin sẽ không như vậy, việc kiểm tra NullPointerException được thực hiện từ lúc biên dịch ứng dụng chứ không phải đến lúc chạy ứng dụng. Do đó ứng dụng sẽ không bị NullPointerException khi chạy thật.

#2. Chi phí “đầu tư” cho Kotlin gần như bằng 0

ngon-ngu-lap-trinh-kotlin-2

Bởi vì nó là mã nguồn mở và nó miễn phí. Điều này chỉ đúng một phần thôi

Thông thường, chi phí cho giai đoạn bảo trì ứng dụng sẽ chiếm 80% ngân sách. Do vậy, khi dự án chuyển sang một ngôn ngữ mới thì chi phí là điều rất quan trọng. Rất may mắn là việc chuyển đổi từ Java sang Kotlin lại cực đơn giản và nhanh chóng.

JetBrains đã tích hợp một công cụ chất lượng cho IntelliJ IDE giúp chuyển toàn bộ mã Java sang Kotlin. Với công cụ này, bạn hoàn toàn yên tâm chuyển đổi cho cả dự án phức tạp đến hàng triệu dòng code mà không gặp trở ngại gì.

#3. Tương thích hoàn toàn với các thư viện Java.

Theo như lời quảng cáo thì Kotlin có thể sử dụng được với tất cả các các thư viện, framework viết bằng Java.

Với các dự án mới thì không sao, nhưng với các dự án cũ thì đây là điểm cực kì tốt.

Vì sao ư?

Bạn thử tưởng tượng với một dự án đã cũ, và cũng khá phức tạp. Sẽ ra sao nếu bạn phải chuyển đổi cả đống thư viện sang mã kotlini. Mình tin là bạn sẽ đập đầu vào tường mà than trời mà kêu rằng: Trời đã sinh ra Java, tại sao lại sinh ra Kotlin?

#4. Được các IDE hỗ trợ đầy đủ

Hầu hết các IDE hỗ trợ Java thì cũng sẽ hỗ trợ Kotlin. Nếu bạn sử dụng IntelliJ IDE thì sẽ thấy rằng gần như không có sự khác biệt khi viết mã Java hay Kotlin. Có chăng chỉ là thói quen khi nhìn cú pháp hơi khác nhau giữa hai ngôn ngữ mà thôi.

Vẫn còn đó những công cụ quen thuộc như: refactored, searched, navigated hay auto completed…

Với các dự án lớn thì việc sử dụng Kotlin có những ưu điểm như:

  • Độ rủi ro thấp: Vì bạn có thể viết code thử nghiệm bằng Kotlin trong một phần nhỏ của dự án mà không làm ảnh hưởng đến các phần khác
  • Sự gần gũi: Các API được viết bằng mã Kotlin sẽ nhìn giống hệt như mã Java
  • Dễ dàng Review: Cú pháp dễ đọc, dễ hiểu nên việc review code sẽ không còn là công việc nặng nhọc
  • Dễ học và tiếp cận: Cuối cùng, dự án vẫn còn thể hoàn thành mà không cần các thành viên phải thông thạo ngôn ngữ. Đơn giản vì Kotlin rất dễ học và tiếp cận, kể cả với các lập trình viên chưa có kinh nghiệm

Tóm lại, để tiếp cận với Kotlin khi đã biết ngôn ngữ Java là điều không quá khó. Bạn có thể tái sử dụng lại bất kì mã Java nào có sẵn trong dự án. Tất cả các mã Java có thể làm việc với Kotlin và ngược lại.

Đơn giản hơn nữa là bạn cứ viết bằng Java sau đó dùng công cụ để chuyển nó sang Kotlin. Nhưng nhớ là phải hiểu mình đang code gì đó nhé, không sau này khi maintain dự án là lĩnh đủ đấy.

Thực hành Code để hiểu rõ hơn sự ưu việt của Kotlin

#1. Null Safety

Như đã chỉ ra ở trên, một trong những lỗi cơ bản nhất của Java, đó là việc truy cập vào một hàm hoặc thuộc tính(properties) của một đối tượng NULL, kết quả là Exception xảy ra. Trong Java thì đó là NullPointerException(NPE).

Với Kotlin, hệ thống có thể phân biệt được các đối tượng có thể bị NULL với các đối tượng không thể bị NULL.

Ví dụ: một biến với kiểu là String thì không thể bị NULL.

var a: String = “abc” 
a = null // compilation error

Để có thể gán giá trị NULL trong trường hợp này, bạn phải dùng đến toán tử “?

var b: String? = “abc” 
b = null // ok

Bây giờ, nếu bạn gọi một hàm hoặc truy cập một thuộc tính(Property) của đối tượng a. Đảm bảo đối tượng a không bao giờ bị NULL

val l = a.length

Nhưng nếu với trường hợp của đối tượng b thì lại hoàn toàn khác. Trình biên dịch sẽ cảnh báo lỗi

val l = b.length // error: variable ‘b’ can be null

Còn trường hợp vẫn muốn truy cập vào thuộc tính của đối tượng b thì sao?

Đây là một số cách:

  • Cách 1: Kiểm tra điều kiện NULL
val l = if (b != null) b.length else -1
  • Cách 2: sử dụng toán tử (?) Safe Calls
b?.length

Kết quả trả về sẽ là length của b nếu b khác null hoặc null nếu ngược lại

#2. Smart Casting

 // Java 
 if (node instanceOf Leaf) { 
     return ((Leaf) node).symbol; 
 } 
// kotlin 
if (node is Leaf) { 
    return node.symbol; // Smart casting, no need of casting 
} if (document is Payable && document.pay()) { 
    // Smart casting 
    println(“Payable document ${document.title} was payed for.”) 
}

Kotlin sử dụng kĩ thuật lazy evaluation(Tạm dịch: đánh giá lười biếng) giống như Java. Nếu đối tượng document không phải là Payable thì tất nhiên điều kiện thứ 2 document.pay() sẽ không được gọi.

Ngược lại, nếu điều kiện “document is Payable” là đúng thì Kotlin biết document là đối tượng Payable và sử dụng smart cast (ép kiểu thông minh)

#3. Default Arguments

Default arguments là tính năng ít người để ý nhưng nó thực sự hữu ích khi viết code. Nó giúp code ngắn gọn, dễ đọc và dễ bảo trì

class Developer(
    val name: String, 
    val age: Int, 
    val someValue: Int = 0, 
    val profile: String = “”) { 
} 
val amit = Developer(“Amit Shekhar”, 22, 10, “Android Developer”) 
val anand = Developer(“Anand Gaurav”, 20, 11) 
val ravi = Developer(“Ravi Kumar”, 26)

#4. Named Arguments

Đây cũng là một đặc điểm mà mình rất thích ở Kotlin

val amit = Developer(
    “Amit Shekhar”, 
    age = 22, 
    someValue = 10, 
    profile = “Android Developer”)
// This code is not readable. 
myString.transform(true, false, false, true, false) 
// the below code is readable as named arguments are present 
myString.transform( 
    toLowerCase = true, 
    toUpperCase = false, 
    toCamelCase = false, 
    ellipse = true, 
    normalizeSpacing = false)

#5. Functional Programming

Java đến tận phiên bản 8 mới hỗ trợ Functional programing. Trong thì Kotlin đã có sẵn từ những phiên bản đầu tiên.

Nó bao gồm higher-order functions, lambda expressions, operator overloading, lazy evaluation… và rất nhiều hàm làm việc tốt với Collections.

Sự kết hợp giữa lambda expressions và thư viện Kotlin sẽ làm cho việc lập trình của bạn dễ dàng hơn

val numbers = arrayListOf(-42, 17, 13, -9, 12) 
val nonNegative = numbers.filter { it >= 0 } 

println(nonNegative) listOf(1, 2, 3, 4) // list of 1, 2, 3, 4 
.map { it * 10 } // maps to to 10, 20, 30, 40 
.filter { it > 20 } // filters out 30, 40 
.forEach { print(it) } // prints 30, 40

#6. Concise Code

Kotlin giúp cho dự án trở nên nhẹ nhàng hơn theo đúng nghĩa đen. Nghĩa là số dòng code giảm đi đáng kể.

// Java 
Button button = (Button) findViewById(R.id.button); 
button.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
        /* your code */ 
    } }); 
// Kotlin 
val button = findViewById(R.id.fab) as Button 
button.setOnClickListener { view -> /* your code */}

Hạn chế của ngôn ngữ lập trình Kotlin

Mặc dù Kotlin là ngôn ngữ sinh sau đẻ muộn được kế thừa những điểm mạnh của các ngôn ngữ ra đời trước nhưng vẫn có những điểm giới hạn như:

#1. Vẫn chưa có kiểu Aliases

Vì vậy, kiểu hàm (function types) vẫn phải viết một cách thủ công, sẽ hơi thừa thãi trong mã nguồn

#2. Mặc định Class trong Kotlin là final.

Bạn sẽ phải thêm từ khóa “Open” nếu muốn nó trở thành class thông thường như trong Java. Mình không rõ tại sao lại để mặc định là final.

Nhưng đây có lẽ sẽ là hạn chế cho các dự án có mã nguồn kết hợp giữa Kotlin và Java. Vì một số Java Framework sẽ tự động bỏ qua từ khóa Final trong mã Kotlin. Điều này có thể làm cho mã Kotlin chạy không đúng ý đồ của lập trình viên

#3. Cộng đồng hỗ trợ Kotlin còn hạn chế

Mặc dù Kotlin có thể sử dụng lại toàn bộ thư viện hoặc mã nguồn Java nhưng nếu có bản chính chủ thì vẫn tốt hơn, đúng không?

#4. Không tự ép kiểu dữ liệu

Kotlin sẽ không tự động ép kiểu với các kiểu dữ liệu nguyên thủy (primitive data type). Ví dụ: Kiểu Integer sẽ không thể tự chuyển sang kiểu long được. Vì vậy bạn sẽ cần phải ép kiểu một cách thủ công

Kiểu Hàm(Function Type): Các bạn chú ý nhé, hàm cũng gần như biến/hằng ở chỗ hàm cũng có “kiểu” của riêng nó. Cũng giống như biến/hằng được xác định bởi một kiểu dữ liệu nào đó, thì hàm cũng vậy. Nhưng kiểu hàm được xác định bởi kiểu dữ liệu của các tham số đầu vào và kiểu dữ liệu trả ra của hàm.

Kết luận

Với hàng loạt những ưu điểm, cộng với sự hậu thuẫn từ Google, chắc chắn Kotlin sẽ là tương lai của lập trình di động. Do vậy, nếu là người thức thời thì bạn cũng nên học Kotlin dần đi là vừa.

Hi vọng bài viết này sẽ giúp ích cho những ai đang phân vân có nên học Kotlin hay không? Nếu bạn có ý tưởng gì khác thì comment bên dưới để mọi người cùng thảo luận. Mình luôn luôn chào đón

Bình luận. Đặt câu hỏi cũng là một cách học

avatar
  Theo dõi bình luận  
Thông báo