Spring Boot Series - Core Concepts (Part 1)

Spring Boot Series - Core Concepts (Part 1)

·

3 min read

1. Giới thiệu

Bài viết giới thiệu về các khái niệm nền tảng (key concepts) trước khi bắt đầu làm việc với Spring framework và hệ sinh thái của nó.

2. Concepts

2.1 Tight coupling & loosely-coupled

tight coupling hay "liên kết ràng buộc" là một khái niệm ám chỉ mối quan hệ giữa các class quá chặt chẽ, dẫn đến khi có sự thay đổi về logic hoặc xảy ra lỗi ở một class sẽ ảnh hưởng đến toàn bộ class.

loosely-coupled là ám chỉ việc làm giảm sự phụ thuộc giữa các class với nhau.

Ví dụ

Lấy một ví dụ, bạn có 1 class thực hiện một tác vụ rất phức tạp, trong đó có yêu cầu sắp xếp dữ liệu trước khi xử lí.

Ta sẽ hiện thực yêu cầu trên theo các cách sau để hiểu rõ hơn 2 khái niệm trên

Cách 1

public class MergeSortAlgorithm{
    public void sort(int[] array) {
        // TODO: Add your logic here
        System.out.println("Đã sắp xếp bằng thuật toán sx nổi bọt");
    }
}


public class VeryComplexService {
    private MergeSortAlgorithm mergeSortAlgorithm = new MergeSortAlgorithm();
    public VeryComplexService(){
    }

    public void complexBusiness(int array[]){
        mergeSortAlgorithm.sort(array);
        // TODO: more logic here
    }
}

Với cách làm ở trên, VeryComplexService đã hoàn thiện được nhiệm vụ, tuy nhiên, khi có yêu cầu thay đổi thuật toán sắp xếp sang QuickSort thì nghe vẻ chúng ta sẽ phải sửa lại hoàn toàn cả 2 Class trên.

Ngoài ra MergeSortAlgorithm sẽ chỉ tồn tại nếu VeryComplexService tồn tại, vì VeryComplexService tạo đối tượng BubbleSortAlgorithm bên trong nó (hay nói cách khác là sự sống chết của MergeSortAlgorithm sẽ do VeryComplexService quyết định), theo như cách implement này, nó là liên kết rất chặt với nhau.

Cách 2

public interface SortAlgorithm {
    /**
     * Sắp xếp mảng đầu vào
     * @param array
     */
    public void sort(int array[]);
}

public class MergeSortAlgorithm implements SortAlgorithm{

    @Override
    public void sort(int[] array) {
        // TODO: Add your logic here
        System.out.println("Đã sắp xếp bằng thuật toán merge sort");
    }
}


public class VeryComplexService {
    private SortAlgorithm sortAlgorithm;
    public VeryComplexService(){
        sortAlgorithm = new MergeSortAlgorithm();
    }

    public void complexBusiness(int array[]){
        sortAlgorithm.sort(array);
        // TODO: more logic here
    }
}

Với cách làm này, VeryComplexService sẽ chỉ quan hệ với một interface SortAlgorithm. Với cách này thì mỗi quan hệ giảm bớt sự liên kết, nhưng nó không thay đổi được việc thuật toán vẫn đang là MergeSortAlgorithm.

Cách 3

public interface SortAlgorithm {
    /**
     * Sắp xếp mảng đầu vào
     * @param array
     */
    public void sort(int array[]);
}

public class MergeSortAlgorithm implements SortAlgorithm{

    @Override
    public void sort(int[] array) {
        // TODO: Add your logic here
        System.out.println("Đã sắp xếp bằng thuật toán mergesort");
    }
}

public class QuicksortAlgorithm implements SortAlgorithm {
    @Override
    public void sort(int[] array) {
        // TODO: Add your logic here
        System.out.println("Đã sắp xếp bằng thuật quicksort");

    }
}

public class VeryComplexService {
    private SortAlgorithm sortAlgorithm;
    public VeryComplexService(SortAlgorithm sortAlgorithm){
        this.sortAlgorithm = sortAlgorithm;
    }

    public void complexBusiness(int array[]){
        sortAlgorithm.sort(array);
        // TODO: more logic here
    }
}

public static void main(String[] args) {
    SortAlgorithm bubbleSortAlgorithm = new MergeSortAlgorithm();
    SortAlgorithm quickSortAlgorithm = new QuicksortAlgorithm();
    VeryComplexService business1 = new VeryComplexService(bubbleSortAlgorithm);
    VeryComplexService business2 = new VeryComplexService(quickSortAlgorithm);
}

Cách thứ ba này cũng là cách làm phổ biển nhất. Mối liên hệ giữa 2 Class đã "lỏng lẻo" hơn trước rất nhiều. VeryComplexService sẽ không quan tâm tới việc thuật toán sắp xép là gì nữa, mà chỉ cần tập trung vào nghiệp vụ. Còn SortAlgorithm sẽ được đưa vào từ bên ngoài tùy theo nhu cầu sử dụng.

Tham khảo

https://loda.me/articles/core-khai-niem-tight-coupling-lien-ket-rang-buoc-va-cach-loosely-coupled