+6

Lập trình hướng đối tượng OOP

Hi anh em,

Hôm nay mình sẽ chia sẻ 1 chủ đề vô cùng quen thuộc với hầu hết các lập trình viên. Đó là lập trình hướng đối tượng, nội dung sẽ gồm các phần: định nghĩa, 4 tính chất oop, demo code. Hy vọng được thảo luận cùng anh em.

Không để mọi người chờ lâu, bắt đầu nào!

1. Định nghĩa

OOP là viết tắt của Object-Oriented Programming dịch ra là lập trình hướng đối tượng. Lập trình hướng đối tượng là kỹ thuật, phương pháp lập trình sử dụng các đối tượng (objects) để xây dựng ứng dụng. Hầu hết các ngôn ngữ như: C#, Java, PHP, Ruby… đều hỗ trợ lập trình hướng đối tượng.

Lưu ý: Lập trình hướng đối tượng (OOP) là một kỹ thuật, phương pháp lập trình và mỗi lập trình viên sẽ có cách triển khai, áp dụng khác nhau tùy vào từng dự án, tùy vào kinh nghiệm. Ngoài ra không bắt buộc phải áp dụng OOP vào dự án, có thể dùng lập trình hướng hàm cấu trúc (Procedure Oriented Programming – POP) hay các phương pháp khác.

2. Lợi ích

Như ở giới thiệu ở phần 1, ngoài OOP ra còn có các phương pháp lập trình khác. Vậy tại sao OOP lại được ưa chuộng và phổ biến trong lập trình?

OOP có các lợi ích sau:

  • Cách tiếp cận oop rất thực tế. Dễ mô hình hóa các bài toán, các đối tượng bên ngoài đời sống thành mã code. Ví dụ như ngoài đời thực chúng ta có thực thể lập trình viên, có các hành động lấy yêu cầu, viết code, deploy sản phẩm. Từ đó chúng ta có thể tạo ra lớp Developer với các phương thức: AnalyzeRequirement, WriteCode, Deploy tương ứng.

  • Dễ bảo trì, dễ mở rộng và code nhìn gọn gòn sạch hơn. Về ưu điểm này thì sau khi đi qua các tính chất của OOP ở phần tiếp theo các bạn sẽ hiểu rõ hơn.

Lưu ý: Việc áp dụng OOP có giúp clean code, dễ reuse, dễ scale hay không còn tùy thuộc vào kinh nghiệm và tư duy áp dụng kỹ thuật OOP của mỗi người. Cùng 1 kỹ thuật sẽ có các cách làm tốt, chưa tốt khác nhau.

3. Class và Object

image.png

Trong OOP, Lớp (Class) là 1 kiểu dữ liệu, 1 khuôn mẫu giúp mô hình hóa các đối tượng thực tế. Class sẽ có các thuộc tính (properties) và các phương thức (methods) tương ứng với thuộc tính và hành động thực tế bên ngoài.

Ví dụ:

//(C# code)
public class Developer
{
       private string Name {get;set;}
       public void AnalyzeRequirement()
       {
              //Do something
       }

       public void WriteCode()
       {
              //Do something
       }

       public void Deploy()
       {
              //Do something
       }
}

Nếu ta coi Class là 1 khuôn mẫu thì Object(đối tượng) là 1 thể hiện được tạo ra từ khuôn mẫu đó.

Ví dụ: Lớp (Class) Developer sẽ có các thể hiện là các Đối tượng(Object) như: BackendDeveloper, FrontendDeveloper, FullStackDeveloper.

Tiêp theo chúng ta sẽ cùng nhau tìm hiểu 4 tính chất của lập trình hướng đối tượng (OOP).

4. Tính đóng gói (Encapsulation)

image.png

Tính đóng gói (Encapsulation) hay còn gọi là** hiding information** giúp gom nhóm lại các thuộc tính (properties), phương thức (methods) và nhiều thành phần khác thành một đối tượng hay một đơn vị.

Tính đóng gói được triển khai bằng cách sử dụng access modifier: public, private, protected, internal.

  • public: Có thể truy cập từ bất cứ đâu
  • private: Chỉ có thể truy cập ở bên trong class
  • protected: Chỉ có thể truy cập ở bên trong class và các class kế thừa từ class đó
  • internal: Giống như public nhưng chỉ hạn chế trong 1 assembly.

Giải thích về intenal: Hiểu đơn giản là ta có 1 ứng dụng U gọi 1 thư viện bên ngoài L. Trong thư viện L này có class C khai báo internal. Các class khác trong thư viện L này có thể truy cập class C này nhưng ứng dụng U thì không thể do khác assembly.

Ví dụ:

//(C# code)
public class BankAccount
{
	private string Name {get;set;}
	
	private string AccountNumber {get;set;}
	
	private Datetime CreateDate {get;set;}

	public string GetAccountName()
    {
	    return Name;
     }
}

5. Tính kế thừa (Inheritance)

image.png

Tính kế thừa cho phép tạo ra 1 class con từ 1 class có sẵn và mở rộng class đó. Các class con có thể kế thừa lại các thuộc tính (properties) và phương thức (methods) của class cha, có thể không cần định nghĩa lại các phương thức hoặc tái định nghĩa (override) hoặc thêm các phương thức sử dụng riêng ở lớp con. Tính chất này giúp tái sử dụng, tận dụng mã nguồn có sẵn.

Ví dụ:


//(C# code)
class Vehicle  // base class (parent) 
{
  public string brand = "Ford";  // Vehicle field
  public void honk()             // Vehicle method 
  {                    
    Console.WriteLine("Tuut, tuut!");
  }
}

class Car : Vehicle  // derived class (child)
{
  public string modelName = "Mustang";  // Car field
}

class Program
{
  static void Main(string[] args)
  {
    // Create a myCar object
    Car myCar = new Car();

    // Call the honk() method (From the Vehicle class) on the myCar object
    myCar.honk();

    // Display the value of the brand field (from the Vehicle class) and the value of the modelName from the Car class
    Console.WriteLine(myCar.brand + " " + myCar.modelName);
  }
}

6. Tính đa hình (Polymorphism)

Tính đa hình cho phép một hành động có thể được thực hiện bằng nhiều cách khác nhau.

Có 2 cách vận dụng tính đa hình:

  • Method overloading(đa hình khi biên dịch(compile time)): Trong 1 lớp (class) các phương thức (methods) có cùng tên nhưng kiểu trả về và tham số truyền vào khác nhau (số lượng, kiểu) Ví dụ:
//(C# code)
public class BankAccount()
{
	public object GetAccountInformation(int bankId)
    {
	//To do something
    }

	public object GetAccountInformation(string bankName)
    {
	//To do something
    }

    public object GetAccountInformation(string bankName, string address)
    {
	//To do something
    }
}
  • Method overriding(đa hình ở thời điểm thực thi(runtime)): Các phương thức được thực hiện ở các lớp con kế thừa từ lớp cha (base class). Nội dung thực hiện bên trong mỗi lớp khác nhau tùy vào logic nghiệp vụ. Chỉ khi nào runtime ta mới biết được đối tượng sẽ sử dụng phương thức nào. Ví dụ:
//(C# code)
public class BankAccount //Base class
{
	public decimal GetTotalPrice()
	{
		//To do something
    }
}

public class CreditCard: BankAccount 
{
    public decimal GetTotalPrice()
	{
		//To do something
    }
}

public class DebitCard: BankAccount 
{
    public decimal GetTotalPrice()
	{
		//To do something
    }
}

public class Program
{
       public static void Main(string[] args)
       {
               BankAccount bank = new CreditCard();
               Console.WriteLine(bank .GetTotalPrice());
               Console.Read();
       }
}

7. Tính trừu tượng (Abstraction)

So với 3 tính chất trên thì tính trừu tượng để giải thích hơi khó hiểu 1 tí bởi vì rất trừu tượng. ^^

Tính trừu tượng cho phép tổng quát hóa một đối tượng. Nghĩa là ẩn đi những thông tin chi tiết bên trong, chỉ thể hiện ra những thông tin bên ngoài. Và nhìn vào thông tin bên ngoài đó ta có thể hiểu được đối tượng đó làm gì.

Tính chất này được thể hiện qua việc sử dụng interface hoặc abstract class.

Lưu ý: Câu thần chú Abstraction - Ẩn chi tiết, thể hiện tổng quan.

Ví dụ: khi thực hiện hành động thanh toán sẽ có có nhiều bước và nghiệp vụ bên trong hành động này. Bằng cách chia tách nhỏ nghiệp vụ thành từng phương thức và sử dụng interface ta có thể dể dàng hiểu được tổng quan những bước, những hành động khi thanh toán. Mà không cần đi vào chi tiết mỗi hành động làm gì.

//C# code
//Checkout:
public Interface Checkout
{
//Chỉ hiển thị tên phương thức, tham số, kiểu trả về
//không thể hiện cách thực hiện chi tiết, logic nghiệp vụ bên trong
	Bool ValidateAccount(object BankAccount); 
	Decimal CaculateTotalPrice(object BankAccount);
	int Checkout(object BankAccount));
}

8. Hàm khởi tạo (constructor)

  • Constructor là một phương thức đặc biệt được gọi tự động tại thời điểm đối tượng được tạo ra.

  • Mục đích của hàm xây dựng dùng để khởi tạo dữ liệu cho dữ liệu thành viên.

  • Constructor phải trùng tên với tên lớp và không có kiểu trả về kể cả kiểu void.

class Developer
{
    public string Name {get;set;}

    public Developer(string name)
    {
        this.name = name;
    }

    public Developer()
    {
        this.Name = "Default Name";
    }
}

var developer = new Developer("Long");
var developer2 = new Developer();

9. Hàm hủy (Destructor)

  • Phương thức hủy dùng để hủy đối tượng khi không xài nữa. Trong .NET sẽ có Garbage collection giúp làm việc dọn dẹp này nên ta không cần implement phương thức này.
  1. Bài tập về nhà:

Phần mềm quản lý nhân viên gồm 3 loại nhân viên (Experience, Fresher, Intern)

  • Xây dựng lớp nhân viên gồm các thuộc tính: Mã nhân viên, họ, tên , tuổi, số điện thoại, email.

  • Xây dựng lớp nhân viên Experience gồm các thuộc tính kế thừa từ lớp nhân viên và bổ sung thêm thuộc tính: số năm kinh nghiệm, kỹ năng chuyên môn.

  • Xây dựng lớp nhân viên Fresher gồm các thuộc tính kế thừa từ lớp nhân viên và bổ sung thêm thuộc tính: thời gian tốt nghiệp, loại tốt nghiệp và trường tốt nghiệp.

  • Xây dựng lớp nhân viên Intern gồm các thuộc tính kế thừa từ lớp nhân viên và bổ sung thêm thuộc tính: chuyên nghành đang học, học kỳ, tên trường đang học. Có các chức năng:

  • Lấy ra tên của nhân viên.

  • Lấy ra thông tin của nhân viên. Sẽ được bổ sung các thuộc tính tùy theo loại nhân viên.

  • Chức năng gửi mail cho nhân viên. (tương tự project mẫu)

Tổng kết: Qua bài này chúng ta đã cùng nhau tìm hiểu cơ bản về lập trình hướng đối tượng, các tính chất và ví dụ code demo. Lý thuyết lập trình OOP đều giống nhau nhưng tùy vào kinh nghiệm, tư duy mà mỗi lập trình viên sẽ có cách hiểu, cách triển khai khác nhau. Hy vọng bài viết này sẽ giúp ích cho những bạn mới tiếp cận lập trình hướng đối tượng OOP.

Nếu có câu hỏi hay vấn đề muốn thảo luận trao đổi thì hãy comment dưới bài viết nhé. Hy vọng được thảo luận cùng anh em.

Nếu thấy bài viết hay và bổ ích thì cho mình xin 1 tym nhé. Cảm ơn và chúc các anh em một ngày cuối tuần tuyệt vời!


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.