Duy trì OO và Testable khi làm việc với cơ sở dữ liệu


16

Một số chiến lược OOP để làm việc với cơ sở dữ liệu nhưng giữ cho mọi thứ có thể kiểm tra được là gì? Giả sử tôi có lớp Người dùng và môi trường sản xuất của tôi hoạt động chống lại MySQL. Tôi thấy một vài cách tiếp cận có thể, được hiển thị ở đây bằng PHP:

  1. Truyền vào $ data_source với các giao diện cho load()save(), để trừu tượng hóa nguồn dữ liệu phụ trợ. Khi kiểm tra, vượt qua một cửa hàng dữ liệu khác nhau.

    $ user = Người dùng mới ($ mysql_data_source);
    $ user-> tải ('bob');
    $ user-> setNickname ('Robby');
    $ người dùng-> lưu ();
    
  2. Sử dụng một nhà máy truy cập cơ sở dữ liệu và chuyển hàng kết quả cho hàm tạo của Người dùng. Khi kiểm tra, hãy tạo thủ công tham số $ row hoặc giả định đối tượng trong UserFactory :: $ data_source. (Làm thế nào tôi có thể lưu các thay đổi vào hồ sơ?)

    class UserFactory {
        static $data_source;
    
        public static function fetch( $username ) {
            $row = self::$data_source->get( [params] );
    
            $user = new User( $row );
            return $user;
        }
    }
    

Tôi có Mẫu thiết kếMã sạch ở đây bên cạnh, nhưng tôi đang loay hoay tìm các khái niệm áp dụng.


Câu trả lời:


11

Vì vậy, những gì bạn muốn chọn là Mô hình kiến ​​trúc ứng dụng doanh nghiệp của Martin Fowlers (Ông cũng cung cấp một danh mục trên trang web của mình ở đây ).

Trong đó, ông mô tả một số mẫu để truy cập dữ liệu trừu tượng. Cách tiếp cận đầu tiên bạn mô tả là Active Record . Cách tiếp cận thứ hai của bạn tương tự như Cổng dữ liệu bảng .

Một cách tiếp cận thậm chí tốt hơn là sử dụng O / RM để loại bỏ nhu cầu viết mã truy cập dữ liệu bằng tay. Tôi chưa sử dụng PHP vì chúng tôi lo lắng về Y2K, nhưng wikipedia có một danh sách các tùy chọn cho bạn . Tôi không biết liệu họ có tốt không. Tuy nhiên, tôi có thể cho bạn biết một số điều cần tìm trong O / RM:

  • Sự thiếu hiểu biết dai dẳng : O / RM không nên buộc các đối tượng kinh doanh của bạn xuất phát từ một giao diện / lớp cụ thể để tham gia vào chiến lược truy cập dữ liệu.
  • Ánh xạ quan hệ : Bạn sẽ có thể ánh xạ mối quan hệ giữa các đối tượng của mình (khách hàng có đơn hàng, đơn hàng có chi tiết đơn hàng, chi tiết đơn hàng có sản phẩm, v.v.)
  • Ánh xạ chữ tượng hình : Bạn sẽ có thể ánh xạ các chữ tượng hình lớp vào cơ sở dữ liệu.
  • Cú pháp truy vấn / Tiêu chí hỗ trợ : Bạn sẽ có thể tạo một truy vấn trong thời gian chạy theo các Đối tượng của bạn không theo cơ sở dữ liệu và O / RM sẽ dịch và chạy truy vấn trên cơ sở dữ liệu. Điểm bổ sung nếu truy vấn là một chuỗi được gõ mạnh thay vì chuỗi.

Có những yếu tố khác để xem xét, nhưng đó là một số trong những yếu tố quan trọng nhất. Hi vọng điêu nay co ich.


6

IMHO nó phụ thuộc vào những gì bạn muốn kiểm tra, nếu bạn muốn kiểm tra logic kinh doanh của mình, bạn nên khai thác / giả ( Martin Fowler ) bạn truy cập dữ liệu để đề xuất đầu tiên của bạn là khởi đầu tốt đẹp. Câu hỏi stackoverflow này đưa ra một ví dụ C # hay (tôi đã cố gắng tìm một số mẫu PHP nhưng không thể tìm thấy).

Nếu bạn muốn tự kiểm tra quyền truy cập dữ liệu thì không được gọi là kiểm tra đơn vị nữa mà là kiểm tra tích hợp. Đọc ở đây để có một số hướng dẫn chung, câu hỏi stackoverflow này cũng có một số liên kết thú vị.

Nếu bạn muốn kiểm tra logic thủ tục được lưu trữ trong cơ sở dữ liệu của mình, hãy xem xUnit TestPotype

Hi vọng điêu nay co ich


2

Đây không hẳn là một câu trả lời hữu ích ngay lập tức, nhưng nếu bạn thực sự lo lắng về khả năng kiểm tra cơ sở dữ liệu, bạn nên xem xét cách nó được thực hiện trong Ruby on Rails. Theo tôi biết, không ai bao quát chủ đề tốt hơn hay trực giác hơn.


2
Ruby on Rails thực hiện mẫu Active Record theo mặc định. Cũng có thể cung cấp một liên kết: en.wikipedia.org/wiki/Active_record_potype
Spoike

0

Tôi khuyên bạn nên kiểm tra giải pháp Symfony Framework cho loại vấn đề này. Symfony là một khung OO php với các bài kiểm tra chức năng.

Đây là một liên kết , họ đã sử dụng một cái gì đó giống như những gì bạn đang nghĩ về.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.