0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

So sánh QuickSort: Java và Clprolf

Đăng vào 7 tháng trước

• 8 phút đọc

So sánh QuickSort: Java và Clprolf

Giới thiệu

Bài viết này là một phần trong loạt tài liệu chính thức về Clprolf. Clprolf là một ngôn ngữ lập trình và framework mới, giúp làm rõ lập trình hướng đối tượng (OOP) bằng cách củng cố vai trò, trách nhiệm và thiết kế sạch.

Java rất tuyệt vời, nhưng trong Clprolf, chúng ta có thể diễn đạt điều tương tự theo cách khác. Hãy cùng xem xét một ví dụ với QuickSort, thuật toán sắp xếp nổi tiếng và hiệu quả.

Cả hai phiên bản dưới đây (Java và Clprolf) đều sản xuất kết quả thực thi giống nhau. Sự khác biệt nằm ở phong cách thiết kếtrách nhiệm của các thành phần.


Phiên bản QuickSort trong Java

java Copy
public class QuickSort {

    public void sort(int[] array) {
        quickSort(array, 0, array.length - 1);
    }

    private void quickSort(int[] array, int low, int high) {
        if (low < high) {
            int pivotIndex = partition(array, low, high);
            quickSort(array, low, pivotIndex - 1);
            quickSort(array, pivotIndex + 1, high);
        }
    }

    private int partition(int[] array, int low, int high) {
        int pivot = array[high];
        int i = (low - 1);

        for (int j = low; j < high; j++) {
            if (array[j] < pivot) {
                i++;
                int temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }

        int temp = array[i + 1];
        array[i + 1] = array[high];
        array[high] = temp;

        return i + 1;
    }

    public void printArray(int[] array) {
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        QuickSort sorter = new QuickSort();
        int[] array = {34, 7, 23, 32, 5, 62, 32, 6};

        System.out.println("Mảng chưa sắp xếp:");
        sorter.printArray(array);

        sorter.sort(array);

        System.out.println("Mảng đã sắp xếp:");
        sorter.printArray(array);
    }
}

Kết quả thực thi

plaintext Copy
Mảng chưa sắp xếp:
34 7 23 32 5 62 32 6 
Mảng đã sắp xếp:
5 6 7 23 32 32 34 62

Ở đây, chúng ta đã chọn một lớp duy nhất (QuickSort) mà:

  • khởi động chương trình (chứa main),
  • sắp xếp mảng,
  • phân vùng nó,
  • và thậm chí in ra.

Đây là phong cách thuần Java: một lớp, nhiều trách nhiệm.


Phiên bản QuickSort trong Clprolf

Trong Clprolf, chúng ta tách biệt các vai trò này thành các thành phần riêng biệt:

  • @Agent → QuickSort, thành phần sắp xếp chủ động.
  • @Worker_agent → Printer, công nhân xử lý hiển thị.
  • @Worker_agent → Launcher, điểm vào độc lập (cũng có thể là @Worker_agent(Role.STATIC)).

Sự tách biệt này giúp mỗi thành phần tuân thủ Nguyên tắc Trách nhiệm Đơn (SRP).

java Copy
@Agent // QuickSort là một tác nhân chủ động thực hiện sắp xếp
public class QuickSort {

    private Printer workerAgent;

    public QuickSort(Printer workerAgent) {
        this.workerAgent = workerAgent;
    }

    public void sort(int[] array) {
        workerAgent.printArray("Mảng chưa sắp xếp:", array);
        quickSort(array, 0, array.length - 1);
        workerAgent.printArray("Mảng đã sắp xếp:", array);
    }

    private void quickSort(int[] array, int low, int high) {
        if (low < high) {
            int pivotIndex = partition(array, low, high);
            quickSort(array, low, pivotIndex - 1);
            quickSort(array, pivotIndex + 1, high);
        }
    }

    @Underst // Nhấn mạnh độ phức tạp
    private int partition(int[] array, int low, int high) {
        int pivot = array[high];
        int i = (low - 1);

        // Ví dụ: trước khi phân vùng, [34, 7, 23, 32, 5, 62, 32, 6] (pivot = 6)
        for (int j = low; j < high; j++) {
            if (array[j] < pivot) {
                i++;
                int temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }

        int temp = array[i + 1];
        array[i + 1] = array[high];
        array[high] = temp;

        // Ví dụ: sau khi phân vùng, pivot (6) ở chỉ số 2
        return i + 1;
    }
}

@Worker_agent // Tác nhân công nhân chuyên dụng cho việc in
public class Printer {

    public void printArray(String message, int[] array) {
        System.out.println(message);
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
        System.out.println();
    }
}

@Worker_agent // Trình khởi động độc lập
public class Launcher {
    public static void main(String[] args) {
        Printer worker = new Printer();
        QuickSort sorter = new QuickSort(worker);

        int[] array = {34, 7, 23, 32, 5, 62, 32, 6};
        sorter.sort(array);
    }
}

Kết quả thực thi

plaintext Copy
Mảng chưa sắp xếp:
34 7 23 32 5 62 32 6 
Mảng đã sắp xếp:
5 6 7 23 32 32 34 62

Thực tiễn tốt nhất

  • Tách biệt trách nhiệm: Luôn tạo các thành phần riêng biệt cho các chức năng khác nhau để dễ bảo trì.
  • Tuân thủ SRP: Đảm bảo mỗi thành phần chỉ có một trách nhiệm duy nhất.

Cạm bẫy thường gặp

  • Quá tải trách nhiệm: Không nên để một lớp đảm nhận quá nhiều nhiệm vụ, điều này làm giảm tính khả thi và bảo trì.
  • Thiếu kiểm tra lỗi: Không xử lý các trường hợp ngoại lệ có thể dẫn đến việc chương trình dừng hoạt động.

Mẹo hiệu suất

  • Sử dụng các cấu trúc dữ liệu phù hợp để tối ưu hóa tốc độ sắp xếp.
  • Xem xét việc sử dụng đa luồng nếu cần thiết cho các mảng lớn.

Gỡ lỗi

  • Nếu bạn gặp vấn đề trong việc sắp xếp, hãy kiểm tra các điều kiện trong hàm phân vùng và đảm bảo rằng các chỉ số không vượt quá giới hạn mảng.

Kết luận

Cả hai phiên bản đều thực hiện cùng một nhiệm vụ:

  • Phiên bản Java là gọn gàng và truyền thống: một lớp, nhiều trách nhiệm.
  • Phiên bản Clprolf tách biệt các vai trò thành các thành phần:
    • QuickSort (tác nhân),
    • Printer (tác nhân công nhân),
    • Launcher (tác nhân công nhân).

Sự rõ ràng này giúp các hệ thống dễ duy trì hơn, đặc biệt khi chúng phát triển lớn và liên quan đến nhiều nhà phát triển. Clprolf đảm bảo rằng mã nguồn vẫn tuân thủ SRP và gần gũi với các phép ẩn dụ trong thế giới thực, ngay cả khi các chuỗi kế thừa phát triển.

Một lập trình viên Java giỏi có thể áp dụng SRP và các mẫu thiết kế một cách thủ công. Nhưng với Clprolf, những nguyên tắc này được tích hợp vào ngôn ngữ — khiến thiết kế sạch trở nên tự nhiên và thậm chí thú vị.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào