Bài 22-Lập trình hướng đối tượng trong Kotlin – phần 1

[polldaddy poll=9764234]

Kotlin giống như các ngôn ngữ lập trình khác đó là hỗ trợ cài đặt lập trình hướng đối tượng. Và các bạn cần chú ý rằng, Lập trình hướng đối tượng là một khái niệm chung, ngôn ngữ lập trình chỉ là một trong những công cụ để triển khai khái niệm đó mà thôi. Điều này có nghĩa là nếu bạn đã hiểu OOP(object oriented programming) rồi thì C++, C#, Java, PHP, Python, Kotlin, R, GO….hay bất kỳ một ngôn ngữ nào khác sẽ dùng chung khái niệm OOP này để cài đặt, chỉ là kỹ thuật xử lý OOP của các ngôn ngữ này nó khác nhau.

Bài này Tui sẽ điểm qua một số khái niệm liên quan tới OOP, sau đó ta sẽ làm quen với một ví dụ cài đặt OOP bằng Kotlin. Những khái niệm về OOP nó đầy rẫy trên mạng, các bạn có thể tự search và đọc thêm các chi tiết khác.

Một số đặc điểm của OOP:

  • Tập trung vào dữ liệu thay cho các hàm.
  • Chương trình được chia thành các đối tượng độc lập.
  • Cấu trúc dữ liệu được thiết kế sao cho đặc tả được các đối tượng.
  • Dữ liệu được che giấu, bao bọc.
  • Các đối tượng trao đổi với nhau thông qua các hàm.
  • Chương trình được thiết kế theo hướng tiếp cận từ dưới lên (bottom-up): Phương pháp xây dựng chương trình bottom-up là phương pháp thường dùng để xây dựng phần mềm lớn, phức tạp. Ý tưởng của phương pháp này là xuất phát từ nhiều thành phần nhỏ đã có sẵn, ta khéo kết hợp chúng lại để tạo ra thành phần chức năng lớn hơn, ta tiếp tục kết hợp các thành phần xây dựng được để tạo ra thành phần lớn hơn nữa… cho đến khi xây dựng được chương trình giải quyết được bài toán mong muốn.

Một số ưu điểm nổi bật của OOP:

  • Không có nguy cơ dữ liệu bị thay đổi tự do trong chương trình.
  • Khi thay đổi cấu trúc dữ liệu của một đối tượng, không cần thay đổi mã nguồn của các đối tượng khác.
  • Có thể sử dụng lại mã nguồn, tiết kiệm tài nguyên.
  • Phù hợp với các dự án phần mềm lớn, phức tạp.

Khái niệm đối tượng (object) trong lập trình hướng đối tượng giống như một đối tượng cụ thể trong thế giới thực.

Mỗi đối tượng có các thuộc tính và các hành vi riêng:

  • Thuộc tính (attribute) mô tả đặc điểm của đối tượng.
  • Hành vi là phương thức hoạt động của đối tượng, gọi tắt là phương thức (method).

Ví dụ 1: Đối tượng Phân số

Đặc điểm của Phân số (thuộc tính) có:

  • Tử số
  • Mẫu số

Các Thao tác trên phân số (hành vi)

  • Cộng, trừ, nhân, chia
  • Tối giản
  • Nghịch đảo

Ví dụ 2: Đối tượng Xe hơi

Đặc điểm của Xe hơi (thuộc tính) có:

  • Hiệu xe
  • Màu xe
  • Số bánh xe
  • Số cửa

Các Thao tác trên Xe hơi (hành vi):

  • Chạy tới
  • Chạy lui
  • Dừng xe

Các đối tượng có các đặc điểm (thuộc tính và phương thức) giống nhau được gom nhóm thành một lớp để phân biệt với các đối tượng khác và dễ quản lý.

Một lớp (class) là sự phân loại của các đối tượng hay là kiểu (type) của đối tượng.

Ví dụ 3:

−Các chiếc xe Toyota, Honda, Porsche thuộc lớp xe hơi.

– Các con chó giữ nhà, chó săn, chó kiểng thuộc lớp chó.

-Bia Ken, Tiger, Sài gòn đỏ.. được gom lại thành một lớp Bia chẳng hạn

Như vậy Lớp(Class) là một khái niệm trừu tượng, dùng để chỉ một tập hợp các đối tượng có mặt trong hệ thống.

Lớp có thuộc tính và phương thức:

  • Thuộc tính của lớp tương ứng với thuộc tính của đối tượng.
  • Phương thức của lớp tương ứng với các hành động của đối tượng.

Một Lớp có thể có một trong các khả năng sau:

  • Không có thuộc tính, không có phương thức
  • Hoặc chỉ có thuộc tính, không có phương thức.
  • Hoặc chỉ có phương thức, không có thuộc tính.
  • Hoặc có cả thuộc tính và phương thức, trường hợp này là phổ biến nhất.
  • Có các mối quan hệ với các lớp khác

Gói (package)

Một nhóm các lớp (classes) và giao diện (interfaces) được tổ chức thành một đơn vị quản lý theo hình thức không gian tên gọi là package.

Lợi ích của package là tổ chức sắp xếp lại hệ thống thông tin các lớp trong dự án một cách khoa học, giúp cho việc theo dõi bảo trì dự án được tốt nhất.

Tính trừu tượng:

Trường hợp 1:

Lớp (Class) là một khái niệm trừu tượng, đối tượng là một thể hiện cụ thể của lớp.

Ví dụ 4:

Bản thiết kế của chiếc xe hơi là lớp.

Chiếc xe hơi được tạo ra từ bản thiết kế là đối tượng.

Trường hợp 2:

Từ những đối tượng giống nhau: trừu tượng hóa thành một lớp: Chỉ đưa ra các thuộc tính và phương thức cần thiết của đối tượng trong lập trình.

Tui nghĩ bạn nào cũng học Sinh Học, bạn thấy trong Sách giáo khoa người ta cũng phân ra : Lớp Chim, Lớp động vật có vú, lớp động vật ăn cỏ…. đó chính là sự trừu tượng hóa, tự tập các đối tượng họ trừu tượng thành các lớp.

Tính đóng gói:

  • Mỗi lớp được xây dựng để thực hiện một nhóm chức năng đặc trưng của riêng lớp đó.
  • Tất cả mọi thao tác truy xuất vào thành phần dữ liệu từ đối tượng này qua đối tượng khác phải được thực hiện bởi các phương thức (method) của chính đối tượng chứa dữ liệu.
  • Tính đóng gói cho phép dấu thông tin của đối tượng bằng cách kết hợp thông tin và các phương thức liên quan đến thông tin trong đối tượng.

Tính kế thừa:

  • Cho phép xây dựng một lớp mới dựa trên các định nghĩa của một lớp đã có.
  • Lớp đã có gọi là lớp Cha, lớp mới phát sinh gọi là lớp Con
  • Lớp con kế thừa tất cả các thành phần của lớp Cha, có thể mở rộng các thành phần kế thừa và bổ sung thêm các thành phần mới.

ví dụ về sự phát triển các dòng sẽ theo thời gian:

Ví dụ về kế thừa:

Ví dụ về kế thừa trong Employee:

Dưới đây là ví dụ về tạo một Lớp trong Kotlin (trong bài này Tui sẽ không giải thích chi tiết các thành phần trong Kotlin, các bài sau Tui sẽ trình bày rõ):

Ta tạo một Project Kotlin với tên HocOOPPhan1 rồi thêm 1 Class Kotlin theo hình dưới đây:

Bấm chuột phải vào src/ chọn Kotlin File/Class:

Ở màn hình New Kotlin File/Class ta chọn mục Kind là Class, đặt tên lớp là TamGiac–>bấm OK đê tạo

Kết quả đầu tiên khi tạo 1 Lớp trong Kotlin:

Tiến hành code cho TamGiac (bạn cứ làm theo, Tui sẽ giải thích kỹ các thành phần ở bài sau):

chi tiết lớp TamGiac:

[code language=”groovy”]

/**
* Created by cafe on 01/06/2017.
*/
class TamGiac {
var a:Double=0.0
var b:Double=0.0
var c:Double=0.0
constructor()
constructor(a:Double,b:Double,c:Double)
{
this.a=a
this.b=b
this.c=c
}
fun chuVi():Double
{
return a+b+c
}
fun dienTich():Double
{
var p=chuVi()/2
return Math.sqrt(p*(p-a)*(p-b)*(p-c))
}
}

[/code]

Tiếp tục tạo 1 file Kotlin app_test_tamgiac.kt để sử dụng TamGiac:

[code language=”groovy”]

/**
* Created by cafe on 01/06/2017.
*/
fun main(args: Array) {
var tg1=TamGiac(4.0,5.0,6.0)
println(“Thông tin tam giác 1:”)
println(“Chu vi=”+tg1.chuVi())
println(“Diện Tích=”+tg1.dienTich())

var tg2=TamGiac()
tg2.a=7.5
tg2.b=10.3
tg2.c=15.5
println(“Thông tin tam giác 2:”)
println(“Chu vi=”+tg2.chuVi())
println(“Diện Tích=”+tg2.dienTich())
}

[/code]

Kết quả khi chạy ta thấy:

Thông tin tam giác 1:
Chu vi=15.0
Diện Tích=9.921567416492215
Thông tin tam giác 2:
Chu vi=33.3
Diện Tích=33.354424275499014

Như vậy tới đây Tui đã trình bày xong một số khái niệm về OPP cũng như cách tạo một Lớp và sử dụng nó như thế nào trong Kotlin, các bạn chú ý học kỹ và hiểu được nó thông qua các ví dụ ở trên nhé. Các bài sau Tui sẽ trình bay chi tiết từng thành phần của Class trong Kotlin

Các bạn có thể tải source code bài này ở đây: http://www.mediafire.com/file/1ms2t5jdfjxo94k/HocOOPPhan1.rar

Hẹn gặp các bạn ở những bài tiếp theo

Chúc các bạn thành công!

Trần Duy Thanh (http://communityuni.com/)