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