Lập trình hướng đối tượng – Phần 2 – Tính chất kế thừa – PHP

Giới thiệu

Trong nội dung bài này, chúng ta cùng nhau tìm hiểu tính chất kế thừa trong tư duy Lập trình hướng đối tượng.

Chúng ta sẽ thử nghiệm tính chất này qua một ví dụ đơn giản về hình chữ nhật và hình vuông.

Nhắc lại đặc điểm của tính chất kế thừa như sau:

  • Đặc tính này cho phép một đối tượng có thể có sẵn các đặc tính mà đối tượng khác đã có thông qua kế thừa.
  • Điều này cho phép các đối tượng chia sẻ hay mở rộng các đặc tính sẵn có mà không phải tiến hành định nghĩa lại.

Xây dựng lớp đối tượng HinhChuNhat

Bước 1.

Chúng ta tạo một PHP Project trong Eclipse IDE và đặt tên là PHPOOPSecondProject.

Chúng ta tiếp tục tạo file index.php.

Bước 2.

Chúng ta tạo folder objectclass HinhChuNhat.php.

Bước 3.

Chúng ta định nghĩa 02 thuộc tính cơ bản của một hình chữ nhật:

Những kỹ thuật lập trình cần chú ý:

  • Như đã trình bày ở phần Giới thiệu về Tính chất kế thừa, một lớp đối tượng có thể được kế thừa và mở rộng những thuộc tính và phương thức nào đó của lớp cơ sở.
  • Trong ví dụ ở đây, chúng ta đều biết rằng mỗi hình vuông đều là một hình chữ nhật và đều có 02 thuộc tính là chiều dài và chiều rộng. Do vậy chúng ta định nghĩa 02 thuộc tính của class HinhChuNhat theo cách mà có thể được kế thừa.
  • Chúng ta sử dụng từ khóa protected được PHP cung cấp. Từ khóa này quy định một thuộc tính hoặc một phương thức là ẩn, cho phép kế thừa và chỉ được truy xuất bên trong một lớp và những lớp con của nó.

Bước 4.

Chúng ta định nghĩa constructor cho lớp đối tượng:

Bước 5.

Chúng ta định nghĩa các phương thức truy xuất và điều chỉnh dữ liệu, được gọi là các gettersetter:

Bước 6.

Chúng ta định nghĩa các phương thức tính chu vi, diện tích và đường chéo hình chữ nhật:

Những kỹ thuật lập trình cần chú ý:

Có lẽ cũng cần nhắc lại một chút về công thức tính đường chéo ở đây: (đường_chéo)^2 = (chiều_dài)^2 + (chiều_rộng)^2.

  • Kết quả của công thức tính đường chéo là một số thực có phần thập phân. Do vậy chúng ta sử dụng kiểu dữ liệu float do PHP cung cấp để đặc tả kết quả trả về này.

Xây dựng lớp đối tượng HinhVuong

Bước 1.

Chúng ta tạo class HinhVuong.php.

Những kỹ thuật lập trình cần chú ý:

  • Trong ví dụ ở đây, chúng ta sử dụng từ khóa extends do PHP cung cấp để đặc tả sự kế thừa.
  • Như đã mô tả ở trên về định nghĩa 02 thuộc tính chieuDaichieuRong. Chúng ta không cần định nghĩa lại 02 thuộc tính này trong class HinhVuong mà kế thừa từ HinhChuNhat.
  • Nếu phân tích theo một hướng khác, chúng ta có thể định nghĩa thuộc tính canh cho class HinhVuong. Như vậy thì nên thiết lập lại phạm vi là private cho 02 thuộc tính của class HinhChuNhat để không cho kế thừa.

Bước 2.

Chúng ta định nghĩa constructor cho lớp đối tượng:

Những kỹ thuật lập trình cần chú ý:

  • Trong constructor cho class HinhVuong, chúng ta có thể thực thi tác vụ khởi tạo giá trị mặc định nào đó cho riêng class HinhVuong.
  • Nếu chúng ta muốn gọi constructor của lớp cơ sở để thực thi, ví dụ ở đây là class HinhChuNhat, chúng ta sử dụng phương thức parent và truyền tham số tương ứng với constructor cho class HinhChuNhat.

Bước 3.

Chúng ta thực hiện kế thừa và điều chỉnh phương thức setter:

Những kỹ thuật lập trình cần chú ý:

  • Thuật ngữ để kế thừa, điều chỉnh và mở rộng một phương thức của lớp cơ sở được gọi là nạp chồng hàm (override).
  • Trong ví dụ ở đây, chúng ta cần điều chỉnh phương thức setter vì trong hình vuông thì chiều dài và chiều rộng là bằng nhau (nên được gọi chung là cạnh).
  • Chú ý rằng chúng ta sử dụng phương thức parent để gọi đến setter đã được định nghĩa ở lớp cơ sở.

Bước 4.

Chúng ta thực hiện kế thừa và điều chỉnh phương thức tinhDuongCheo():

Những kỹ thuật lập trình cần chú ý:

  • Chúng ta không cần điều chỉnh các phương thức về tính chu vi và diện tích vì thực ra công thức là như nhau. Do vậy trong class HinhVuong chúng ta không đặc tả lại mà kế thừa hoàn toàn từ class HinhChuNhat đối với 02 phương thức tinhChuVi()tinhDienTich().
  • Đối với tác vụ tính đường chéo, chúng ta có 03 lựa chọn. Lựa chọn thứ nhất. Tương tự như 02 phương thức tinhChuVi()tinhDienTich(), chúng ta không đặc tả lại mà kế thừa hoàn toàn từ class HinhChuNhat. Lựa chọn thứ hai. Chúng ta thực hiện kế thừa lại bằng cách gọi phương thức của class HinhChuNhat để thực thi: parent::tinhDuongCheo(). Lựa chọn thứ ba. Chúng ta thực thi theo công thức thu gọn dành riêng cho hình vuông: (đường_chéo) ^2 = 2 * (cạnh)^2.

Thử nghiệm chương trình

Bước 1.

Chúng ta thực hiện thử nghiệm tạo mới 01 hình chữ nhật, 01 hình vuông và tính chu vi, diện tích, đường chéo:

Bước 2.

Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Tổng kết

Trong bài này, chúng ta đã cùng nhau tìm hiểu tính chất kế thừa trong Lập trình hướng đối tượng.

Chúng ta đã cùng nhau thực hiện một ví dụ nhỏ về tính chất kế thừa với ngôn ngữ PHP.

Trong các bài tiếp theo, chúng ta sẽ tiếp tục tìm hiểu những kiến thức khác xung quanh lập trình hướng đối tượng.

Lập trình hướng đối tượng – Phần 2 – Tính chất kế thừa – Python

Giới thiệu

Trong nội dung bài này, chúng ta cùng nhau tìm hiểu tính chất kế thừa trong tư duy Lập trình hướng đối tượng.

Nhắc lại đặc điểm của tính chất kế thừa như sau:

  • Đặc tính này cho phép một đối tượng có thể có sẵn các đặc tính mà đối tượng khác đã có thông qua kế thừa.
  • Điều này cho phép các đối tượng chia sẻ hay mở rộng các đặc tính sẵn có mà không phải tiến hành định nghĩa lại.

Xây dựng lớp đối tượng HinhChuNhat

Bước 1.

Chúng ta tạo một PyDev Project trong Eclipse IDE và đặt tên là PythonOOPSecondProject.

Chúng ta tiếp tục tạo package mainmodule Main.py cùng phương thức main() mặc định.

Bước 2.

Chúng ta tạo package objectmodule HinhChuNhat.py.

Bước 3.

Chúng ta định nghĩa 02 thuộc tính cơ bản của một hình chữ nhật:

Những kỹ thuật lập trình cần chú ý:

  • Chúng ta áp dụng cách tiếp cận định nghĩa hình thức properties bằng cách sử dụng decorator @property.
  • Khác với nhóm ngôn ngữ Java / Csharp, Python không cung cấp một cách tường minh để định nghĩa các thuộc tính của một lớp đối tượng và do vậy cũng không thể định nghĩa tường minh việc kế thừa các thuộc tính.
  • Chúng ta sẽ hiện thực việc kế thừa các thuộc tính thông qua các properties trên.

Bước 4.

Chúng ta định nghĩa các constructor cho lớp đối tượng:

Bước 5.

Chúng ta định nghĩa các phương thức tính chu vi, diện tích và đường chéo hình chữ nhật:

Những kỹ thuật lập trình cần chú ý:

  • Có lẽ cũng cần nhắc lại một chút về công thức tính đường chéo ở đây: (đường_chéo)^2 = (chiều_dài)^2 + (chiều_rộng)^2.

Xây dựng lớp đối tượng HinhVuong

Bước 1.

Chúng ta tạo module HinhVuong.py.

Những kỹ thuật lập trình cần chú ý:

  • Trong ví dụ ở đây, chúng ta sử dụng cách thức của Python để đặc tả sự kế thừa: xác định tên của lớp cơ sở là class HinhChuNhat của module HinhChuNhat.py bên trong cặp dấu “()” bên cạnh tên của lớp dẫn xuất là class HinhVuong của module HinhVuong.py.
  • Chú ý rằng trong mỗi module abc.py, chúng ta có thể định nghĩa nhiều class khác nhau. Chúng ta được khuyến khích là mỗi module abc.py chỉ nên định nghĩa một class để dễ quản lý, và tốt nhất là trùng tên với module.

Bước 2.

Chúng ta định nghĩa các constructor cho lớp đối tượng:

Những kỹ thuật lập trình cần chú ý:

  • Trong constructor cho class HinhVuong, chúng ta có thể thực thi các tác vụ khởi tạo giá trị mặc định nào đó cho riêng class HinhVuong.
  • Nếu chúng ta muốn gọi constructor của lớp cơ sở để thực thi, ví dụ ở đây là class HinhChuNhat, chúng ta sử dụng phương thức super() và truyền tham số tương ứng với constructor cho class HinhChuNhat.

Bước 3.

Chúng ta thực hiện kế thừa và điều chỉnh phương thức setter:

Những kỹ thuật lập trình cần chú ý:

  • Trong ví dụ ở đây, chúng ta cần điều chỉnh phương thức setter vì trong hình vuông thì chiều dài và chiều rộng là bằng nhau (nên được gọi chung là cạnh).
  • Cú pháp để thực hiện kế thừa, mở rộng và điều chỉnh properties được thể hiện rõ nét trong ví dụ này. Chúng ta chỉ cần áp dụng tương tự cho những bài tập khác.
  • Chú ý rằng chúng ta sử dụng tên của lớp cơ sở, ở đây là HinhChuNhat, để gọi đến properties đã được định nghĩa ở lớp cơ sở. Sau đó chúng ta gọi đến phương thức fset() để thực hiện điều chỉnh thông tin.

Bước 4.

Chúng ta thực hiện kế thừa và điều chỉnh phương thức tinhDuongCheo():

Những kỹ thuật lập trình cần chú ý:

  • Chúng ta không cần điều chỉnh các phương thức về tính chu vi và diện tích vì thực ra công thức là như nhau. Do vậy trong class HinhVuong chúng ta không đặc tả lại mà kế thừa hoàn toàn từ class HinhChuNhat đối với 02 phương thức tinhChuVi()tinhDienTich().
  • Đối với tác vụ tính đường chéo, chúng ta có 03 lựa chọn. Lựa chọn thứ nhất. Tương tự như 02 phương thức tinhChuVi()tinhDienTich(), chúng ta không đặc tả lại mà kế thừa hoàn toàn từ class HinhChuNhat. Lựa chọn thứ hai. Chúng ta thực hiện kế thừa lại bằng cách gọi phương thức của class HinhChuNhat để thực thi: super().tinhDuongCheo(). Lựa chọn thứ ba. Chúng ta thực thi theo công thức thu gọn dành riêng cho hình vuông: (đường_chéo) ^2 = 2 * (cạnh)^2.

Thử nghiệm chương trình

Bước 1.

Chúng ta thực hiện thử nghiệm tạo mới 01 hình chữ nhật, 02 hình vuông và tính chu vi, diện tích, đường chéo:

Bước 2.

Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Tổng kết

Trong bài này, chúng ta đã cùng nhau tìm hiểu tính chất kế thừa trong Lập trình hướng đối tượng.

Chúng ta đã cùng nhau thực hiện một ví dụ nhỏ về tính chất kế thừa với ngôn ngữ Python.

Trong các bài tiếp theo, chúng ta sẽ tiếp tục tìm hiểu những kiến thức khác xung quanh lập trình hướng đối tượng.

Lập trình hướng đối tượng – Phần 2 – Tính chất kế thừa – Csharp

Giới thiệu

Trong nội dung bài này, chúng ta cùng nhau tìm hiểu tính chất kế thừa trong tư duy Lập trình hướng đối tượng.

Chúng ta sẽ thử nghiệm tính chất này qua một ví dụ đơn giản về hình chữ nhật và hình vuông.

Nhắc lại đặc điểm của tính chất kế thừa như sau:

  • Đặc tính này cho phép một đối tượng có thể có sẵn các đặc tính mà đối tượng khác đã có thông qua kế thừa.
  • Điều này cho phép các đối tượng chia sẻ hay mở rộng các đặc tính sẵn có mà không phải tiến hành định nghĩa lại.

Xây dựng lớp đối tượng HinhChuNhat

Bước 1.

Chúng ta tạo một Console Project trong MonoDevelop và đặt tên là CsharpOOPSecondProject.

Mặc định thì class Program.cs trong namespace CsharpOOPSecondProject với phương thức Main() được tạo ra.

Bước 2.

Chúng ta tạo class HinhChuNhat.cs và điều chỉnh namespace Object.

Bước 3.

Chúng ta định nghĩa 02 thuộc tính cơ bản của một hình chữ nhật:

Những kỹ thuật lập trình cần chú ý:

  • Như đã trình bày ở phần Giới thiệu về Tính chất kế thừa, một lớp đối tượng có thể được kế thừa và mở rộng những thuộc tính và phương thức nào đó của lớp cơ sở.
  • Trong ví dụ ở đây, chúng ta đều biết rằng mỗi hình vuông đều là một hình chữ nhật và đều có 02 thuộc tính là chiều dài và chiều rộng. Do vậy chúng ta định nghĩa 02 thuộc tính của class HinhChuNhat theo cách mà có thể được kế thừa.
  • Chúng ta sử dụng từ khóa protected được Csharp cung cấp. Từ khóa này quy định một thuộc tính hoặc một phương thức là ẩn, cho phép kế thừa và chỉ được truy xuất bên trong một lớp và những lớp con của nó.

Bước 4.

Chúng ta định nghĩa các constructor cho lớp đối tượng:

Bước 5.

Chúng ta định nghĩa các phương thức đặc biệt truy xuất và điều chỉnh dữ liệu, được gọi là các properties với gettersetter:

Những kỹ thuật lập trình cần chú ý:

  • Chúng ta biết rằng mỗi hình vuông là một hình chữ nhật đặc biệt trong đó chiều dài và chiều rộng là bằng nhau (nên được gọi chung là cạnh). Do vậy trong ví dụ ở đây, chúng ta sẽ cần kế thừa, mở rộng và điều chỉnh setter của properties ChieuDaiChieuRong.
  • Trước tiên, đối với phương thức ở lớp cơ sở mà dự kiến sẽ được kế thừa, mở rộng và điều chỉnh, chúng ta sử dụng từ khóa virtual do Csharp cung cấp.

Bước 6.

Chúng ta định nghĩa các phương thức tính chu vi, diện tích và đường chéo hình chữ nhật:

Những kỹ thuật lập trình cần chú ý:

  • Có lẽ cũng cần nhắc lại một chút về công thức tính đường chéo ở đây: (đường_chéo)^2 = (chiều_dài)^2 + (chiều_rộng)^2.
  • Kết quả của công thức tính đường chéo là một số thực có phần thập phân. Do vậy chúng ta sử dụng kiểu dữ liệu float hoặc double do Csharp cung cấp để đặc tả kết quả trả về này.
  • Tương tự như setter của properties ChieuDaiChieuRong, chúng ta có thể có nhu cầu kế thừa, mở rộng và điều chỉnh phương thức TinhDuongCheo() trong class HinhVuong. Do vậy chúng ta sử dụng từ khóa virtual ở đây.

Xây dựng lớp đối tượng HinhVuong

Bước 1.

Chúng ta tạo class HinhVuong.cs.

Những kỹ thuật lập trình cần chú ý:

  • Trong ví dụ ở đây, chúng ta sử dụng ký hiệu “:” phân tách giữa hai lớp để đặc tả sự kế thừa.
  • Như đã mô tả ở trên về định nghĩa 02 thuộc tính chieuDaichieuRong. Chúng ta không cần định nghĩa lại 02 thuộc tính này trong class HinhVuong mà kế thừa từ HinhChuNhat.
  • Nếu phân tích theo một hướng khác, chúng ta có thể định nghĩa thuộc tính canh cho class HinhVuong. Như vậy thì nên thiết lập lại phạm vi là private cho 02 thuộc tính của class HinhChuNhat để không cho kế thừa.

Bước 2.

Chúng ta định nghĩa các constructor cho lớp đối tượng:

Những kỹ thuật lập trình cần chú ý:

  • Chúng ta định nghĩa 02 constructor cho class HinhVuong tương ứng với 02 constructor cho class HinhChuNhat.
  • Trong từng constructor cho class HinhVuong, chúng ta có thể thực thi các tác vụ khởi tạo giá trị mặc định nào đó cho riêng class HinhVuong.
  • Nếu chúng ta muốn gọi constructor của lớp cơ sở để thực thi, ví dụ ở đây là class HinhChuNhat, chúng ta sử dụng phương thức base() và truyền tham số tương ứng với từng constructor cho class HinhChuNhat.

Bước 3.

Chúng ta thực hiện kế thừa và điều chỉnh phương thức setter:

Những kỹ thuật lập trình cần chú ý:

  • Thuật ngữ để kế thừa, điều chỉnh và mở rộng một phương thức của lớp cơ sở được gọi là nạp chồng hàm (override). Csharp cung cấp một kiểu từ khóa override để đặc tả một phương thức như vậy trong lớp dẫn xuất.
  • Trong ví dụ ở đây, chúng ta cần điều chỉnh phương thức setter vì trong hình vuông thì chiều dài và chiều rộng là bằng nhau (nên được gọi chung là cạnh).
  • Cú pháp để thực hiện kế thừa, mở rộng và điều chỉnh properties được thể hiện rõ nét trong ví dụ này. Chúng ta chỉ cần áp dụng tương tự cho những bài tập khác.
  • Chú ý rằng chúng ta sử dụng phương thức base để gọi đến properties đã được định nghĩa ở lớp dẫn xuất.

Bước 4.

Chúng ta thực hiện kế thừa và điều chỉnh phương thức TinhDuongCheo():

Những kỹ thuật lập trình cần chú ý:

  • Chúng ta không cần điều chỉnh các phương thức về tính chu vi và diện tích vì thực ra công thức là như nhau. Do vậy trong class HinhVuong chúng ta không đặc tả lại mà kế thừa hoàn toàn từ class HinhChuNhat đối với 02 phương thức TinhChuVi()TinhDienTich().
  • Đối với tác vụ tính đường chéo, chúng ta có 03 lựa chọn. Lựa chọn thứ nhất. Tương tự như 02 phương thức TinhChuVi()TinhDienTich(), chúng ta không đặc tả lại mà kế thừa hoàn toàn từ class HinhChuNhat. Lựa chọn thứ hai. Chúng ta thực hiện kế thừa lại với từ khóa override nhưng sẽ gọi phương thức của class HinhChuNhat để thực thi: base.TinhDuongCheo(). Lựa chọn thứ ba. Chúng ta thực thi theo công thức thu gọn dành riêng cho hình vuông: (đường_chéo) ^2 = 2 * (cạnh)^2.

Thử nghiệm chương trình

Bước 1.

Chúng ta thực hiện thử nghiệm tạo mới 01 hình chữ nhật, 02 hình vuông và tính chu vi, diện tích, đường chéo:

Những kỹ thuật lập trình cần chú ý:

  • Đối với việc khởi tạo một đối tượng hình vuông. Chúng ta có 02 sự lựa chọn: (i) HinhChuNhat hinhVuong = new HinhVuong(); (ii) HinhVuong hinhVuong = new HinhVuong(). Thực ra cả 02 sự lựa chọn này là như nhau vì class HinhVuong là lớp dẫn xuất của lớp cơ sở class HinhChuNhat.
  • Chúng ta được khuyến khích là áp dụng sự lựa chọn thứ nhất như trong ví dụ ở đây. Lý do chính là để hiểu rõ hơn về tính chất trừu tượng và đa hình của Lập trình hướng đối tượng mà sẽ được trao đổi kỹ hơn trong các bài tiếp theo.

Bước 2.

Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Tổng kết

Trong bài này, chúng ta đã cùng nhau tìm hiểu tính chất kế thừa trong Lập trình hướng đối tượng.

Chúng ta đã cùng nhau thực hiện một ví dụ nhỏ về tính chất kế thừa với ngôn ngữ Csharp.

Trong các bài tiếp theo, chúng ta sẽ tiếp tục tìm hiểu những kiến thức khác xung quanh lập trình hướng đối tượng.

Lập trình hướng đối tượng – Phần 2 – Tính chất kế thừa – Java

Giới thiệu

Trong nội dung bài này, chúng ta cùng nhau tìm hiểu tính chất kế thừa trong tư duy Lập trình hướng đối tượng.

Chúng ta sẽ thử nghiệm tính chất này qua một ví dụ đơn giản về hình chữ nhật và hình vuông.

Nhắc lại đặc điểm của tính chất kế thừa như sau:

  • Đặc tính này cho phép một đối tượng có thể có sẵn các đặc tính mà đối tượng khác đã có thông qua kế thừa.
  • Điều này cho phép các đối tượng chia sẻ hay mở rộng các đặc tính sẵn có mà không phải tiến hành định nghĩa lại.

Xây dựng lớp đối tượng HinhChuNhat

Bước 1.

Chúng ta tạo một Java Project trong Eclipse IDE và đặt tên là JavaOOPSecondProject.

Chúng ta tiếp tục tạo package mainclass Main.java cùng phương thức main() mặc định.

Bước 2.

Chúng ta tạo package objectclass HinhChuNhat.java.

Bước 3.

Chúng ta định nghĩa 02 thuộc tính cơ bản của một hình chữ nhật:

Những kỹ thuật lập trình cần chú ý:

  • Như đã trình bày ở phần Giới thiệu về Tính chất kế thừa, một lớp đối tượng có thể được kế thừa và mở rộng những thuộc tính và phương thức nào đó của lớp cơ sở.
  • Trong ví dụ ở đây, chúng ta đều biết rằng mỗi hình vuông đều là một hình chữ nhật và đều có 02 thuộc tính là chiều dài và chiều rộng. Do vậy chúng ta định nghĩa 02 thuộc tính của class HinhChuNhat theo cách mà có thể được kế thừa.
  • Chúng ta sử dụng từ khóa protected được Java cung cấp. Thuộc tính này quy định một thuộc tính hoặc một phương thức là ẩn, cho phép kế thừa và chỉ được truy xuất bên trong một lớp và những lớp con của nó.

Bước 4.

Chúng ta định nghĩa các constructor cho lớp đối tượng:

Bước 5.

Chúng ta định nghĩa các phương thức truy xuất và điều chỉnh dữ liệu, được gọi là các gettersetter:

Bước 6.

Chúng ta định nghĩa các phương thức tính chu vi, diện tích và đường chéo hình chữ nhật:

Những kỹ thuật lập trình cần chú ý:

  • Có lẽ cũng cần nhắc lại một chút về công thức tính đường chéo ở đây: (đường_chéo)^2 = (chiều_dài)^2 + (chiều_rộng)^2.
  • Kết quả của công thức tính đường chéo là một số thực có phần thập phân. Do vậy chúng ta sử dụng kiểu dữ liệu float hoặc double do Java cung cấp để đặc tả kết quả trả về này.

Xây dựng lớp đối tượng HinhVuong

Bước 1.

Chúng ta tạo class HinhVuong.java.

Những kỹ thuật lập trình cần chú ý:

  • Trong ví dụ ở đây, chúng ta sử dụng từ khóa extends do Java cung cấp để đặc tả sự kế thừa.
  • Như đã mô tả ở trên về định nghĩa 02 thuộc tính chieuDaichieuRong. Chúng ta không cần định nghĩa lại 02 thuộc tính này trong class HinhVuong mà kế thừa từ HinhChuNhat.
  • Nếu phân tích theo một hướng khác, chúng ta có thể định nghĩa thuộc tính canh cho class HinhVuong. Như vậy thì nên thiết lập lại phạm vi là private cho 02 thuộc tính của class HinhChuNhat để không cho kế thừa.

Bước 2.

Chúng ta định nghĩa các constructor cho lớp đối tượng:

Những kỹ thuật lập trình cần chú ý:

  • Chúng ta định nghĩa 02 constructor cho class HinhVuong tương ứng với 02 constructor cho class HinhChuNhat.
  • Trong từng constructor cho class HinhVuong, chúng ta có thể thực thi các tác vụ khởi tạo giá trị mặc định nào đó cho riêng class HinhVuong.
  • Nếu chúng ta muốn gọi constructor của lớp cơ sở để thực thi, ví dụ ở đây là class HinhChuNhat, chúng ta sử dụng phương thức super() và truyền tham số tương ứng với từng constructor cho class HinhChuNhat.

Bước 3.

Chúng ta thực hiện kế thừa và điều chỉnh phương thức setter:

Những kỹ thuật lập trình cần chú ý:

  • Thuật ngữ để kế thừa, điều chỉnh và mở rộng một phương thức của lớp cơ sở được gọi là nạp chồng hàm (override). Java cung cấp một kiểu chú thích (annotation) là @Override để đặc tả một phương thức như vậy trong lớp dẫn xuất.
  • Trong ví dụ ở đây, chúng ta cần điều chỉnh phương thức setter vì trong hình vuông thì chiều dài và chiều rộng là bằng nhau (nên được gọi chung là cạnh).

Bước 4.

Chúng ta thực hiện kế thừa và điều chỉnh phương thức tinhDuongCheo():

Những kỹ thuật lập trình cần chú ý:

  • Chúng ta không cần điều chỉnh các phương thức về tính chu vi và diện tích vì thực ra công thức là như nhau. Do vậy trong class HinhVuong chúng ta không đặc tả lại mà kế thừa hoàn toàn từ class HinhChuNhat đối với 02 phương thức tinhChuVi()tinhDienTich().
  • Đối với tác vụ tính đường chéo, chúng ta có 03 lựa chọn. Lựa chọn thứ nhất. Tương tự như 02 phương thức tinhChuVi()tinhDienTich(), chúng ta không đặc tả lại mà kế thừa hoàn toàn từ class HinhChuNhat. Lựa chọn thứ hai. Chúng ta thực hiện kế thừa lại bằng annotation @Override nhưng sẽ gọi phương thức của class HinhChuNhat để thực thi: super.tinhDuongCheo(). Lựa chọn thứ ba. Chúng ta thực thi theo công thức thu gọn dành riêng cho hình vuông: (đường_chéo) ^2 = 2 * (cạnh)^2.

Thử nghiệm chương trình

Bước 1.

Chúng ta thực hiện thử nghiệm tạo mới 01 hình chữ nhật, 02 hình vuông và tính chu vi, diện tích, đường chéo:

Những kỹ thuật lập trình cần chú ý:

  • Đối với việc khởi tạo một đối tượng hình vuông. Chúng ta có 02 sự lựa chọn: (i) HinhChuNhat hinhVuong = new HinhVuong(); (ii) HinhVuong hinhVuong = new HinhVuong(). Thực ra cả 02 sự lựa chọn này là như nhau vì class HinhVuong là lớp dẫn xuất của lớp cơ sở class HinhChuNhat.
  • Chúng ta được khuyến khích là áp dụng sự lựa chọn thứ nhất như trong ví dụ ở đây. Lý do chính là để hiểu rõ hơn về tính chất trừu tượng và đa hình của Lập trình hướng đối tượng mà sẽ được trao đổi kỹ hơn trong các bài tiếp theo.

Bước 2.

Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Tổng kết

Trong bài này, chúng ta đã cùng nhau tìm hiểu tính chất kế thừa trong Lập trình hướng đối tượng.

Chúng ta đã cùng nhau thực hiện một ví dụ nhỏ về tính chất kế thừa với ngôn ngữ Java.

Trong các bài tiếp theo, chúng ta sẽ tiếp tục tìm hiểu những kiến thức khác xung quanh lập trình hướng đối tượng.

Lập trình hướng đối tượng – Phần 1 – Cơ bản về lớp đối tượng – PHP

Giới thiệu

Lập trình hướng đối tượng (tiếng Anh: Object-oriented programming, viết tắt: OOP) là một mô hình kiến trúc lập trình dựa trên khái niệm “công nghệ đối tượng”, mà trong đó, đối tượng chứa đựng các dữ liệu: (i) thuộc tính của đối tượng; (ii) phương thức để thực thi các hành động của đối tượng.

OOP được xem là giúp tăng năng suất, đơn giản hóa độ phức tạp khi bảo trì cũng như mở rộng phần mềm bằng cách cho phép lập trình viên tập trung vào các đối tượng phần mềm ở bậc cao hơn.

Một số khái niệm cơ bản

Khái niệm đầu tiên là “đối tượng”, được hiểu như là 1 thực thể: người, vật hoặc 1 bảng dữ liệu, . . .

Một đối tượng bao gồm 2 thông tin chính:

  • Thuộc tính. Là những thông tin, đặc điểm của đối tượng. Ví dụ: một hình chữ nhật sẽ có chiều dài, chiều rộng, . . .
  • Phương thức. Là những thao tác, hành động mà đối tượng đó có thể thực hiện. Ví dụ: một hình chữ nhật sẽ có thao tác tính chu vi, diện tích, . . .

Khái niệm thứ hai là “lớp”, được hiểu như là một khuôn mẫu mà từng đối tượng là một thể hiện cụ thể dựa trên khuôn mẫu đó.

Ví dụ một lớp hình chữ nhật sẽ định nghĩa: (i) các thuộc tính chiều dài / chiều rộng; (ii) các phương thức tính chu vi, tính diện tích. Còn từng đối tượng hình chữ nhật sẽ có số đo cụ thể cho từng thuộc tính cũng như chu vi và diện tích riêng.

Các tính chất của lập trình hướng đối tượng

Tính đóng gói (encapsulation) và che giấu thông tin (information hiding):

  • Tính chất này không cho phép tác nhân bên ngoài thay đổi trạng thái nội tại của một đối tượng.
  • Chỉ có các phương thức nội tại của đối tượng cho phép thay đổi trạng thái của nó.
  • Đây là tính chất đảm bảo sự toàn vẹn của đối tượng.

Tính trừu tượng (abstraction):

  • Là phương pháp trừu tượng hóa định nghĩa lên những hành động, tính chất của loại đối tượng nào đó cần phải có.
  • Mỗi đối tượng có thể hoàn tất các công việc một cách nội bộ, báo cáo, thay đổi trạng thái của nó và liên lạc với các đối tượng khác mà không cần cho biết làm cách nào đối tượng tiến hành được các thao tác.
  • Tính chất này thường được gọi là sự trừu tượng của dữ liệu.

Tính kế thừa (inheritance):

  • Đặc tính này cho phép một đối tượng có thể có sẵn các đặc tính mà đối tượng khác đã có thông qua kế thừa.
  • Điều này cho phép các đối tượng chia sẻ hay mở rộng các đặc tính sẵn có mà không phải tiến hành định nghĩa lại.

Tính đa hình (polymorphism):

  • Thể hiện thông qua việc gửi các thông điệp (message).
  • Việc gửi các thông điệp này có thể so sánh như việc gọi các phương thức bên trong của một đối tượng.
  • Các phương thức dùng trả lời cho một thông điệp sẽ tùy theo đối tượng mà thông điệp đó được gửi tới sẽ có phản ứng khác nhau.

Xây dựng lớp đối tượng độc lập

Trong nội dung bài này, chúng ta cùng tìm hiểu cách xây dựng một lớp đối tượng độc lập cùng với tính chất đóng gói (encapsulation) bằng ngôn ngữ PHP.

Bước 1.

Chúng ta tạo một PHP Project trong Eclipse IDE và đặt tên là PHPOOPFirstProject.

Chúng ta tiếp tục tạo file index.php.

Bước 2.

Chúng ta tạo folder objectclass HinhChuNhat.php.

Những kỹ thuật lập trình cần chú ý:

  • Như đã trình bày ở phần Giới thiệu về Tính đóng gói (encapsulation) và che giấu thông tin (information hiding). Mỗi folder có thể được xem như là một hình thức để gom nhóm các lớp đối tượng có cùng chung những đặc điểm nào đó.
  • PHP là một ngôn ngữ lập trình rất linh động và hỗ trợ nhiều phong cách lập trình khác nhau. Chúng ta có thể tự do lựa chọn việc có đặt một class vào bên trong một folder hay không. Tuy nhiên, để dễ quản lý một chương trình phần mềm lớn, chúng ta nên phân hoạch các class vào trong những folder theo tư duy hướng đối tượng.
  • Trong ví dụ hiện tại, chúng ta có thể đặt tên folderobject (nghĩa là đối tượng nói chung) hoặc shape (nghĩa là hình vẽ nói chung).

Bước 3.

Chúng ta định nghĩa 02 thuộc tính cơ bản của một hình chữ nhật:

Những kỹ thuật lập trình cần chú ý:

  • Như đã trình bày ở phần Giới thiệu về đặc trưng của một lớp đối tượng. Các thuộc tính nội tại của một đối tượng thì chỉ có thể được trông thấy và điều chỉnh bởi các phương thức nội tại của chính đối tượng đó.
  • Chúng ta sử dụng từ khóa private được PHP cung cấp. Thuộc tính này quy định một thuộc tính hoặc một phương thức là ẩn bên trong một lớp.

Bước 4.

Chúng ta định nghĩa constructor cho lớp đối tượng:

Những kỹ thuật lập trình cần chú ý:

  • Constructor là một dạng đặc biệt của phương thức, được sử dụng để khởi tạo các đối tượng.
  • Constructor được gọi tại thời điểm tạo đối tượng. Nó khởi tạo các giá trị để cung cấp dữ liệu cho các đối tượng, đó là lý do tại sao nó được gọi là constructor.
  • Khác với nhóm ngôn ngữ Java / C#, PHP chỉ cung cấp một phương thức constructor duy nhất là __construct(). Chúng ta sẽ chủ động quyết định xem có để tham số cho constructor hay không. Ngoài ra chúng ta chỉ có thể tạo duy nhất một dạng constructor có hoặc không có tham số. Đối với những phương thức khác, chúng ta sẽ tiếp tục tìm hiểu nội dung này trong những bài tiếp theo về lập trình hướng đối tượng.
  • Từ khóa this giúp chúng ta liên hệ đến thuộc tính hoặc phương thức nội tại của lớp đối tượng. Chúng ta sử dụng từ khóa này để phân biệt khi muốn định nghĩa các biến có cùng tên với các thuộc tính hoặc phương thức nội tại của lớp.

Bước 5.

Chúng ta định nghĩa các phương thức truy xuất và điều chỉnh dữ liệu, được gọi là các gettersetter:

Những kỹ thuật lập trình cần chú ý:

  • Đây chính là những phương thức nội tại được dành riêng để truy xuất và điều chỉnh thông tin cho các thuộc tính nội tại.
  • Theo quy tắc chung, tên của các phương thức này nên để getset đứng trước tên của thuộc tính.
  • Mỗi thuộc tính nên được theo kèm bởi một cặp get / set.

Bước 6.

Chúng ta định nghĩa các phương thức tính chu vi và diện tích hình chữ nhật:

Bước 7.

Chúng ta thực hiện thử nghiệm tạo mới hình chữ nhật và tính chu vi, diện tích:

Những kỹ thuật lập trình cần chú ý:

  • Để truy xuất đến một file php ở một folder khác, chúng ta sử dụng từ khóa require_once. Ví dụ ở đây là require_once ‘object/HinhChuNhat.php’. Khác với nhóm ngôn ngữ Java / C# / Python, cách thức thực hiện của PHP là sẽ sao chép toàn bộ mã nguồn của file vào đúng vị trí sử dụng require_once. Trên thực tế chúng ta có thể sử dụng từ khóa require. Nhưng như vậy có thể xảy ra trường hợp một file được truy xuất nhiều lần và có thể gây ra những hệ quả không mong muốn. Do vậy khuyến khích nên dùng require_once để chỉ truy xuất một lần duy nhất.
  • Chúng ta khởi tạo một đối tượng thực bằng cách gọi constructor của lớp đối tượng với toán tử new. Với constructor được gọi thì thuộc tính nội tại sẽ được khởi tạo với giá trị mặc định của nó.

Bước 8.

Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Tổng kết

Trong bài này, chúng ta đã cùng nhau tìm hiểu những kiến thức cơ bản về lớp đối tượng cũng như những tính chất về lập trình hướng đối tượng.

Chúng ta đã cùng nhau thực hiện một ví dụ nhỏ về lớp đối tượng với ngôn ngữ PHP.

Trong các bài tiếp theo, chúng ta sẽ tiếp tục tìm hiểu những kiến thức khác xung quanh lập trình hướng đối tượng.

Lập trình hướng đối tượng – Phần 1 – Cơ bản về lớp đối tượng – Python

Giới thiệu

Lập trình hướng đối tượng (tiếng Anh: Object-oriented programming, viết tắt: OOP) là một mô hình kiến trúc lập trình dựa trên khái niệm “công nghệ đối tượng”, mà trong đó, đối tượng chứa đựng các dữ liệu: (i) thuộc tính của đối tượng; (ii) phương thức để thực thi các hành động của đối tượng.

OOP được xem là giúp tăng năng suất, đơn giản hóa độ phức tạp khi bảo trì cũng như mở rộng phần mềm bằng cách cho phép lập trình viên tập trung vào các đối tượng phần mềm ở bậc cao hơn.

Một số khái niệm cơ bản

Khái niệm đầu tiên là “đối tượng”, được hiểu như là 1 thực thể: người, vật hoặc 1 bảng dữ liệu, . . .

Một đối tượng bao gồm 2 thông tin chính:

  • Thuộc tính. Là những thông tin, đặc điểm của đối tượng. Ví dụ: một hình chữ nhật sẽ có chiều dài, chiều rộng, . . .
  • Phương thức. Là những thao tác, hành động mà đối tượng đó có thể thực hiện. Ví dụ: một hình chữ nhật sẽ có thao tác tính chu vi, diện tích, . . .

Khái niệm thứ hai là “lớp”, được hiểu như là một khuôn mẫu mà từng đối tượng là một thể hiện cụ thể dựa trên khuôn mẫu đó.

Ví dụ một lớp hình chữ nhật sẽ định nghĩa: (i) các thuộc tính chiều dài / chiều rộng; (ii) các phương thức tính chu vi, tính diện tích. Còn từng đối tượng hình chữ nhật sẽ có số đo cụ thể cho từng thuộc tính cũng như chu vi và diện tích riêng.

Các tính chất của lập trình hướng đối tượng

Tính đóng gói (encapsulation) và che giấu thông tin (information hiding):

  • Tính chất này không cho phép tác nhân bên ngoài thay đổi trạng thái nội tại của một đối tượng.
  • Chỉ có các phương thức nội tại của đối tượng cho phép thay đổi trạng thái của nó.
  • Đây là tính chất đảm bảo sự toàn vẹn của đối tượng.

Tính trừu tượng (abstraction):

  • Là phương pháp trừu tượng hóa định nghĩa lên những hành động, tính chất của loại đối tượng nào đó cần phải có.
  • Mỗi đối tượng có thể hoàn tất các công việc một cách nội bộ, báo cáo, thay đổi trạng thái của nó và liên lạc với các đối tượng khác mà không cần cho biết làm cách nào đối tượng tiến hành được các thao tác.
  • Tính chất này thường được gọi là sự trừu tượng của dữ liệu.

Tính kế thừa (inheritance):

  • Đặc tính này cho phép một đối tượng có thể có sẵn các đặc tính mà đối tượng khác đã có thông qua kế thừa.
  • Điều này cho phép các đối tượng chia sẻ hay mở rộng các đặc tính sẵn có mà không phải tiến hành định nghĩa lại.

Tính đa hình (polymorphism):

  • Thể hiện thông qua việc gửi các thông điệp (message).
  • Việc gửi các thông điệp này có thể so sánh như việc gọi các phương thức bên trong của một đối tượng.
  • Các phương thức dùng trả lời cho một thông điệp sẽ tùy theo đối tượng mà thông điệp đó được gửi tới sẽ có phản ứng khác nhau.

Xây dựng lớp đối tượng độc lập

Trong nội dung bài này, chúng ta cùng tìm hiểu cách xây dựng một lớp đối tượng độc lập cùng với tính chất đóng gói (encapsulation) bằng ngôn ngữ Python.

Bước 1.

Chúng ta tạo một PyDev Project trong Eclipse IDE và đặt tên là PythonOOPFirstProject.

Chúng ta tiếp tục tạo package mainmodule Main.py cùng phương thức main() mặc định.

Bước 2.

Chúng ta tạo package objectmodule HinhChuNhat.py.

Những kỹ thuật lập trình cần chú ý:

  • Như đã trình bày ở phần Giới thiệu về Tính đóng gói (encapsulation) và che giấu thông tin (information hiding). Mỗi package có thể được xem như là một hình thức để gom nhóm các lớp đối tượng có cùng chung những đặc điểm nào đó.
  • Python là một ngôn ngữ lập trình rất linh động và hỗ trợ nhiều phong cách lập trình khác nhau. Chúng ta có thể tự do lựa chọn việc có đặt một module vào bên trong một package hay không. Tuy nhiên, để dễ quản lý một chương trình phần mềm lớn, chúng ta nên phân hoạch các module vào trong những package theo tư duy hướng đối tượng.
  • Trong ví dụ hiện tại, chúng ta có thể đặt tên packageobject (nghĩa là đối tượng nói chung) hoặc shape (nghĩa là hình vẽ nói chung).

Bước 3.

Khác với nhóm ngôn ngữ Java / Csharp, Python không cung cấp một cách tường minh để định nghĩa các thuộc tính của một lớp đối tượng. Về cơ bản, mọi thuộc tính hay phương thức trong một module của Python đều là public và được truy xuất tự do từ các module khác. Điều này có vẻ không thực sự phù hợp theo tư duy lập trình hướng đối tượng.

Để phù hợp Tính đóng gói (encapsulation) và che giấu thông tin (information hiding) trong Lập trình hướng đối tượng, Python cung cấp 02 cách tiếp cận để định nghĩa các phương thức đặc biệt truy xuất và điều chỉnh dữ liệu, hay còn được gọi là các gettersetter.

Cách tiếp cận thứ nhất:

  • Định nghĩa cặp phương thức get / set để truy xuất và điều chỉnh thông tin cho thuộc tính tương ứng.
  • Xác lập tính chất ẩn của cặp phương thức này bằng cách thêm “__” vào phía trước tên phương thức. Thực ra chúng ta không bắt buộc phải thực hiện bước này. Chúng ta có thể sử dụng hai phương thức này ở các module khác. Nhưng chúng ta sẽ thấy rằng có đến 02 cách truy xuất và điều chỉnh dữ liệu: (i) thông qua một hình thức được gọi là properties; (ii) thông qua hai phương thức này. Và như vậy sẽ không phù hợp với triết lý của Python là chỉ nên có một cách thực hiện một tác vụ.
  • Định nghĩa hình thức properties bằng cách sử dụng phương thức đặc biệt là property(). Phương thức này có 04 tham số lần lượt là các phương thức được định nghĩa với ý nghĩa: (i) get() để truy xuất thuộc tính; (ii) set() để điều chỉnh thông tin thuộc tính; (iii) del() để xóa thông tin thuộc tính; (iv) doc() để tạo một mô tả cho thuộc tính. Ở đây chúng ta chỉ cần đến 02 tham số đầu tiên là get / set.
  • Chúng ta có thể sử dụng các properties này như là một thuộc tính của đối tượng. Theo quy tắc chung, tên của từng properties nên được đặt trùng với tên của thuộc tính, chỉ có một điểm khác là chữ cái đầu viết hoa.

Cách tiếp cận thứ hai:

  • Định nghĩa hình thức properties bằng cách sử dụng decorator @property.
  • Decorators là công cụ rất mạnh mẽ và hữu ích trong Python vì nó cho phép các lập trình viên sửa đổi hành vi của phương thức hoặc thuộc tính. Decorators cho phép chúng ta bọc một phương thức khác để mở rộng hành vi của phương thức được bọc, mà không sửa đổi vĩnh viễn. Chúng ta sẽ dần dần tìm hiểu kỹ thuật lập trình này trong những bài tiếp theo.

Bước 4.

Chúng ta định nghĩa constructor cho lớp đối tượng.

Những kỹ thuật lập trình cần chú ý:

  • Constructor là một dạng đặc biệt của phương thức, được sử dụng để khởi tạo các đối tượng.
  • Constructor được gọi tại thời điểm tạo đối tượng. Nó khởi tạo các giá trị để cung cấp dữ liệu cho các đối tượng, đó là lý do tại sao nó được gọi là constructor.
  • Khác với nhóm ngôn ngữ Java / C#, Python chỉ cung cấp một phương thức constructor duy nhất là __init__(). Chúng ta sẽ chủ động quyết định xem có để tham số cho constructor hay không. Cách thức được sử dụng ở đây là gán sẵn giá trị tên_tham_số = None và kiểm tra.
  • Từ khóa self giúp chúng ta liên hệ đến thuộc tính hoặc phương thức nội tại của lớp đối tượng. Chúng ta sử dụng từ khóa này để phân biệt khi muốn định nghĩa các biến có cùng tên với các thuộc tính hoặc phương thức nội tại của lớp.
  • Đối với thuộc tính chieuDai, chúng ta đã sử dụng cách tiếp cận thứ nhất bên trên để định nghĩa properties chieuDai. Do vậy chúng ta không cần định nghĩa tường minh thuộc tính này mà chỉ cần gọi phương thức ẩn __setChieuDai().
  • Đối với thuộc tính chieuRong, chúng ta đã sử dụng cách tiếp cận thứ hai bên trên để định nghĩa properties ChieuRong. Do vậy chúng ta định nghĩa tường minh thuộc tính ẩn __chieuRong.

Bước 5.

Chúng ta định nghĩa các phương thức tính chu vi và diện tích hình chữ nhật:

Bước 6.

Chúng ta thực hiện thử nghiệm tạo mới 02 hình chữ nhật và tính chu vi, diện tích:

Những kỹ thuật lập trình cần chú ý:

  • Để truy xuất đến những lớp đối tượng ở một package khác, chúng ta sử dụng từ khóa fromimport. Ví dụ ở đây là from object import HinhChuNhat.
  • Chúng ta khởi tạo một đối tượng thực bằng cách gọi tên của module và tên của lớp bên trong, ví dụ ở đây là MyClass(). Tùy thuộc vào tham số được truyền thì constructor __init__() sẽ thực thi việc khởi tạo giá trị tương ứng cho các thuộc tính.
  • Ví dụ ở đây. Đối tượng hinhChuNhatA được khởi tạo với constructor mặc định không có tham số. Như vậy sẽ sử dụng properties để điều chỉnh thông tin cho thuộc tính của đối tượng. Đối tượng hinhChuNhatB được khởi tạo với constructor có tham số.

Bước 7.

Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Tổng kết

Trong bài này, chúng ta đã cùng nhau tìm hiểu những kiến thức cơ bản về lớp đối tượng cũng như những tính chất về lập trình hướng đối tượng.

Chúng ta đã cùng nhau thực hiện một ví dụ nhỏ về lớp đối tượng với ngôn ngữ Python.

Trong các bài tiếp theo, chúng ta sẽ tiếp tục tìm hiểu những kiến thức khác xung quanh lập trình hướng đối tượng.

Lập trình hướng đối tượng – Phần 1 – Cơ bản về lớp đối tượng – Csharp

Giới thiệu

Lập trình hướng đối tượng (tiếng Anh: Object-oriented programming, viết tắt: OOP) là một mô hình kiến trúc lập trình dựa trên khái niệm “công nghệ đối tượng”, mà trong đó, đối tượng chứa đựng các dữ liệu: (i) thuộc tính của đối tượng; (ii) phương thức để thực thi các hành động của đối tượng.

OOP được xem là giúp tăng năng suất, đơn giản hóa độ phức tạp khi bảo trì cũng như mở rộng phần mềm bằng cách cho phép lập trình viên tập trung vào các đối tượng phần mềm ở bậc cao hơn.

Một số khái niệm cơ bản

Khái niệm đầu tiên là “đối tượng”, được hiểu như là 1 thực thể: người, vật hoặc 1 bảng dữ liệu, . . .

Một đối tượng bao gồm 2 thông tin chính:

  • Thuộc tính. Là những thông tin, đặc điểm của đối tượng. Ví dụ: một hình chữ nhật sẽ có chiều dài, chiều rộng, . . .
  • Phương thức. Là những thao tác, hành động mà đối tượng đó có thể thực hiện. Ví dụ: một hình chữ nhật sẽ có thao tác tính chu vi, diện tích, . . .

Khái niệm thứ hai là “lớp”, được hiểu như là một khuôn mẫu mà từng đối tượng là một thể hiện cụ thể dựa trên khuôn mẫu đó.

Ví dụ một lớp hình chữ nhật sẽ định nghĩa: (i) các thuộc tính chiều dài / chiều rộng; (ii) các phương thức tính chu vi, tính diện tích. Còn từng đối tượng hình chữ nhật sẽ có số đo cụ thể cho từng thuộc tính cũng như chu vi và diện tích riêng.

Các tính chất của lập trình hướng đối tượng

Tính đóng gói (encapsulation) và che giấu thông tin (information hiding):

  • Tính chất này không cho phép tác nhân bên ngoài thay đổi trạng thái nội tại của một đối tượng.
  • Chỉ có các phương thức nội tại của đối tượng cho phép thay đổi trạng thái của nó.
  • Đây là tính chất đảm bảo sự toàn vẹn của đối tượng.

Tính trừu tượng (abstraction):

  • Là phương pháp trừu tượng hóa định nghĩa lên những hành động, tính chất của loại đối tượng nào đó cần phải có.
  • Mỗi đối tượng có thể hoàn tất các công việc một cách nội bộ, báo cáo, thay đổi trạng thái của nó và liên lạc với các đối tượng khác mà không cần cho biết làm cách nào đối tượng tiến hành được các thao tác.
  • Tính chất này thường được gọi là sự trừu tượng của dữ liệu.

Tính kế thừa (inheritance):

  • Đặc tính này cho phép một đối tượng có thể có sẵn các đặc tính mà đối tượng khác đã có thông qua kế thừa.
  • Điều này cho phép các đối tượng chia sẻ hay mở rộng các đặc tính sẵn có mà không phải tiến hành định nghĩa lại.

Tính đa hình (polymorphism):

  • Thể hiện thông qua việc gửi các thông điệp (message).
  • Việc gửi các thông điệp này có thể so sánh như việc gọi các phương thức bên trong của một đối tượng.
  • Các phương thức dùng trả lời cho một thông điệp sẽ tùy theo đối tượng mà thông điệp đó được gửi tới sẽ có phản ứng khác nhau.

Xây dựng lớp đối tượng độc lập

Trong nội dung bài này, chúng ta cùng tìm hiểu cách xây dựng một lớp đối tượng độc lập cùng với tính chất đóng gói (encapsulation) bằng ngôn ngữ Csharp.

Bước 1.

Chúng ta tạo một Console Project trong MonoDevelop và đặt tên là CsharpOOPFirstProject.

Mặc định thì class Program.cs trong namespace CsharpOOPFirstProject với phương thức Main() được tạo ra.

Bước 2.

Chúng ta tạo class HinhChuNhat.cs và điều chỉnh namespace Object.

Những kỹ thuật lập trình cần chú ý:

  • Như đã trình bày ở phần Giới thiệu về Tính đóng gói (encapsulation) và che giấu thông tin (information hiding). Mỗi namespace có thể được xem như là một hình thức để gom nhóm các lớp đối tượng có cùng chung những đặc điểm nào đó.
  • Là một ngôn ngữ lập trình hướng đối tượng hoàn toàn, Csharp yêu cầu tất cả các lớp được định nghĩa phải thuộc một namespace nào đó.
  • Trong ví dụ hiện tại, chúng ta có thể đặt tên namespaceObject (nghĩa là đối tượng nói chung) hoặc Shape (nghĩa là hình vẽ nói chung).

Bước 3.

Chúng ta định nghĩa 02 thuộc tính cơ bản của một hình chữ nhật:

Những kỹ thuật lập trình cần chú ý:

  • Như đã trình bày ở phần Giới thiệu về đặc trưng của một lớp đối tượng. Các thuộc tính nội tại của một đối tượng thì chỉ có thể được trông thấy và điều chỉnh bởi các phương thức nội tại của chính đối tượng đó.
  • Chúng ta sử dụng từ khóa private được Csharp cung cấp. Thuộc tính này quy định một thuộc tính hoặc một phương thức là ẩn bên trong một lớp.

Bước 4.

Chúng ta định nghĩa các constructor cho lớp đối tượng:

Những kỹ thuật lập trình cần chú ý:

  • Constructor là một dạng đặc biệt của phương thức, được sử dụng để khởi tạo các đối tượng.
  • Constructor được gọi tại thời điểm tạo đối tượng. Nó khởi tạo các giá trị để cung cấp dữ liệu cho các đối tượng, đó là lý do tại sao nó được gọi là constructor.
  • Chú ý trong Csharp: (i) tên của constructor phải trùng với tên của lớp; (ii) constructor không có kiểu trả về.
  • Có 02 kiểu constructor: (i) kiểu mặc định không có tham số truyền vào; (ii) kiểu có tham số.
  • Từ khóa this giúp chúng ta liên hệ đến thuộc tính hoặc phương thức nội tại của lớp đối tượng. Chúng ta sử dụng từ khóa này để phân biệt khi muốn định nghĩa các biến có cùng tên với các thuộc tính hoặc phương thức nội tại của lớp.

Bước 5.

Chúng ta định nghĩa các phương thức đặc biệt truy xuất và điều chỉnh dữ liệu, được gọi là các properties với gettersetter:

Những kỹ thuật lập trình cần chú ý:

  • Csharp cung cấp một hình thức được gọi là properties để định nghĩa kiểu dữ liệu riêng cho việc truy xuất và điều chỉnh thông tin của các thuộc tính nội tại. Chúng ta có thể sử dụng các properties này như là một thuộc tính của đối tượng.
  • Theo quy tắc chung, tên của từng properties nên được đặt trùng với tên của thuộc tính, chỉ có một điểm khác là chữ cái đầu viết hoa.
  • Mỗi thuộc tính nên được theo kèm bởi một properties với cặp get / set tương ứng.

Bước 6.

Chúng ta định nghĩa các phương thức tính chu vi và diện tích hình chữ nhật:

Bước 7.

Chúng ta thực hiện thử nghiệm tạo mới 02 hình chữ nhật và tính chu vi, diện tích:

Những kỹ thuật lập trình cần chú ý:

  • Để truy xuất đến những lớp đối tượng ở một namespace khác, chúng ta sử dụng từ khóa using. Ví dụ ở đây là using object.
  • Chúng ta khởi tạo một đối tượng thực bằng cách gọi constructor của lớp đối tượng với toán tử new. Với constructor được gọi thì thuộc tính nội tại sẽ được khởi tạo với giá trị mặc định của nó.
  • Ví dụ ở đây. Đối tượng hinhChuNhatA được khởi tạo với constructor mặc định không có tham số. Như vậy sẽ sử dụng properties để điều chỉnh thông tin cho thuộc tính của đối tượng. Đối tượng hinhChuNhatB được khởi tạo với constructor có tham số.

Bước 8.

Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Tổng kết

Trong bài này, chúng ta đã cùng nhau tìm hiểu những kiến thức cơ bản về lớp đối tượng cũng như những tính chất về lập trình hướng đối tượng.

Chúng ta đã cùng nhau thực hiện một ví dụ nhỏ về lớp đối tượng với ngôn ngữ Csharp.

Trong các bài tiếp theo, chúng ta sẽ tiếp tục tìm hiểu những kiến thức khác xung quanh lập trình hướng đối tượng.

Lập trình hướng đối tượng – Phần 1 – Cơ bản về lớp đối tượng – Java

Giới thiệu

Lập trình hướng đối tượng (tiếng Anh: Object-oriented programming, viết tắt: OOP) là một mô hình kiến trúc lập trình dựa trên khái niệm “công nghệ đối tượng”, mà trong đó, đối tượng chứa đựng các dữ liệu: (i) thuộc tính của đối tượng; (ii) phương thức để thực thi các hành động của đối tượng.

OOP được xem là giúp tăng năng suất, đơn giản hóa độ phức tạp khi bảo trì cũng như mở rộng phần mềm bằng cách cho phép lập trình viên tập trung vào các đối tượng phần mềm ở bậc cao hơn.

Một số khái niệm cơ bản

Khái niệm đầu tiên là “đối tượng”, được hiểu như là 1 thực thể: người, vật hoặc 1 bảng dữ liệu, . . .

Một đối tượng bao gồm 2 thông tin chính:

  • Thuộc tính. Là những thông tin, đặc điểm của đối tượng. Ví dụ: một hình chữ nhật sẽ có chiều dài, chiều rộng, . . .
  • Phương thức. Là những thao tác, hành động mà đối tượng đó có thể thực hiện. Ví dụ: một hình chữ nhật sẽ có thao tác tính chu vi, diện tích, . . .

Khái niệm thứ hai là “lớp”, được hiểu như là một khuôn mẫu mà từng đối tượng là một thể hiện cụ thể dựa trên khuôn mẫu đó.

Ví dụ một lớp hình chữ nhật sẽ định nghĩa: (i) các thuộc tính chiều dài / chiều rộng; (ii) các phương thức tính chu vi, tính diện tích. Còn từng đối tượng hình chữ nhật sẽ có số đo cụ thể cho từng thuộc tính cũng như chu vi và diện tích riêng.

Các tính chất của lập trình hướng đối tượng

Tính đóng gói (encapsulation) và che giấu thông tin (information hiding):

  • Tính chất này không cho phép tác nhân bên ngoài thay đổi trạng thái nội tại của một đối tượng.
  • Chỉ có các phương thức nội tại của đối tượng cho phép thay đổi trạng thái của nó.
  • Đây là tính chất đảm bảo sự toàn vẹn của đối tượng.

Tính trừu tượng (abstraction):

  • Là phương pháp trừu tượng hóa định nghĩa lên những hành động, tính chất của loại đối tượng nào đó cần phải có.
  • Mỗi đối tượng có thể hoàn tất các công việc một cách nội bộ, báo cáo, thay đổi trạng thái của nó và liên lạc với các đối tượng khác mà không cần cho biết làm cách nào đối tượng tiến hành được các thao tác.
  • Tính chất này thường được gọi là sự trừu tượng của dữ liệu.

Tính kế thừa (inheritance):

  • Đặc tính này cho phép một đối tượng có thể có sẵn các đặc tính mà đối tượng khác đã có thông qua kế thừa.
  • Điều này cho phép các đối tượng chia sẻ hay mở rộng các đặc tính sẵn có mà không phải tiến hành định nghĩa lại.

Tính đa hình (polymorphism):

  • Thể hiện thông qua việc gửi các thông điệp (message).
  • Việc gửi các thông điệp này có thể so sánh như việc gọi các phương thức bên trong của một đối tượng.
  • Các phương thức dùng trả lời cho một thông điệp sẽ tùy theo đối tượng mà thông điệp đó được gửi tới sẽ có phản ứng khác nhau.

Xây dựng lớp đối tượng độc lập

Trong nội dung bài này, chúng ta cùng tìm hiểu cách xây dựng một lớp đối tượng độc lập cùng với tính chất đóng gói (encapsulation) bằng ngôn ngữ Java.

Bước 1.

Chúng ta tạo một Java Project trong Eclipse IDE và đặt tên là JavaOOPFirstProject.

Chúng ta tiếp tục tạo package mainclass Main.java cùng phương thức main() mặc định.

Bước 2.

Chúng ta tạo package objectclass HinhChuNhat.java.

Những kỹ thuật lập trình cần chú ý:

  • Như đã trình bày ở phần Giới thiệu về Tính đóng gói (encapsulation) và che giấu thông tin (information hiding). Mỗi package có thể được xem như là một hình thức để gom nhóm các lớp đối tượng có cùng chung những đặc điểm nào đó.
  • Là một ngôn ngữ lập trình hướng đối tượng hoàn toàn, Java yêu cầu tất cả các lớp được định nghĩa phải thuộc một package nào đó.
  • Trong ví dụ hiện tại, chúng ta có thể đặt tên packageobject (nghĩa là đối tượng nói chung) hoặc shape (nghĩa là hình vẽ nói chung).

Bước 3.

Chúng ta định nghĩa 02 thuộc tính cơ bản của một hình chữ nhật:

Những kỹ thuật lập trình cần chú ý:

  • Như đã trình bày ở phần Giới thiệu về đặc trưng của một lớp đối tượng. Các thuộc tính nội tại của một đối tượng thì chỉ có thể được trông thấy và điều chỉnh bởi các phương thức nội tại của chính đối tượng đó.
  • Chúng ta sử dụng từ khóa private được Java cung cấp. Từ khóa này quy định một thuộc tính hoặc một phương thức là ẩn bên trong một lớp.

Bước 4.

Chúng ta định nghĩa các constructor cho lớp đối tượng:

Những kỹ thuật lập trình cần chú ý:

  • Constructor là một dạng đặc biệt của phương thức, được sử dụng để khởi tạo các đối tượng.
  • Constructor được gọi tại thời điểm tạo đối tượng. Nó khởi tạo các giá trị để cung cấp dữ liệu cho các đối tượng, đó là lý do tại sao nó được gọi là constructor.
  • Chú ý trong Java: (i) tên của constructor phải trùng với tên của lớp; (ii) constructor không có kiểu trả về.
  • Có 02 kiểu constructor: (i) kiểu mặc định không có tham số truyền vào; (ii) kiểu có tham số.
  • Từ khóa this giúp chúng ta liên hệ đến thuộc tính hoặc phương thức nội tại của lớp đối tượng. Chúng ta sử dụng từ khóa này để phân biệt khi muốn định nghĩa các biến có cùng tên với các thuộc tính hoặc phương thức nội tại của lớp.

Bước 5.

Chúng ta định nghĩa các phương thức truy xuất và điều chỉnh dữ liệu, được gọi là các gettersetter:

Những kỹ thuật lập trình cần chú ý:

  • Đây chính là những phương thức nội tại được dành riêng để truy xuất và điều chỉnh thông tin cho các thuộc tính nội tại.
  • Theo quy tắc chung, tên của các phương thức này nên để getset đứng trước tên của thuộc tính.
  • Mỗi thuộc tính nên được theo kèm bởi một cặp get / set.

Bước 6.

Chúng ta định nghĩa các phương thức tính chu vi và diện tích hình chữ nhật:

Bước 7.

Chúng ta thực hiện thử nghiệm tạo mới 02 hình chữ nhật và tính chu vi, diện tích:

Những kỹ thuật lập trình cần chú ý:

  • Để truy xuất đến một lớp đối tượng ở một package khác, chúng ta sử dụng từ khóa import. Ví dụ ở đây là import object.HinhChuNhat.
  • Chúng ta khởi tạo một đối tượng thực bằng cách gọi constructor của lớp đối tượng với toán tử new. Với constructor được gọi thì thuộc tính nội tại sẽ được khởi tạo với giá trị mặc định của nó.
  • Ví dụ ở đây. Đối tượng hcnA được khởi tạo với constructor mặc định không có tham số. Đối tượng hcnB được khởi tạo với constructor có tham số.

Bước 8.

Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Tổng kết

Trong bài này, chúng ta đã cùng nhau tìm hiểu những kiến thức cơ bản về lớp đối tượng cũng như những tính chất về lập trình hướng đối tượng.

Chúng ta đã cùng nhau thực hiện một ví dụ nhỏ về lớp đối tượng với ngôn ngữ Java.

Trong các bài tiếp theo, chúng ta sẽ tiếp tục tìm hiểu những kiến thức khác xung quanh lập trình hướng đối tượng.

Một số thuật toán cơ bản xung quanh số nguyên tố – PHP

Giới thiệu

Trong nội dung bài này, chúng ta cùng nhau tìm hiểu một số kiến thức cơ bản xung quanh số nguyên tố.

Một số tự nhiên p (p > 1) là số nguyên tố nếu p có đúng 02 ước số là 1 và p.

Ví dụ các số nguyên tố: 2, 3, 5, 7, 11, 13, 17, 19, 23, …

Chúng ta cùng nhau thực hiện một số giải thuật cơ bản bằng ngôn ngữ PHP để giải quyết các bài toán con sau:

  • Kiểm tra xem một số tự nhiên n có phải là số nguyên tố hay không.
  • Liệt kê các số nguyên tố nằm trong phạm vi [1, n].

Kiểm tra tính nguyên tố

Giải thuật thứ nhất

Ý tưởng giải thuật

Chúng ta kiểm tra xem có tồn tại một số nguyên k (2 ≤ k ≤ n – 1) mà k là ước của n (n chia hết cho k) thì n không phải là số nguyên tố, ngược lại n là số nguyên tố.

Trên thực tế ta chỉ cần kiểm tra k từ 2 đến √n là được.

Bước 1.

Chúng ta tạo một PHP Project trong Eclipse IDE và đặt tên là PHPAlgorithmBasicProject.

Chúng ta tiếp tục tạo file index.php.

Bước 2.

Chúng ta tạo folder algorithmclass SoNguyenTo.php.

Chúng ta tiếp tục tạo phương thức kiemTraSNTFirst() với:

  • Tham số cho phương thức này là một số tự nhiên n.
  • Kiểu dữ liệu trả về là bool. Phương thức trả về kết quả: (i) TRUE nếu n là số nguyên tố; (ii) FALSE nếu ngược lại.

Bước 3.

Chúng ta thực hiện giải thuật bằng ngôn ngữ PHP như sau:

Những kỹ thuật lập trình cần chú ý:

  • Phương thức để tính căn bậc 2 của một số tự nhiên nsqrt().
  • Phương thức để lấy phần nguyên của một số thập phân là round().

Bước 4.

Chúng ta thực hiện thử nghiệm phương thức kiemTraSNTFirst() trong index.php như sau:

Bước 5.

Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Giải thuật thứ hai

Ý tưởng giải thuật

Chúng ta sẽ chỉ kiểm tra các số k có tính chất giống với một trong hai tính chất cơ bản sau của số nguyên tố:

  • Trừ số 2 và các số nguyên tố là số lẻ.
  • Trừ số 2, 3, các số nguyên tố có dạng 6k ± 1 (vì số có dạng 6k ± 2 thì chia hết cho 2, số có dạng 6k ± 3 thì chia hết cho 3).

Bước 1.

Chúng ta thực hiện giải thuật bằng ngôn ngữ PHP như sau:

Bước 2.

Chúng ta thực hiện thử nghiệm phương thức kiemTraSNTSecond() trong index.php như sau:

Bước 3.

Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Liệt kê các số nguyên tố trong đoạn [1, N]

Giải thuật thứ nhất

Ý tưởng giải thuật

Chúng ta lần lượt xem xét các số m trong đoạn [1, n], rồi kiểm tra tính nguyên tố của m.

Bước 1.

Chúng ta thực hiện giải thuật bằng ngôn ngữ PHP như sau:

Những kỹ thuật lập trình cần chú ý:

  • Khác với những ngôn ngữ khác như Java / Csharp. PHP không quy định cứng kiểu dữ liệu cho từng phần tử trong tập hợp. Do vậy chúng ta phải chủ động xác định kiểu dữ liệu cho từng phần tử trong tập hợp.
  • Để điều chỉnh giá trị và số lượng phần tử trong một tập hợp, chúng ta thêm ký tự & vào trước tên biến. Tương tự như trong C, ký tự này thể hiện địa chỉ trong bộ nhớ đối với tập hợp.

Bước 2.

Chúng ta thực hiện thử nghiệm phương thức lietKeSNTFirst() trong index.php như sau:

Bước 3.

Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Giải thuật thứ hai

Ý tưởng giải thuật

Chúng ta áp dụng sàng Eratosthenes để tìm các số nguyên tố nhỏ hơn hoặc bằng số tự nhiên n:

  • Bước 1: Tạo 1 danh sách các số tự nhiên liên tiếp từ 2 đến n: (2, 3, 4,…, n).
  • Bước 2: Giả sử tất cả các số trong danh sách đều là số nguyên tố. Trong đó, p = 2 là số nguyên tố đầu tiên.
  • Bước 3: Tất cả các bội số của p: 2p, 3p, 4p,… sẽ bị đánh dấu vì không phải là số nguyên tố.
  • Bước 4: Tìm các số còn lại trong danh sách mà chưa bị đánh dấu và phải lớn hơn p. Nếu không còn số nào, dừng tìm kiếm. Ngược lại, gán cho p giá trị bằng số nguyên tố tiếp theo và quay lại bước 3.

Khi giải thuật kết thúc, tất các số chưa bị đánh dấu trong danh sách là các số nguyên tố cần tìm.

Bước 1.

Chúng ta thực hiện giải thuật bằng ngôn ngữ PHP như sau:

Bước 2.

Chúng ta thực hiện thử nghiệm phương thức lietKeSNTSecond() trong index.php như sau:

Bước 3.

Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Tổng kết

Trong bài này, chúng ta đã cùng nhau tìm hiểu một số giải thuật cơ bản xung quanh số nguyên tố và thực hiện bằng ngôn ngữ PHP.

Hy vọng rằng chúng ta có thể áp dụng phù hợp những kỹ thuật và chức năng này cho những bài tiếp theo.

Một số thuật toán cơ bản xung quanh số nguyên tố – Python

Giới thiệu

Trong nội dung bài này, chúng ta cùng nhau tìm hiểu một số kiến thức cơ bản xung quanh số nguyên tố.

Một số tự nhiên p (p > 1) là số nguyên tố nếu p có đúng 02 ước số là 1 và p.

Ví dụ các số nguyên tố: 2, 3, 5, 7, 11, 13, 17, 19, 23, …

Chúng ta cùng nhau thực hiện một số giải thuật cơ bản bằng ngôn ngữ Python để giải quyết các bài toán con sau:

  • Kiểm tra xem một số tự nhiên n có phải là số nguyên tố hay không.
  • Liệt kê các số nguyên tố nằm trong phạm vi [1, n].

Kiểm tra tính nguyên tố

Giải thuật thứ nhất

Ý tưởng giải thuật

Chúng ta kiểm tra xem có tồn tại một số nguyên k (2 ≤ k ≤ n – 1) mà k là ước của n (n chia hết cho k) thì n không phải là số nguyên tố, ngược lại n là số nguyên tố.

Trên thực tế ta chỉ cần kiểm tra k từ 2 đến √n là được.

Bước 1.

Chúng ta tạo một PyDev Project trong Eclipse IDE và đặt tên là PythonAlgorithmBasicProject.

Chúng ta tiếp tục tạo package mainmodule Main.py cùng phương thức main() mặc định.

Bước 2.

Chúng ta tạo package algorithmmodule SoNguyenTo.py.

Chúng ta tiếp tục tạo phương thức kiemTraSNTFirst() với:

  • Tham số cho phương thức này là một số tự nhiên n.
  • Phương thức trả về kết quả: (i) True nếu n là số nguyên tố; (ii) False nếu ngược lại.

Bước 3.

Chúng ta thực hiện giải thuật bằng ngôn ngữ Python như sau:

Những kỹ thuật lập trình cần chú ý:

  • Phương thức để tính căn bậc 2 của một số tự nhiên nmath.sqrt().
  • Phương thức để lấy phần nguyên của một số thập phân là round().
  • Thư viện math định nghĩa các phương thức dùng tính toán các biểu thức toán học cơ bản. Các phương thức này đều là tĩnh nên được gọi trực tiếp bằng cú pháp math.phương_thức().

Bước 4.

Chúng ta thực hiện thử nghiệm phương thức kiemTraSNTFirst() trong module Main.py như sau:

Bước 5.

Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Giải thuật thứ hai

Ý tưởng giải thuật

Chúng ta sẽ chỉ kiểm tra các số k có tính chất giống với một trong hai tính chất cơ bản sau của số nguyên tố:

  • Trừ số 2 và các số nguyên tố là số lẻ.
  • Trừ số 2, 3, các số nguyên tố có dạng 6k ± 1 (vì số có dạng 6k ± 2 thì chia hết cho 2, số có dạng 6k ± 3 thì chia hết cho 3).

Bước 1.

Chúng ta thực hiện giải thuật bằng ngôn ngữ Python như sau:

Bước 2.

Chúng ta thực hiện thử nghiệm phương thức kiemTraSNTSecond() trong module Main.py như sau:

Bước 3.

Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Liệt kê các số nguyên tố trong đoạn [1, N]

Giải thuật thứ nhất

Ý tưởng giải thuật

Chúng ta lần lượt xem xét các số m trong đoạn [1, n], rồi kiểm tra tính nguyên tố của m.

Bước 1.

Chúng ta thực hiện giải thuật bằng ngôn ngữ Python như sau:

Những kỹ thuật lập trình cần chú ý:

  • Python cung cấp cho chúng ta một số kiểu dữ liệu lưu trữ tập hợp. Chúng ta thường sử dụng một số dạng sau: (i) List để lưu trữ không giới hạn các phần tử có thể trùng nhau; (ii) Tuple để lưu trữ một số lượng cố định các phần tử không trùng nhau; (ii) Dictionary để lưu trữ không giới hạn các phần tử theo từng cặp <từ_khóa, giá_trị>. Chúng ta sẽ dần tìm hiểu cụ thể hơn trong những bài tiếp theo.
  • Khác với những ngôn ngữ khác như Java / Csharp. Python không quy định cứng kiểu dữ liệu cho từng phần tử trong tập hợp. Do vậy chúng ta phải chủ động xác định kiểu dữ liệu cho từng phần tử trong tập hợp.
  • Với tham số là một biến riêng lẻ, giá trị của tham số sẽ không bị thay đổi sau khi thực hiện phương thức.
  • Với tham số là một List hay Dictionary, các phần tử của danh sách có thể bị thay đổi sau khi thực hiện phương thức.

Bước 2.

Chúng ta thực hiện thử nghiệm phương thức lietKeSNTFirst() trong module Main.py như sau:

Bước 3.

Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Giải thuật thứ hai

Ý tưởng giải thuật

Chúng ta áp dụng sàng Eratosthenes để tìm các số nguyên tố nhỏ hơn hoặc bằng số tự nhiên n:

  • Bước 1: Tạo 1 danh sách các số tự nhiên liên tiếp từ 2 đến n: (2, 3, 4,…, n).
  • Bước 2: Giả sử tất cả các số trong danh sách đều là số nguyên tố. Trong đó, p = 2 là số nguyên tố đầu tiên.
  • Bước 3: Tất cả các bội số của p: 2p, 3p, 4p,… sẽ bị đánh dấu vì không phải là số nguyên tố.
  • Bước 4: Tìm các số còn lại trong danh sách mà chưa bị đánh dấu và phải lớn hơn p. Nếu không còn số nào, dừng tìm kiếm. Ngược lại, gán cho p giá trị bằng số nguyên tố tiếp theo và quay lại bước 3.

Khi giải thuật kết thúc, tất các số chưa bị đánh dấu trong danh sách là các số nguyên tố cần tìm.

Bước 1.

Chúng ta thực hiện giải thuật bằng ngôn ngữ Python như sau:

Bước 2.

Chúng ta thực hiện thử nghiệm phương thức lietKeSNTSecond() trong module Main.py như sau:

Bước 3.

Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Tổng kết

Trong bài này, chúng ta đã cùng nhau tìm hiểu một số giải thuật cơ bản xung quanh số nguyên tố và thực hiện bằng ngôn ngữ Python.

Hy vọng rằng chúng ta có thể áp dụng phù hợp những kỹ thuật và chức năng này cho những bài tiếp theo.