Cách đây vài tháng, khi Google thông báo rằng họ sẽ sử dụng Kotlin làm ngôn ngữ chính thức trong việc phát triển ứng dụng Android. Mình (và mình đoán là nhiều mobile dev khác) đã cảm thấy rất vui mừng và phấn khích. Mình đã ngay lập tức vào trang chủ của Kotlin để tìm hiểu về những tính năng, cú pháp mới của nó. Rồi sau đó đem Swift ra so sánh với Kotlin. Và mình đã có 1 cảm giác cực kỳ lạ: dường như 1 kỷ nguyên mới trong phát triển ứng dụng di động đã bắt đầu.
Thời kỳ mới bắt đầu
Kotlin cũng như Swift mang đến nhiều sự mới mẻ và thú vị trong cú pháp. Chúng làm cho công việc hằng ngày của chúng ta trở nên nhàn hạ và đơn giản hơn rất nhiều. Không chỉ có thế, chúng mang đến những hỗ trợ đáng kể với những mô hình lập trình mới, và cải tiến những mô hình cũ, đặc biệt là lập trình hàm (functional programming).
Functional programming
Thực tế thì lập trình hàm không phải là khái niệm mới trong phát triển phần mềm. Tuy nhiên với Kotlin và Swift, nó đã được hỗ trợ 1 cách tối đa, từ đó việc phát triển ứng dụng iOS hay Android ngày càng trở nên đơn giản.
Nhớ ngày trước, khi mình mới tập toẹ học lập trình Android, lúc đó, 1 bài toán tính tổng dùng vòng for sẽ được viết kiểu thế này:
String[] mixedArray = new String[] { "4", "5", "a", "-2", "Str" }; int results = 0; for (String element : mixedArray) { results += Integer.parseInt(element); }
Còn tại thời điểm hiện tại? Mọi chuyện đơn giản hơn rất nhiều khi ta có thể sử dụng 1 câu lệnh duy nhất, theo cách tiếp cận của tư duy lập trình hàm:
Kotlin:
val mixedArray = arrayOf("4", "5", "a", "-2", "Str") val results = mixedArray .filter { obj -> obj.toIntOrNull() != null } .map { x -> x.toInt() } .reduce { acc, x -> acc + x }
Swift:
let mixedArray = ["4", "5", "a", "-2", "Str"] let results = mixedArray .filter({ (obj) -> Bool in return Int(obj) != nil }) .map { (obj) -> Int in return Int(obj)! } .reduce(0, +)
Lambda expression
Năm 2014, biểu thức lambda chính thức được đưa vào JDK 8. Nhưng không may, lambda lại không thể được sử dụng trong lập trình Android, bởi Android SDK chỉ hỗ trợ JDK version 7. Đó cũng chính là lý do thử viện kiểu như retrolambda được sinh ra trên đời.
Còn ở thời điểm hiện tại, cả 2 ngôn ngữ lập trình Swift và Kotlin đều đã hỗ trợ tính năng này. Ở swift thì là closure còn với Kotlin thì là lambda express.
Swift closure:
{ _ in print("Closure is called!") }
Kotlin lambda express:
{ println("lambda is called!") }
Inline initialization
Tiếp tục, với Swift, ta có thể khởi tạo dictionary chỉ với 1 dòng:
let dictionary = ["key1": "value1", "key2": "value2"]
Còn với Java, ta chỉ có thể khởi tạo giá trị của đối tượng Map thông qua 1 static block:
private static final Map<String, String> map; static { map = new HashMap<String, String>(); map.put("key1", "value1"); map.put("key2", "value2"); }
Thực tế, Java cũng đã hỗ trợ hàm MapOf, nhưng phải tới JDK 9 hàm này mới được bổ sung. Còn với Kotlin, mọi chuyện đơn giản hơn rất nhiều:
val map = mapOf<String, String>("key1" to "value1", "key2" to "value2")
Có 1 điều nữa mình muốn đề cập đó là toán tử Range (khoảng). Tính năng thú vị này làm cho công việc code của ta nhàn hạ hơn rất nhiều. Thay vì sử dụng vòng lặp for như thế này:
for (int i = 0; i < N; i++) { // Do something }
Thì với Kotlin:
for (i in 0..N-1) { // Do something }
hoặc Swift:
for i in 0..<N { // Do Something }
Rất ngắn gọn đúng không.
Tuples
Một thành phần nữa của Swift (và Kotlin) cũng rất hay đó là tuples. Nó cho phép ta tạo ra những tập hợp đơn giản, thay vì việc phải định nghĩa thêm class.
Tổng kết
Tổng kết lại, với những tính năng mới mình đã kể trên, và còn rất nhiều tính năng mình chưa nói đến, mình tin là 1 kỷ nguyên mới trong phát triển mobile đã bắt đầu. Developer giờ đây đã có thể dành nhiều thời gian hơn cho việc xử lý logic nghiệp vụ cũng như luồng chạy của ứng dụng. Thay vì tốn thời gian vào việc viết hàng trăm dòng code, chỉ để xử lý những logic đơn giản.
Nếu trước đây bạn phải tốn thời gian cài thêm các thư viện như kiểu PromiseKit, ReactiveCocoa, RXJava để việc code của bạn dễ thở hơn, thì nay, bạn đã được “trang bị” đầy đủ nhất ngay từ khi bắt đầu. Và mình tin điều đó cũng sẽ thúc đẩy những người mới, làm cho họ cảm thấy lập trình ko phải là thứ gì đó khó khăn, vất vả lắm. Mình tin 1 thời kỳ tươi sáng đã thực sự bắt đầu.