Helpex - Trao đổi & giúp đỡ Đăng nhập

Các mẫu PHP thực tế: Mô-đun bảng

Mẫu Mô-đun Bảng được triển khai bằng cách mã hóa một lớp đóng gói tất cả các tương tác với bảng cơ sở dữ liệu. Việc sử dụng một lớp như vậy có thể giống như đơn lẻ hoặc nhiều trường hợp có thể được tạo để thực hiện các hoạt động trên các tập hợp con của bảng gốc.

Cho rằng mối quan hệ giữa Mô-đun bảng và bảng là biunivocal, thường các Mô-đun bảng khác nhau có thể được phối hợp từ mã máy khách hoặc từ lớp trên. Mẫu này cũng có thể được áp dụng cho các khung nhìn hoặc truy vấn, vì cả hai đều là các bảng ảo và tạo ra một bộ bản ghi có thể được chuyển đến Mô-đun Bảng.

Giai đoạn mô hình hóa

Trong mô hình hóa này, không có các đối tượng duy nhất cho các hàng của bảng, giống như trong các mẫu khác như Active Record hoặc Row Data Gateway. Mô-đun bảng đóng gói tất cả logic nghiệp vụ theo cách tiếp cận tập trung vào cơ sở dữ liệu và chữ ký phương thức của nó sử dụng các giá trị nguyên thủy cho các tham số và kiểu trả về hoặc tại hầu hết các thùng chứa dữ liệu như Đối tượng giá trị.

Mô-đun bảng tổng hợp một bộ bản ghi hoặc kết nối cơ sở dữ liệu. Tuy nhiên, khi sử dụng một đối tượng kết nối, nó kém linh hoạt hơn (các truy vấn để tạo các bảng ảo không thể được thuê ngoài để duy trì tính trực giao) và có thể vượt qua ranh giới của một mẫu khác, Cổng dữ liệu bảng. Càng phụ thuộc càng nhiều, dữ liệu bảng có thể được lọc hoặc thay đổi càng nhiều trước khi Mô-đun bảng nhận được tập hợp các hàng, tăng cường khả năng sử dụng lại của lớp.

Ưu và nhược điểm

Mô-đun bảng liên kết mã máy khách với các thực thể có trong cơ sở dữ liệu quan hệ (mặc dù điều này đúng theo một cách nào đó đối với nhiều mẫu được định hướng cho tương tác cơ sở dữ liệu.) Tuy nhiên, đó là một mẫu cố gắng giữ dữ liệu với hành vi liên quan của nó và bọc cơ sở hạ tầng bên ngoài như cơ sở dữ liệu trong một cái gì đó có thể được thay thế trong thử nghiệm hoặc trong các môi trường khác. Vẫn thông minh hơn so với phân tán truy vấn trong nhiều tập lệnh php khác nhau.

Lý tưởng nhất là SQL không cần thiết để sử dụng Mô-đun Bảng theo quan điểm của khách hàng: nó được thuê ngoài vào các lớp khác tạo ra một bản ghi mà Mô-đun Bảng kiểm tra hoặc được đóng gói bởi chính Mô-đun Bảng; mẫu này là một dạng Kho lưu trữ đơn giản, vẫn tuân thủ các cấu trúc dữ liệu được xác định bởi cơ sở dữ liệu. Sự khác biệt chính là sự vắng mặt của một lớp thực thể cơ bản, vì vậy chúng ta không thể nói về quyền truy cập vào bộ sưu tập các đối tượng trong bộ nhớ; mặc dù, nó là một hình thức đóng gói mạnh hơn trong một số trường hợp nhất định, bởi vì một lớp thực thể cho một hàng có thể không cần thiết cũng như không có logic nào.

Mẫu này cũng đơn giản hơn nhiều so với Mô hình miền một: không có bản dịch dữ liệu giữa các đối tượng và hàng. Việc thiếu ánh xạ có thể là một bất lợi - khớp với lược đồ - nhưng cũng là một lợi thế về tốc độ thực hiện, đặc biệt nếu bạn muốn giao diện với cơ sở dữ liệu để có khả năng tương tác. Không phải tất cả các ứng dụng web đều cần Mô hình miền: một số là mã keo, một số là giao diện cho các hệ thống phần mềm khác. Trong thực tế, thời gian để thực hiện một mô hình phức tạp và ánh xạ của nó có thể bị cấm đối với một ứng dụng vứt bỏ hoặc thậm chí cho một dự án nhỏ hoặc vừa không vượt qua ngưỡng phức tạp.

Xin lưu ý rằng nếu bạn đã đóng gói các tính toán lớn trên dữ liệu, bạn có thể muốn đẩy logic liên quan trong cơ sở dữ liệu để có hiệu suất tốt hơn, xác định nó bằng các truy vấn SQL. Điều này được thực hiện với một mẫu khác, Cổng dữ liệu bảng, nhưng có thể khó hơn và nặng hơn để kiểm tra hiệu quả trong các bộ kiểm tra tự động. Về cơ bản, nếu bạn sử dụng SQL, bạn sẽ bị ràng buộc để tạo cơ sở dữ liệu và kết nối bất cứ khi nào bạn muốn kiểm tra logic nghiệp vụ của mình và ngay cả khi bạn chuyển một đối tượng PDO hoặc một sự trừu tượng hóa khác cho mô-đun bảng, nhẹ hơn (đọc dễ dàng hơn để sử dụng trong các bài kiểm tra ) cơ sở dữ liệu như Sqlite có thể không hỗ trợ tất cả các tính năng bạn sử dụng trong các truy vấn SQL của mình. Thêm vào đó là quá trình này nên được thực hiện cho mỗi thử nghiệm đơn lẻ để thúc đẩy sự cô lập của chúng và bạn sẽ có được hình ảnh.

Mẫu

Thật hợp lý khi thực hiện mẫu này khi toàn bộ dữ liệu bảng có ý nghĩa hơn một hàng đơn. Do đó, bảng có thể không chứa các thực thể nhưng có khả năng lưu trữ các giá trị hoặc liên kết các thực thể. Trong thực tế, mã mẫu liên quan đến một ví dụ trong đó toàn bộ dữ liệu được xử lý: một bảng chứa dữ liệu phân tích, chẳng hạn như trình duyệt và độ phân giải sử dụng đã truy cập trang web.

<?php
/**
 * Provide statistics on the unique visitors data. 
 * Implementation of a Table Module.
 */
class StatisticsModule
{
    /**
     * These rows can be the result of any query that conforms to the 
     * schema defined by this Table Module. The real table may not even
     * exist, being substituted by views or a set of queries.
     */
    public function __construct(array $rows)
    {
        $this->_rows = $rows;
    }

    public function getMostPopularBrowser()
    {
        $browsers = array();
        foreach ($this->_rows as $row) {
            if (!isset($browsers[$row['browser']])) {
                $browsers[$row['browser']] = 0;
            }
            $browsers[$row['browser']]++;
        }
        arsort($browsers);
        reset($browsers);
        return current(array_keys($browsers));
    }

    /**
     * @param float $margin minimum percentual for considering a
     *                      resolution used by visitors
     */
    public function isResolutionUsed($resolution, $margin = 0.1)
    {
        $visitors = 0;
        foreach ($this->_rows as $row) {
            if ($row['resolution'] == $resolution) {
                $visitors++;
            }
        }
        return $visitors / count($this->_rows) > $margin;
    }
}

function create_row($browser, $resolution, $page)
{
    return array(
        'browser' => $browser,
        'resolution' => $resolution,
        'page' => $page
    );
}

// array is used for simplicity of stubbing here
// a RecordSet implementation will be more performant
$recordSet = array(
    create_row('MSIE', '1024x768', '/'),
    create_row('MSIE', '640x480', '/members'),
    create_row('MSIE', '1024x768', '/'),
    create_row('Firefox', '1280x1024', '/'),
    create_row('MSIE', '1024x768', '/'),
    create_row('Firefox', '1024x768', '/'),
    create_row('Firefox', '1024x768', '/'),
    create_row('Firefox', '1300x768', '/members'),
    create_row('Safari', '800x600', '/'),
    create_row('MSIE', '1024x768', '/members'),
    create_row('MSIE', '1024x768', '/members'),
    create_row('Chrome', '1024x768', '/members'),
    create_row('Chrome', '1280x1024', '/contacts'),
    create_row('Firefox', '1280x1024', '/'),
    create_row('MSIE', '124x768', '/about'),
);

// client code
$statisticsModule = new StatisticsModule($recordSet);
echo $statisticsModule->getMostPopularBrowser(), "\n";
var_dump($statisticsModule->isResolutionUsed('1024x768'));
var_dump($statisticsModule->isResolutionUsed('640x480'));

7 hữu ích 0 bình luận 9.9k xem chia sẻ

Có thể bạn quan tâm

loading