Học lập trình hướng đối tượng với JAVA

Hầu hết sinh viên chuyên ngành CNTT đã được học về lập trình hướng đối tượng và cả ngôn ngữ lập trình Java. Tuy nhiên, nhiều bạn vẫn thấy khó hiểu về lập trình hướng đối tượng cũng như cách áp dụng nó vào lập trình thực tế.

Để giúp các bạn dễ dàng tiếp cận hơn với chủ đề quan trọng này, trong seri bài viết chúng ta sẽ bàn về việc sử dụng lập trình hướng đối tượng trong Java từ cơ bản như cách sử dụng lập trình hướng đối tượng đến cài đặt mô hình MVC cũng như chuyển đổi giữa đối tượng và CSDL (ORM: Object Relation Mapping). Tôi sẽ cố gắng trình bày theo hướng thực hành với ví dụ cụ thể để các bạn dễ hiểu và dễ làm theo.

1. Lập trình hướng đối tượng là gì?

Trong lập trình thông thường chúng ta có 02 hướng tiếp cận để phân tích bài toán trước khi tiến hành lập trình là hướng cấu trúc(Structered Programming) và hướng đối tượng (Object Oriented Programming).

Lập trình có cấu trúc đã phát triển từ đầu những năm 1970 và đã khẳng định được ưu điểm của nó thông qua hàng loạt ứng dụng đã được phát triển và các ngôn ngữ lập trình hỗ trợ như Pascal, C… Với ưu điểm là cấu trúc rõ ràng, đơn giản, lập trình có cấu trúc đã phát triển mạnh trong giai đoạn đầu của ngành phần mềm với các ứng dụng có độ phức tạp thấp nhưng khi phải giải quyết các bài toán phức tạp hơn thì Lập trình có cấu trúc trở nên khó điều kiển và dần mất ưu thế về Lập trình hướng đối tượng.

Lập trình hướng đối tượng là phương thức tiếp cận bài toán theo hướng xem hệ thống là hoạt động của các đối tượng như trong thực tế, sau đó mô tả chúng và cho chúng tương tác với nhau để tạo nên hệ thống. Với sự tiếp cận như vậy giúp lập trình hướng đối tượng tư duy gần với thực tế hơn (lập trình có cấu trúc tư duy thiên về toán hơn) và độ phức tạp cũng chia ra cho việc mô tả các đối tượng và hành vi của nó nên độ phức tạp của bài toán cũng được chia nhỏ ra.

Chúng ta xem xét ví dụ sau để thấy được ưu điểm của Lập trình hướng đối tượng:

Ví dụ chúng ta cần viết một ứng dụng để mô tả một trận đấu bóng đá. Chúng ta biết trận đấu gồm 22 cầu thủ, 04 trọng tài, khán giả, sân bóng và quả bóng. Trong đó mỗi hoạt động của quá bóng đều chi phối hoạt động của các thành phần còn lại. Ví dụ khi quả bóng được phát đi và chuẩn bị rơi xuống 1 điểm trên sân mỗi cầu thủ phải có phản ứng tương ứng hợp lý và trọng tài cũng phải di chuyển hợp lý, khán giả cũng phải có hành động phù hợp …

Nếu tiếp cận theo lập trình có cấu trúc chúng ta phải xét từng trường hợp cụ thể (22 cầu thử + 04 trọng tài + sân bong = 27 đối tượng phải xem xét) để điều khiển cho hợp lý làm cho bài toán vô cùng phức tạp. Còn lập trình hướng đối tượng không làm vậy, nó chia hệ thống ra thành các nhóm đối tượng như sau: Cầu thủ (có thể phân biệt thủ môn riêng), Trọng tài, Khán giả, Sân bóng và Quả bóng. Sau đó định nghĩa tính chất và hành vi của từng loại đối tượng. Ví dụ: cầu thủ có các chỉ số như Vị trí đảm nhận, tốc độ chạy, khả năng sút, mức độ tranh chấp, đánh đầu … và định nghĩa ngữ cảnh và hành vi của các cầu thủ theo ngữ cản đó. Ví dụ một cầu thủ thấy bóng cách xa 30 mét thì không cần di chuyển theo bóng để giữ vị trí, nếu cách xa 20 mét thì di chuyển theo hướng bóng để đón bóng, tốc độ di chuyển càng gần bóng càng nhanh chẳng hạn …. Sau đó mô tả cho 22 cầu thủ. Sau đó tạo ngữ cảnh cho trận đấu và các đối tượng sẽ hành xử theo hành vi đã được mô tả để tạo nên ứng dụng.

Tất nhiên, đây chỉ là ví dụ để bạn có ý niệm còn cài đặt nó không hề đơn giản cho người mới học lập trình hướng đối tượng, chúng ta sẽ thực hiện với bài toán dễ hơn để bạn dễ hình dung và thực hiện.

Lập trình hướng đối tượng đã thể hiện tính ưu việt của nó mà bằng chứng là hầu hết các ngôn ngữ lập trình hiện đại đều hỗ trợ mô hình này như C++, Java, C#, PHP… Ở thời điểm này nếu không rành về Lập trình hướng đối tượng thì quả là thiệt thòi cho một Lập trình viên.

Các lý thuyết chi tiết về Lập trình hướng đối tượng bạn có thể tìm đọc thêm ở nhiều tài liệu khác, trong bài này Tôi sẽ hướng dẫn bạn cài đặt một ứng dụng, hy vọng qua đó bạn sẽ hiểu rõ hơn về lập trình hướng đối tượng và cách cài đặt nó trên ngôn ngữ lập trình cụ thể là Java.

2. Bài toán và phân tích

Trong bài viết này, chúng ta sẽ cài đặt giả lập hoạt động của một máy ATM. Máy ATM cho phép người dùng đăng nhập, rút tiền, chuyển tiền, xem số dư, đổi mật khẩu.. Trong ví dụ này chúng ta giới hạn các chức năng của máy ATM gồm: đăng nhập, rút tiền, chuyển tiền, xem số dư, đổi mật khẩu và sẽ giảm độ phức tạp đến mức tối đa.

Biểu đồ chức năng của hệ thống ATM như sau:

ATM - Use Case Diagram

Bạn có thể xem thêm về cách xây dựng bản vẽ này tại đây: Use Case Diagram.

Bây giờ chúng ta xem trong hệ thống này có những đối tượng nào nhé. Quan sát các đối tượng trong hệ thống chúng ta thấy có những đối tượng sau:

(Làm thế nào để thấy được các bạn vui lòng đọc bài này: Class Diagram )

  • Khách hàng (Customer)
  • Tài khoản (Account)

Thiết lập thêm các thuộc tính của các lớp này chúng ta có sơ đồ lớp như sau:

ATM - Class Diagram

Để đơn giản cho quá trình cài đặt, tôi sẽ đơn giản quan hệ này bằng cách cho tên khách hàng vào lớp tài khoản luôn là biết khách hàng nào sở hữu tài khoản này và bỏ qua đối tượng khách hàng. Lúc đó hệ thống chỉ cần mô tả 01 lớp là Account như sau:

ATM - Class Diagram -2

Mọi chuyện có vẻ đơn giản hơn rồi.

Để cài đặt ứng dụng trong Java chúng ta phải cài đặt một lớp ứng dụng có tên là ATMApp(ứng dụng ATM) để sử dụng lớp Account này nhằm tạo ra chức năng cho khách hàng sử dụng. Lúc đó sơ đồ lớp như sau:

ATM - Class Diagram -3

Các phương thức login(đăng nhập), viewAccountInfo(xem thông tin khách hàng), changePassword(thay đổi mật khẩu), withdraw(rút tiền), transfer(chuyển tiền) của lớp ATM sẽ tương tác với các đối tượng tài khoản được tạo ra từ lớp Account để tạo nên hệ thống.

Bây giờ chúng ta sẽ cài đặt ứng dụng này trên Java.

3. Cài đặt ứng dụng ATM trên Java

Để thực hiện các bước theo bài này bạn phải cài đặt Java và NetBean trên máy tính của mình. Xem thêm bài hướng dẫn cài đặt Java và NetBean để cài đặt môi trường.

Bước 1. Tạo dự án ATMApp

Khởi động NetBean và tạo một dự án ATMApp như hình bên dưới.

Tao du an-1

Bỏ qua các Comment và thêm vào dòng lệnh System.out.print như bên dưới để bắt đầu ứng dụng. Nhấn Play để chạy và kiểm tra ứng dụng.

Tao du an-2

Bước 2. Xây dựng lớp Account

Kích phải chuột lên gói ATMApp bên trái – > New -> Java Class

Create Account Class-1

Nhập tên lớp là Account, chọn Package là ATMApp và kích Finish để tạo lớp.

Create Account Class-2

Lớp ban đầu chỉ có:

public class Account {

}

Chúng ta sẽ xem hình mô tả lớp Account ở trên để tiến hành cài đặt.

  • Tiếp theo chúng ta sẽ code các thuộc tính cho lớp. Mặc định cách sử dụng kiểu dữ liệu và khai báo bạn đã biết. Nếu chưa biết bạn nên đọc thêm sách hướng dẫn lập trình cơ bản trên Java trước.

Create Account Class-3

  • Tiếp tục chúng ta sẽ code Contructor để khởi tạo giá trị cho lớp:

Create Account Class-4

Constructor là một phương thức đặc biệt được sử dụng để khởi tạo giá trị ban đầu cho đối tượng, phương thức này sẽ tự chạy khi tạo một đối tượng. Contructor có tên trùng với tên lớp và không có giá trị trả về.

  • Thử sử dụng lớp này:

Quay trở lại lớp ATMApp và sử dụng lớp vừa tạo theo đoạn mã dưới đây:

Create Account Class-5

Đoạn mã trên tạo ra đối tượng acc1 của lớp Account và sử dụng chúng để in thông tin ra màn hình. Cho chạy ứng dụng nó vẫn hoạt động tốt. Tuy nhiên, theo tinh thần lập trình hướng đối tượng thì không khuyến khích cách truy cập trực tiếp vào các thuộc tính của lớp như thế này.

Điều này cũng giống như chúng ta đeo bảng tên mà tất cả các thông tin cá nhân của mình hiên ra trước mắt mọi người và nguy hiểm hơn là người khác có thể thay đổi thông tin này mà không cần hỏi ý kiên của chúng ta. Ví dụ ai đó tự nhiên lại thay đổi tên của bạn mà không hỏi ý kiến bạn có đồng ý hay không thì quá nguy hiểm.

Do vậy, lập trình hướng đối tượng khuyến khích bạn viết private cho các thuộc tính của đối tượng và viết các hàm get() và set() để lấy hoặc thay đổi giá trị của thuộc tính.  Ví dụ đối với thuộc tính accountNo cần 02 phương thức như sau:

Create Account Class-6

Như vậy muốn lấy giá trị thuộc tính của đối tượng phải hỏi qua chủ thể và nếu không thích chủ thể có thể dùng hàm if để từ chối trả về thông tin.

Tiếp tục bổ sung các hàm Get và Set cho các thuộc tính còn lại chúng ta sẽ hoàn thiện lớp Account:

Create Account Class-7

Bước 3. Sử dụng lớp Account để xây dựng ứng dụng ATM

– Tạo ra một tài khoản (đối tượng của lớp Account)

Trước tiên chúng ta phải tạo ra một tài khoản của khách hàng cần giao tiếp. Trong thực tế chúng ta phải lấy từ CSDL lên(phần này sẽ bàn ở các bài sau) nhưng ở đây để đơn giản chúng ta gán trực tiếp.

ATMApp - Class-1

Như vậy chúng ta đã có 01 tài khoản là acc1, chúng ta sẽ xây dựng chức năng login để khách hàng sử dụng đăng nhập.

Thủ tục đăng nhập (login)

ATMApp - Class-2

 

Để đoạn mã trên chạy được bạn phải sử dụng dòng lệnh dưới trước lệnh khai báo lớp để ATMApp để sử dụng lớp Scanner.

 import java.util.Scanner;

Thực hiện đoạn lệnh trên để kiểm tra chức năng Login.

-Tiếp theo chúng ta sẽ viết các thủ tục rút tiền, xem số dư tài khoản như sau:
 ATMApp - Class-3

Để gọi 2 hàm trên chúng ta vào hàm Main và thêm đoạn lệnh sau:

ATM - Class Diagram -4

Tiếp theo chúng ta sẽ viết hàm chuyển tiền. Hàm chuyển tiền là hàm chuyển từ tài khoản này qua tài khoản khác nên chúng ta phải tạo thêm tài khoản nhận tiền để thực hiện thao tác này và viết hàm chuyển tiền để thực hiện.

ATMApp - Class-5

Chúng ta sẽ quay trở lại hàm main() và code để thêm tài khoản và sử dụng hàm chuyển tiền ở trên:

ATMApp - Class-7

Chúng ta thấy việc tạo ra đối tượng thứ 2 của tài khoản rất dễ dàng và chúng ta dễ dàng giao tiếp với nó đã cho thấy sự tiện lợi của Lập trình hướng đối tượng.

Qua ứng dụng trên các bạn có thể thấy việc lập trình theo mô hình hướng đối tượng giúp chúng ta mô tả bài toán sát với cách thực hiện trong mô hình thực tế từ đó giúp bạn dễ hình dung hơn.

Thêm các câu lệnh điều khiển vào hàm main() để hoạt động của ứng dụng trên gần với với hoạt động  thực tế của ATM hơn. Bạn có thể download đoạn mã của cả ứng dụng trên tại đây: Download.

Trong phần trên để bạn dễ hiểu tôi đã đưa tất cả các phương thức về lớp ATMApp. Tuy nhiên, điều này làm hạn chế khả năng của các đối tượng sinh ra từ lớp Account cũng như giảm ưu thế về sử dụng lại trong lập trình hướng đối tượng. Để cải tiến cho ứng dụng trên tốt hơn chúng ta cần đưa những phương thức như withdraw, deposit, checkLogin, changePassword vào thành phương thức của lớp Account. Sau đó các phương thức của lớp ATMApp sử dụng lại các phương thức này. Bạn có thể download code sau khi đã cải tiến tại đây: Download.

Bài viết này mới là phần ứng dụng cơ bản về lập trình hướng đối tượng trên Java, trong loạt bài tiếp theo Tôi sẽ giới thiệu các bạn cách cài đặt theo MVC và chuyển đổi dữ liệu từ Database lên đối tượng qua ORM(Object Relation Mapping). Mời các bạn đón đọc.

Nếu các bạn vẫn thấy khó hiểu có thể đăng ký lớp học thử tại iViettech. Đăng ký học thử 1 tuần miễn phí tại iViettech.

Bài tiếpCài đặt mô hình MVC(Model – View – Controller) trong Java