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
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)publicclassDeveloper{private string Name {get;set;}publicvoidAnalyzeRequirement(){//Do something}publicvoidWriteCode(){//Do something}publicvoidDeploy(){//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)
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)publicclassBankAccount{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)
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)classVehicle// base class (parent) {public string brand ="Ford";// Vehicle fieldpublicvoidhonk()// Vehicle method {
Console.WriteLine("Tuut, tuut!");}}classCar: Vehicle // derived class (child){public string modelName ="Mustang";// Car field}classProgram{staticvoidMain(string[] args){// Create a myCar object
Car myCar =newCar();// 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)publicclassBankAccount(){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)publicclassBankAccount//Base class{public decimal GetTotalPrice(){//To do something}}publicclassCreditCard: BankAccount
{public decimal GetTotalPrice(){//To do something}}publicclassDebitCard: BankAccount
{public decimal GetTotalPrice(){//To do something}}publicclassProgram{publicstaticvoidMain(string[] args){
BankAccount bank =newCreditCard();
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));}
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!
Nguồn: viblo.asia