Lập trình hướng đối tượng, khó hiểu hay do mình không hiểu

    Bạn đang học lập trình, bạn đang tìm hiểu về  lập trình hướng đối tượng, bạn cảm thấy nó quá khó, bạn thấy thật mệt mỏi, chán nản, suy nghĩ rằng mình sắp rớt môn rồi, huhu. Không sao, mình sẽ chia sẻ cho bạn về hướng đối tượng từ một người từng rớt môn hướng đối tượng. Lets go...

OOP


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

    Thật ra khi bạn tra trên mạng sẽ ra đầy đủ định nghĩa về nó nhưng bạn cứ hiểu nó là một kĩ thuật lập trình, bằng cách tổ chức, xây dựng code thành các đối tượng (object). Chúng ta sẽ đưa các đối tượng ở thực tế vào trong code và biểu hiện chúng thông qua lớp (class).

2. Vậy tại sao cần nên lập trình theo hướng đối tượng?

     Nếu trong một team có 4 đến 5 thành viên, mỗi người mỗi style coding, ông A thì tạo ra 1 cái hàm tạo ra con chó husky ngáo, ông B cũng dô xài cái hàm tạo con chó đó nhưng không vừa ý vì muốn con chó phải becgie trông cho nó lực. Thế là dô sửa cái hàm tạo con chó đó, xong ông A biết được nên hẹn ông B ra đấm nhau để giải quyết vấn đề.

    Đó là câu chuyện mình bịa ra thôi chứ thực chất không có đâu. Tóm lại nếu bạn code theo hướng đối tượng sẽ giúp cho code của bạn có hệ thống hơn, người khác có thể dễ dàng đọc source code, giúp cho việc phát triển, mở rộng phần mềm dễ dàng hơn.

    Khi bạn áp dụng hướng đối tượng sẽ giúp bạn:

    • Mô hình hóa những thứ phức tạp dưới dạng cấu trúc đơn giản để dễ dàng quản lý.
    • Code có thể tái sử dụng lại, giúp tiết kiệm tài nguyên và thời gian.
    • Giúp dễ dàng debug và sửa lỗi dễ dàng hơn. So với việc tìm lỗi ở nhiều vị trí trong code thì tìm lỗi trong các class (được cấu trúc từ trước) đơn giản và ít mất thời gian hơn.
    • Có tính bảo mật cao, bảo vệ thông tin quan trọng thông qua đóng gói.
    • Dễ dàng mở rộng dự án.

3. Lớp và đối tượng trong OOP:

    Như mình đã nói ở trên, một đối tượng sẽ được thể hiện trừu tượng bằng một class, trong mỗi class sẽ có 2 thành phần chính là property và method

  • Thuộc tính (property): là những thông tin về đặc điểm của đối tượng
  • Phương thức (method): là những hành động mà đối tượng có thể thực hiện.
    Khi bạn khởi tạo class thông qua thuôc tính new ClassName() thì nó đựợc gọi object

4. Các tính chất trong OOP:

    4.1 Tính đóng gói (Encapsultion):

    Bạn có thể thấy các thuộc tính hay phương thức có chứa các từ như: public, protected, private. Đây là các cách mà OOP quy định phạm vi truy cập (access modifier) cho một property hay một method trong một class.

  • Public: Bất kì ai cũng có thể truy cập đến được.
  • Protected: Những class kế thừa (sử dụng extends) mới được truy cập

  • Private: Chỉ truy cập nội bộ trong một class.

    Ví dụ bạn có một class trong đó có các thuộc tính và method mà bạn chỉ muốn sử dụng nội bộ trong class, bên ngoài không thể get hoặc set lại giá trị cho property hay method không được phép gọi từ bên ngoài class thì bạn có thể sử dụng private hoặc chỉ lớp kế thừa mới có thể tương tác với thuộc tính thì sẽ là protected, còn nếu public thì bất kì ai cũng có thể thao tác được với property và method đó.

<?php
class Fruit {
  public $name;
  public $color;
  public $weight;

  function set_name($n) {  // a public function (default)
    $this->name = $n;
  }
  protected function set_color($n) { // a protected function
    $this->color = $n;
  }
  private function set_weight($n) { // a private function
    $this->weight = $n;
  }
}

$mango = new Fruit();
$mango->set_name('Mango'); // OK
$mango->set_color('Yellow'); // ERROR
$mango->set_weight('300'); // ERROR
?>

    4.2 Tính kế thừa (Extends)

     Tính chất này mình nghĩ là dễ hiểu nhất trong các tính chất, nó liên quan đến việc kế thừa (extends) các property và method ở parent class, với mục đính tái sử dụng code

<?php
class Fruit {
  public $name;
  public $color;
  public function __construct($name, $color) {
    $this->name = $name;
    $this->color = $color;
  }
  public function intro() {
    echo "The fruit is {$this->name} and the color is {$this->color}.";
  }
}

// Strawberry is inherited from Fruit
class Strawberry extends Fruit {
  public function message() {
    echo "Am I a fruit or a berry? ";
  }
}
$strawberry = new Strawberry("Strawberry""red");
$strawberry->message();
$strawberry->intro();
?>

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

       Trừu tượng có nghĩ là tổng quát hóa một cái gì đó lên, không cần chú ý chi tiết bên trong. Nó không màng đến chi tiết bên trong là gì và người ta vẫn hiểu nó mỗi khi nghe về nó.

     Có thể nói đây là tính chất khó hiểu nhất trong OOP,  chúng được thể hiện thông qua interface và abstract class. Bạn có thể hiểu rằng việc chúng ta nên trừu tượng một class và những thứ bên trong nó để khi nhìn vào thì có thể biết được class đó là gì và thực hiện được những việc nào. Theo mình đây là một tính chất khá quan trọng trong việc tổ chức và xây dựng code trong OOP. Tính chất này cũng được đề cập trong nguyên tắc D trong SOLID.

    4.3 Tính đa hình (Polymorphism)

    Tính đa hình (Polymorphism) mỗi hành động có thể được thực hiện theo nhiều cách khác nhau bởi các đối tượng.

    Ví dụ như hành động gắp thức ăn, người Việt Nam có thể dùng đũa, người Ấn dùng tay và người Mỹ thì dùng nĩa, bản chất đều là hành động gắp thức ăn nhưng lại thực hiện bằng nhiều cách khác nhau. Ở đây hành động gắp thức ăn thể hiện tính chất abstraction (trừu tượng hóa) và những implementation bằng nĩa, đũa... Là các thể hiện cho tính chất Polymorphism
 Tính chất này cũng có thể kết hợp với kế thừa. Khi chúng ta extends và có thể override lại các property và method.

5. Tóm lại:

     OOP thật sự sẽ rất khó hiểu nếu mới bắt đầu, và thật sự cần nhiều thời gian để tìm hiểu và thực hành. Đến một lúc nào đó bạn sẽ hiểu nó. Hy vọng qua bài viết có thể gíup bạn hiểu hơn về OOP!!!

Bài đăng phổ biến từ blog này

Singleton design pattern

Generics trong PHP