Cài đặt Lazy Loading trong C#

Cài đặt Lazy Loading trong C#

Chương trình cần mô hình hóa đối tượng cái ô tô gồm các thuộc tính: Loại xe, màu sắc, giá, số chỗ, 4 bánh xe. Trong đó màu sắc và giá được quan tâm nhiều và được sửa đổi thường xuyên, các thông số kỹ thuật của bánh xe ít được quan tâm.

Ta thiết kế lớp Car:

class Car {
  // Loại xe
  public string Type { set; get; }
  // Màu xe
  public Color Color { set; get; }
  // Giá
  public float Price { set; get; }
  // Số chỗ
  public int Capacity { set; get; }

  private Wheel[] _wheels;
  // 4 bánh xe
  public Wheel[] Wheels { get { return _wheels; } }

  // hàm khởi tạo
  public Car(){
    // khởi tạo cho 4 bánh xe
    _wheels = new Wheel[4];
    for(var i=0;i<4;i++) _wheels[i] = new Wheel();
  }
}

Giả sử như việc khởi tạo cho 4 bánh xe thực hiện chậm (mất 1 giây/1 bánh xe). Khi đó để khởi tạo cho một kho chứa ô tô gồm 100 chiếc sẽ mất 400 giây cho việc khởi tạo các bánh xe và điều này không chấp nhận được về mặt hiệu năng trong khi việc truy cập đến thông số các bánh xe là rất ít. Để giải quyết vấn đề trên, ta có thể sử dụng kỹ thuật Lazy Loading.

Lazy loading

Lazy loading là một design pattern cho phép ta trì hoãn việc khởi tạo đối tượng và chỉ thực sự khởi tạo đối tượng đó khi cần. Nó giúp tăng hiệu năng khá tốt.

Đối với bài toàn ô tô bên trên, ta chỉ thực sự khởi tạo 4 bánh xe vào lần yêu cầu truy cập đầu tiên tới bánh xe. Trong hàm khởi tạo của lớp Car hoàn toàn không khởi tạo bánh xe.

Ta thực hiện sửa đổi để cài đặt Lazy Loading:

class Car {
  // Loại xe
  public string Type { set; get; }
  // Màu xe
  public Color Color { set; get; }
  // Giá
  public float Price { set; get; }
  // Số chỗ
  public int Capacity { set; get; }

  private Wheel[] _wheels;
  // 4 bánh xe
  public Wheel[] Wheels {
    get {
      // chỉ khởi tạo khi cần
      if (_wheels == null) {
        // thực hiện khởi tạo 4 bánh xe
        _wheels = new Wheel[4];
        for(var i=0;i<4;i++) _wheels[i] = new Wheel();
      }
      return _wheel;
    }
  }

  // hàm khởi tạo
  public Car(){
    // không cần khởi tạo cho 4 bánh xe
  }
}

Việc cài đặt Lazy loading có thể thực hiện trong các ngôn ngữ khác cũng tương tự như trên.

Lazy loading trong C#

Trong C# v4.0, Lazy Loading đã được .NET hỗ trợ bằng lớp built-in: Lazy<T>. Lớp này giúp việc implement code dễ dàng, sáng sủa hơn, đồng thời an toàn khi chạy đa luồng.

  // ...

  private Lazy<Wheel[]> _wheels;
  // 4 bánh xe
  public Wheel[] Wheels { get { return _wheels.Value; } }
  // hàm khởi tạo
  public Car(){
    _wheels = new Lazy<Wheel[]>(() => {
        // thực hiện khởi tạo 4 bánh xe khi cần
        var w = new Wheel[4];
        for(var i=0;i<4;i++) w[i] = new Wheel();
        return w;
      });
  }
Khi trích dẫn bài viết từ tek.eten.vn, xin vui lòng ghi rõ nguồn. Chúng tôi sẽ rất cảm ơn bạn!