Sử dụng design pattern Singleton , một vài vấn đề nhỏ !!!
TIL
594
White

jackiewu viết ngày 03/11/2016

Sử dụng design pattern Singleton , một vài vấn đề nhỏ !!!

Sau một thời gian chạy , thì việc truy xuất database bắt đầu chậm và có vấn đề . Sau một thời gian research Google các kiểu thì mình tìm thấy mô hình Replicate của MySQL có thể giải quyết bài toán của mình .

Sau khi cài đặt Replicate cho MySQL xong thì mình bắt đầu bắt tay vào refactory code vì Replicate trong MySQL sử dụng 2 connection cho việc Read và Write data.

Lúc trước mình đã áp dụng Singleton cho việc thiết kế class Database nhằm mục đích chỉ tạo ra 1 object connection nhằm tối ưu cho hệ thống.

Đây là đoạn code trước khi refactory:

class Database extends PDO
{
    // A static variable to hold our single instance
    private static $_instance = null;
    private $_dsn = "";
    private $_user = "";
    private $_password = '"";

    // Make the constuctor private to ensure singleton
    private function __construct()
    {
        // Call the PDO constructor
        parent::__construct($this->_dsn, $this->_user, $this->_password);
    }

    public function getInstance()
    {
        if (!self::$_instance instanceof Database) {
            self::$_instance = new self();
        }

        return self::$_instance;
    }

OK , để giải quyết bài toán này , việc đầu tiên mình nghĩ sẽ apply để giải quyết đó chính là sẽ tạo 1 abstract class AbstractDatabase rổi các class con sẽ kế thừa class abstract này là xong.

Khoan hình như có gì đó sai sai thì phải ??? Thì ra vấn đề là ở property $_instance , bởi vì nó đang được khai báo là private nên nếu khai báo ở abstract class parent thì sẽ không dùng được.

Sau một hồi vò đầu bức tóc thì mình thấy một bài viết về Trait . Thật là vi diệu , sau khi đọc xong thì mình thấy giải pháp là đây. Trait là một dạng giống như class dùng để tập các method common mà không phải dùng đến kỹ thuật extends parent class.

Nghĩ là làm ngay mình đã tiến hành refactory code của minh lại như sau:

trait Singleton
{
    // A static variable to hold our single instance
    private static $_instance = null;
    private $_dsn = '';
    private $_user = '';
    private $_password = '';

    // A method to get our singleton instance
    public static function getInstance()
    {
        // Dynamically use the current class name
        $class = __CLASS__;

        if (!self::$_instance instanceof $class) {
            self::$_instance = new $class();
        }

        return self::$_instance;
    }
}
class DBWriteConnection extends PDO
{
    // Use the Singleton trait
    use Singleton;

    private function __construct()
    {
        parent::__construct($this->_dsn, $this->_user, $this->_password);
    }
}
class DBReadConnection extends PDO
{
    use Singleton;

    private function __construct()
    {
        parent::__construct($this->_dsn, $this->_user, $this->_password);
    }
}

Có vẻ khá ưng ý với cách refactory này mình đã tiến hành chạy thử và test OK . Phù!!!! Thế là thoát nạn rồi nhỉ ^^ . Nhưng đời không như là mơ. Thật là thảm hoạ nếu apply đoạn mã trên cho toàn hệ thống vì bạn sẽ phải sử dụng 2 đối tượng DB khác nhau và sẽ phải thay thế nó cho toàn bộ source code. Điều này đồng nghĩa là khả năng xảy ra bug cũng như missing hệ thống là rất lớn.

Mình đành phải suy nghĩ thêm solution khác . Và có vẻ đã tìm được ánh sáng cuối đường hầm và minh sẽ viết tiếp ở bài viết khác.

Xin cảm ơn các bạn.

jackiewu 03-11-2016

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

jackiewu

1 bài viết.
0 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Bài viết liên quan
White
0 2
fCC: Technical Documentation Page note So I have finished the HTML part of this exercise and I want to come here to lament about the lengthy HTML ...
HungHayHo viết 1 tháng trước
0 2
White
19 1
Toán tử XOR có tính chất: + A XOR A = 0 + 0 XOR A = A Với tính chất này, có thể cài đặt bài toán sau với độ phức tạp O(N) về runtime, và với O(1)...
kiennt viết gần 2 năm trước
19 1
White
1 1
Chào mọi người, hôm nay mình viết một bài TIL nhỏ về cách lấy độ phân giải của màn hình hiện tại đang sử dụng. xdpyinfo | grep dimensions Kết quả...
namtx viết 12 tháng trước
1 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
1 bài viết.
0 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!