Để lập trình hướng đối tượng đạt hiệu quả cao, các lập trình viên cần nắm bắt 5 nguyên tắc mang tên S.O.L.I.D. Bài viết sau tổng hợp ngắn gọn cách thức áp dụng cơ bản trong thực tế.

SOLID là gì?

Đây là đầu chữ cái của 5 từ với các ý nghĩa như sau:

SChuyên trách một vấn đề
OĐóng – mở
LThay thế
IPhân tách giao diện
DĐảo ngược phụ thuộc
Dịch nghĩa của 5 chữ cái trong SOLID

Vậy nó có ý nghĩa gì và cách áp dụng vào thực tế ra sao? Hãy cùng Code Tốt đi qua mô hình một dự án cần triển khai nhé.

Nguyên tắc số 1: Chuyên trách một vấn đề

Hãy lấy ví dụ, tôi có một tình huống là cần triển khai API cho một dự án, chẳng hạn như tích hợp chức năng Event vào website từ EventBrite bằng PHP.

Dưới đây là một đoạn class tôi dự định viết:

<?php
namespace CodeTot\API;

class Eventbrite {
  var $api_endpoint = "https://www.eventbrite.com/json/";
  var $auth_tokens;
  var $api_url;

  function __construct( $tokens = null, $user = null, $password = null ) {
    $this->api_url = parse_url($this->api_endpoint);
  }
}

Mọi chuyện đầu tiên đơn giản như 1 class PHP mà ta hay thấy.

Giờ hãy tới bước thiết lập một quy trình để xử lý token và authorize cho class này khi được khởi tạo.

Code này lấy từ 1 source trên mạng:

<?php
// Viết tiếp từ code ở bước trên.
function __construct( $tokens = null, $user = null, $password = null ) {
        $this->api_url = parse_url($this->api_endpoint);
        $this->auth_tokens = array();
        if(is_array($tokens)){
            if(array_key_exists('access_code', $tokens)){
                $this->auth_tokens = $this->oauth_handshake( $tokens );
            }else{
                $this->auth_tokens = $tokens;
            }
        }else{
            $this->auth_tokens['app_key'] = $tokens;
            if( $password ){
                $this->auth_tokens['user'] = $user;
                $this->auth_tokens['password'] = $password;
            }
            else {
              $this->auth_tokens['user_key'] = $user;
            }
        }
    }
?>

Bạn thấy không, đã có vấn đề. Việc liên tục kiểm tra điều kiện và set giá trị cho token qua nhiều phần, trở nên khó đọc hơn. Developer này thực lòng đang cản trở quá trình triển khai theo nguyên tắc SOLID.

Vậy làm thế nào thì được coi là đúng đắn? Hãy cùng thử một đoạn code EventBrite API nhưng do một lập trình viên khác:

<?php
public function __construct($client_secret, $client_id, $access_token = NULL) {
    $this->setEndpoint(self::API_ENDPOINT);
    $this->setClientSecret($client_secret);
    $this->setClientId($client_id);
    $this->setAccessToken($access_token);
    $this->httpClient = new Client();
  }

?>

Bạn thấy điều gì khác? Tổng cộng là 5 line, và chỉ cần nhìn tên function là biết nó có chức năng là gì.

Thử inspect một function bên trong:

/**
   * Set endpoint.
   *
   * @param string $endpoint
   *   Api endpoint.
   */
  public function setEndpoint($endpoint) {
    $this->endpoint = $endpoint;
  }

Nó làm đúng một việc, và chỉ làm đúng việc đó.

Như vậy, lập trình viên này đã tuân thủ đúng nguyên tắc S – tức một function bản thân chỉ xử lý một vấn đề, giúp đảm bảo logic code hoạt động và dễ đọc.

Tham khảo code

Nếu các bạn quan tâm, có thể tham khảo các code trên ở đây:

(còn tiếp về các nguyên lý khác)

Author

Khôi là Founder của CODE TOT JSC., công ty chuyên cung cấp dịch vụ website đa tính năng dành cho doanh nghiệp.

Write A Comment