Giới thiệu

Kotlin là một ngôn ngữ lập trình hiện đại, chủ yếu sử dụng trong lập trình ứng dụng di động (android). Kotlin là 1 dạng cải tiến từ Java, với các khái niệm về kiểu dữ liệu tương tự như Java nhưng khắc phục được các lỗi mà Java đang mắc phải. Cú pháp nhanh gọn và tiện lợi hơn. Hôm nay mình sẽ đi qua 1 số kiến thức cơ bản có trong Kotlin.

Biến (Variables)

Như đã biết, biến là 1 vị trí trong vùng nhớ (memory storage area) dùng để lưu trữ thông tin.

Để có thể chỉ ra các vùng nhớ, đầu tiên phải bắt đầu với cách đặt tên biến.

Trong Kotlin có 2 keywords dùng cho khai báo biến là valvar. Ví dụ:

var language = "Vietnam"
val number = 12

Vậy 2 cái này khác nhau chỗ nào?

Tính bất biến và khả biến trong lập trình

1. Khái niệm

  • Tính khả biến (mutable): một biến sau khi được khai báo giá trị ban đầu (initial value) vẫn có thể thay đổi giá trị biến đó trong tương lai.
  • Tính bất biến (immutable): ngược lại với ở trên, tính bất biến là 1 biến được khai báo giá trị chỉ 1 và luôn luôn 1 giá trị. Việc thay đổi giá trị của biến immutable được xem là không hợp lệ và tạo ra lỗi chương trình.

Trong lập trình nói chung, 2 loại biến này được dùng liên tục trong quá trình tạo dựng 1 ứng dụng.

2. Trường hợp sử dụng

  • Đối với các biến immutable thường được sử dụng để tạo ra các hằng số biến không đổi như chỉ số PI:
PI = 3.14

Chú ý: Đối với các biến này, quy ước (convension) đặt tên biến cũng được các lập trình viên quy định chung là sử dụng UPPERCASE.

  • Ngược lại, các biến thông thường khác đều được xem là mutable variables. Và có convension là camelCase.

3. Áp dụng với Kotlin

Trong Kotlin, 2 keywords valvar cũng đại diện tương ứng lần lượt cho biến immutable và biến mutable.

Xem 2 ví dụ dưới đây để hiểu:

var languages = "Vietnamese"
languages = "English"

Tại đây biến languages sẽ bị thay đổi giá trị vì sử dụng từ khoá var

val LANGUAGE = "Vietnames"
LANGUAGE = "English" //Error

Ngược lại, biến được tạo bởi từ khoá val không thể thay đổi giá trị.

4. Quy ước chung (convension)

Trong hầu hết các ngôn ngữ lập trình, cộng đồng lập trình viên đều đặt ra các quy ước chung để có thể ‘hiểu’ nhau hơn trong quá trình phát triển phần mềm. Đặt tên biến đúng cách cũng được xem là 1 quy ước quan trọng vì biến được tồn tại mọi nơi trong ứng dụng phần mềm.

Về cách đặt tên biến sao cho phù hợp là điều không bắt buộc nhưng để tránh các ‘Noise word’, mình sẽ hướng dẫn đặt tên cho tốt nhất, hiệu quả nhất (best practice).

Đặt tên vừa đủ để hiểu

Từ ‘vừa đủ’ ở đây thể hiện việc không nên đặt tên quá dài như:

val daylabienchuamasosinhvien = "CE150200"

hay tên quá ngắn

val x = 10
val y = 20

hay 1 dạng ’noise word’ thường gặp khác:

val userInfo = "Nguyen Van A - CS150700"

Các cách đặt tên ở trên không sinh ra lỗi chương trình, nhưng sẽ gây khó hiểu cho người khác.

  • Với biến daylabienchuamasosinhvien thì nó quá dài, và dư thừa. Mình có thể đặt ngắn hơn và kèm comment nếu nó khó hiểu.
  • Các dạng biến x = 10, y = 20 như trên thường được xem là ‘Magic Number’. Bởi không ai biết số đó dùng cho mục đích gì cả. Tại sao nó là x? Tại sao lại dùng y?
  • Còn với userInfo, đây là 1 dạng ’noise word’ khá phổ biến. Bản chất biến được tạo ra để lưu trữ thông tin đi kèm với tên biến đó, nên việc sử dụng từ ‘Info’ hoàn toàn là dư thừa; mình không nhận xét nó sai, nhưng nó thừa và không nên có.

Comments

Comment là 1 dãy chú thích được lập trình viên viết trên 1 biến, class, method… để kèm thông tin nếu các biến/class/method đó quá khó hiểu. Khi compile chương trình sẽ bỏ qua các dãy chú thích được đánh dấu là comment trong ứng dụng. Giông với Java, Kotlin sử dụng // cho comment 1 dòng và /* */ cho comment nhiều dòng.

// day la comment 1 dong
val passion = "coding"

/*
day la comment
nhieu dong
*/
val otherPassion = "gaming"

Các kiểu dữ liệu cơ bản

Trong Kotlin cũng có các kiểu dữ liệu cơ bản khác như Java, C#, C… Các kiểu dữ liệu được khai báo nhầm mục đích khiến cho biến cố định với cùng kiểu dữ liệu nhất định; Tường minh và rõ ràng hơn.

Các biến trong Kotlin được phân thành 5 loại như sau:

  • Numbers
  • Characters
  • Booleans
  • Arrays
  • String

1. Numbers

Với loại Numbers. Kotlin cũng được xây dựng 6 kiểu dữ liệu tương tự như Java bao gồm:

  • Byte
  • Short
  • Int
  • Long
  • Float
  • Double

Đối với Byte, Short, Int, và Long. 4 kiểu dữ liệu này đại diện cho kiểu số nguyên, tức không có dấu chấm động. Cũng tương tự như trong Java 4 kiểu này có giới hạn bit khác nhau giúp mình lưu trữ các giá trị dễ dàng hơn mà không bị quá tải bộ nhớ.

  • Byte: giá trị lưu trữ [-128, 127]
val range: Byte = 122
// output: 122
  • Short: giá trị lưu trữ [-32768, 32767]
val temperature: Short = -11245
// output: -11245
  • Int: giá trị lưu trữ [-231 , 231-1]
val score: Int = 100000
// output: 100000
  • Long: giá trị lưu trữ [-263, 263-1]
val highestScore: Long = 9999
// output: 9999

Đối với 2 kiểu dữ liệu DoubleFloat đều đại diện cho kiểu chậm động (hay còn gọi là số thực trong toán học), vậy chúng có gì khác nhau?

So sánh Float và Double

Double có độ chính xác cao hơn nhưng tốc độ sử lý chậm hơn do 1 biến Double chứa tới 64-bits trong RAM, trong khi đó Float chỉ tốn có 32-bits nhưng độ chính xác lại thấp hơn Double. Tuỳ trường hợp mà sử dụng để tối ưu vấn đề bản thân hơn.

Với việc lập trình game có đồ hoạ cao hoặc game 3D thì nên sử dụng Float để tăng hiệu suất tải hình ảnh. Nhưng với 1 số ứng dụng nhỏ/đơn giản nên sử dụng Double để tăng độ chính xác cho các việc tính toán xử lý hiệu năng.

val bullet: Float = 12.0f
var mark: Double = 8.5

Chi tiết hơn tại stackoverflow

2. Char (Characters)

Char là kiểu dữ liệu đại diện cho 1 ký tự, kể cả các ký tự đặc biệt như !,@,#,$,&… Các ký tự này được bao quanh bởi dấu nháy đơn (single quotes): ''

val alpha: Char = 'α'
// output: α

3. Boolean

Boolean là kiểu dữ liệu true hoặc false, giá trị thể hiện việc đúng hoặc sai, có hay không,… Thường dùng cho các trường hợp kiểm tra 1 cái gì đó.

val flag: Boolean = true
// output: true

4. Others

Ngoài các dữ liệu kể trên, trong Kotlin còn có Arrays và String mình sẽ nói chi tiết trong bài sau.

var myWorld = "Mom!"
val studentCodes = arrayOf<String>("CE150297", "SE150200", "DE150564", "HE150392")

Kaiz on Github