0

OOP là gì? 4 nguyên tắc vàng trong lập trình hướng đối tượng

Mở đầu

  • Việc học các khái niệm cơ bản và bắt tay vào viết các đoạn mã đầu tiên là quá trình để chúng ta quen dần với một ngôn ngữ mới.
  • Tuy nhiên, khi bắt đầu bước vào một dự án thực tế thì không chỉ đơn thuần là việc viết code nữa! Mỗi source code trong dự án đều có cấu trúc vô cùng to lớn và phục vụ cho các nghiệp vụ thực tế trong đời sống.
  • Để cấu trúc dự án trở nên rõ ràng, dễ mở rộng thì các lập trình viên đi trước sau nhiều năm kinh nghiệm thực chiến đã đúc kết ra các mẫu hình lập trình (programming paradigm) - như là khung sườn mẫu cho các dự án, để các lập trình viên sau này có thể tuân thủ theo và dễ dàng phát triển hơn.
  • Trong đó, lập trình hướng đối tượng cũng là một trong những mẫu hình này và được sử dụng rộng rãi, phổ biến trong các dự án ngày nay!

OOP là gì?

  • OOP - object-oriented programming là một mẫu hình lập trình lấy các đối tượng - object làm trung tâm để từ đó thiết kế và xây dựng phần mềm.

Các thành phần chính

  • Trong lập trình hướng đối tượng chúng ta sẽ có những thành phần chính sau:
Thành phần Mô tả
Class (Lớp) là đơn vị cơ bản nhất dùng để mô tả về một sự vật, sự việc trong đời sống thực tế.
Object (Đối tượng) là một thể hiện của Class (Class là bản thiết kế mẫu để tạo nên Object).
Attributes/Properties (Thuộc tính) là một tập hợp các biến kèm kiểu dữ liệu để mô tả về tính chất của đối tượng.
Methods (phương phức) là một tập hợp các phương thức dùng để mô tả hành vi của đối tượng.
Csharp

// lớp xe
class Car {
    public string Name { get; set; } // thuộc tính tên gọi của đối tượng xe
    public string Color { get;set; } // thuộc tính màu sắc của đối tượng xe
    
    // phương thức khởi tạo đối tượng xe
    public Car(string name, string color) {
        Name = name;
        Color = color;
    }
    
    // phương thức Run mô tả hành động chạy xe
    void Run() {
        Console.WriteLine($"{Name} is running!");
    }
}

// đối tượng xe Audi màu xanh
var audi = new Car("Audi", "Blue");
// đối tượng xe BMW màu vàng
var bmw = new Car("BMW", "Yellow");

Các tính chất của OOP

  • Lập trình hướng đối tượng có 4 tính chất cốt lõi sau:

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

  • Tính trừu tượng - abstraction là tập trung vào việc cung cấp các thông tin cần thiết về đối tượng, che giấu đi quá trình triển khai bên trong về các thông tin đó.
Csharp

// lớp trừu tượng xe
public astract class Car {
    public string Name { get; set; } // thuộc tính tên gọi của đối tượng xe

    public astract void HornSound(); // phương thức trừu tượng mô tả tiếng còi đã che giấu đi cách triển khai
    
    // phương thức thông thường mô tả hành động xe chạy 
    public void Run() {
        Console.WriteLine($"{Name} is running!");
    }; 
}

Tính kế thừa (inheritance)

  • Tính kế thừa - inheritance là khả năng cho phép đối tượng có được các tính chất tương đồng với một đối tượng khác. Và mở rộng thêm các tính chất mới đặt trưng của đối tượng.
 Csharp
 
 // lớp xe điện kế thừa từ lớp xe
 public class ElectricCar: Car {
    // kế thừa phương thức HornSound từ lớp xe và triển khai chi tiết về tiếng còi xe điện
     public override void HornSound() {
         Console.WriteLine("Electric car horn sound");
     }
     
     // thuộc tính loại cổng sạc riêng biệt của lớp xe điện
     public string ChargePortType { get;set; }
 }
 
 // lớp xe điện có các tính chất của lớp xe
 var electricCar = new ElectricCar();
 electricCar.Name = "Tesla"; // kế thừa thuộc tính tên từ lớp xe
 electricCar.Run(); // thực thi phương thức kế thừa Run từ lớp xe
 electricCar.HornSound(); // thực thi phương thức HornSound của lớp xe điện

Tính đóng gói (encapsulation)

  • Tính đóng gói - encapsulation là tính chất cho phép ẩn đi các thông tin nội bộ của đối tượng, chỉ cho phép truy cập từ các phương thức công khai.
  Csharp
  
  // lớp điện thoại
  public class Phone {
      private string Password = "this is your phone password" // mật khẩu hiện tại của đối tượng điện thoại đã được che giấu
      
      public void CreateNewPassWord(string oldPassWord, string newPassWord) {
          if (oldPassWord != Password) return; // nếu không nhập đúng mật khẩu cũ sẽ không đổi được mật khẩu mới
          Password = newPassWord;
      }
      
      public void UnLock(string password) {
          if (passWord != Password) {
              Console.WriteLine("Your password is not correct !!!"); // nếu không nhập đúng mật khẩu sẽ báo lỗi sai mật khẩu
          }
          
          Console.WriteLine("Your phone is unlocked !!!"); nếu nhập đúng mật khẩu sẽ mở khóa điện thoại thành công
      }
  }
  
  // thuộc tính Password đã được che giấu và chỉ có thể được truy xuất, thay đổi giá trị từ các phương thức công khai là: CreateNewPassWord, UnLock
  var phone = new Phone();
  phone.CreateNewPassWord("this is your phone password", "my iphone password");
  phone.UnLock("my iphone password");

Tính đa hình (polymorphism)

  • Tính đa hình - polymorphism là khả năng cho phép một phương thức có nhiều cách thể hiện ứng với từng đối tượng khác nhau.
Csharp

// lớp trừu tượng hình
public astract class Shape {
    public astract float CalculateArea(); // phương thức trừa tượng tính diện tích của hình
}

// lớp hình chữ nhật kế thừa từ lớp hình
public class Rectangle : Shape {
    private int Length { get; set; }
    private int Width { get; set; }
    public override float CalculateArea() {
        return Length * Width // triển khai tính diện tích hình chữ nhật
    }
}

// lớp hình tròn kế thừa từ lớp hình
public class Circle : Shape {
    private int Radius { get; set; }
    public override float CalculateArea() {
        return Radius * Radius * Math.PI // triển khai tính diện tích hình tròn
    }
}

// phương thức CalculateArea đã được triển khai thành 2 cách thể hiện khác nhau trong lớp Rectangle và lớp Circle

Lợi ích của OOP

Giúp code dễ dàng mở rộng, bảo trì:

  • Tính chất kế thừa giúp dễ dàng thêm vào các thuộc tính mới cho đối tượng, không gây ảnh hưởng đến mã nguồn cũ có sẵn.
  • Tính chất trừu tượng giảm bớt việc triển khai về chi tiết các tính chất đối tượng giúp dễ dàng tìm kiếm, sửa lỗi hơn.

Giúp code trở nên linh hoạt hơn:

  • Tính đa hình giúp việc triển khai phương thức một cách đa dạng nhưng không thay đổi bản chất của phương thức.

Giúp bảo mật mã nguồn:

  • Tính đóng gói ẩn đi những thông tin quan trọng của đối tượng, tập trung vào việc truy xuất các dữ liệu cần thiết giúp bảo vệ các thông tin nhạy cảm, mà vẫn đảm bảo được luồng hoạt động của mã nguồn.

Giúp tránh viết code dư thừa:

  • Tính kế thừa tái sử dụng được những tính chất có sẵn từ đối tượng khác giúp tránh viết lập lại code dư thừa, giảm thiểu tài nguyên và thời gian xây dựng phần mềm.

Kết luận

  • OOP là một mẫu hình lập trình phổ biến và vô cùng quan trọng mà mọi lập trình viên cần phải nắm vững.
  • Tư duy theo hướng OOP giúp chúng ta nâng cao khả năng viết code, hiệu suất làm việc, giúp việc triển khai các tính năng từ đời sống thực tế sang mô hình lập trình một cách tường minh, dễ dàng hơn 😎.

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí