Phân tích và cải tiến bài tập Java

Tổng quan về bài tập

Sau ba tuần học phát triển Java, chúng ta đã chuyển từ việc thực hiện các logic cơ bản sang thiết kế hệ thống phức tạp hơn. Quá trình này không chỉ giúp củng cố kiến thức cơ bản về ngôn ngữ Java mà còn thực hành sâu rộng các khái niệm như thiết kế hướng đối tượng, xử lý ngoại lệ, lập trình đa luồng và cấu trúc dữ liệu phức tạp. Dưới đây là tổng kết và đánh giá cho ba lần bài tập.

Bài tập đầu tiên

Bài tập bắt đầu giới thiệu logic phức tạp, bao gồm mối quan hệ giữa đề thi và câu hỏi, xác định đáp án đúng, hỗ trợ nhiều loại câu hỏi khác nhau (chọn một đáp án, điền vào chỗ trống). Điểm khó khăn là phải phân loại cách xử lý đáp án dựa trên từng loại câu hỏi. Các vấn đề chính bao gồm quản lý sự ảnh hưởng của việc xóa câu hỏi đến kết quả trả lời, liên kết giữa tổng điểm và việc xác định đáp án đúng trong trường hợp có nhiều bài kiểm tra và sinh viên.

Bài tập thứ hai

Lần này là một chuỗi bài tập mới về nhà thông minh. Hệ thống cần xử lý nhiều thiết bị được kết nối theo kiểu dây chuyền. Người dùng cần nhập dữ liệu động và tính toán trạng thái tương ứng. Khó khăn lớn nhất là làm thế nào để hoàn thành kết nối dây chuyền qua đầu vào từ bàn phím.

Bài tập thứ ba

Dựa trên bài trước, lần này thêm một loại thiết bị mạch điện mới và mạch song song. Cách nhập dữ liệu cũng thay đổi, cần tính toán thêm biến thiên áp để đưa ra trạng thái của các thiết bị mạch điện. Những trường hợp đặc biệt như ngắn mạch hay đứt mạch cần được xử lý.

Thiết kế và phân tích

Bài tập 4

Được thiết kế với bảy lớp, bao gồm: Câu hỏi, lựa chọn đơn, lựa chọn nhiều, điền vào chỗ trống, đề thi, học sinh và phiếu trả lời.

Lớp Question

Lớp trừu tượng mà tất cả các loại câu hỏi đều kế thừa từ nó. Thuộc tính gồm số hiệu câu hỏi và nội dung câu hỏi. Phương thức trừu tượng scoreAnswer chịu trách nhiệm tính điểm dựa trên câu trả lời của học sinh so với đáp án đúng. Phương thức formatResult có thể được ghi đè để tùy chỉnh định dạng đầu ra cho từng loại câu hỏi.

Lớp SingleChoiceQuestion

Kế thừa từ Question, biểu diễn câu hỏi lựa chọn đơn. So sánh câu trả lời của học sinh với đáp án đúng để đánh giá điểm số.

Lớp MultipleChoiceQuestion

Tương tự nhưng dành cho câu hỏi lựa chọn nhiều. So sánh tập hợp câu trả lời của học sinh với tập hợp đáp án đúng để đánh giá điểm số.

Lớp FillInTheBlankQuestion

Biểu diễn câu hỏi điền vào chỗ trống. So sánh câu trả lời của học sinh với tập hợp đáp án đúng để đánh giá điểm số.

Lớp TestPaper

Biểu diễn đề thi, chứa thông tin số hiệu đề thi, danh sách câu hỏi và tổng điểm.

Lớp Student

Biểu diễn học sinh, chứa thông tin mã học sinh và tên.

Lớp AnswerSheet

Biểu diễn phiếu trả lời của học sinh, chứa thông tin số hiệu đề thi, mã học sinh và câu trả lời cho từng câu hỏi.

Bài tập 5

Thiết kế tám lớp, bao gồm: Thiết bị, công tắc, bộ điều khiển tốc độ quạt, bộ điều khiển tốc độ liên tục, bóng đèn sợi đốt, đèn huỳnh quang, quạt và mạch điện.

Một số lớp điển hình

Lớp Device

Thuộc tính gồm ID thiết bị, điện áp đầu vào và đầu ra. Phương thức trừu tượng process xử lý và xuất trạng thái của thiết bị. Phương thức trừu tượng updateVoltage cập nhật điện áp đầu ra dựa trên điện áp đầu vào.

Lớp Switch

Biểu diễn công tắc, có thể bật/tắt. Phương thức toggle chuyển đổi trạng thái công tắc. Phương thức process xuất trạng thái hiện tại. Phương thức updateVoltage cập nhật điện áp đầu ra dựa trên trạng thái công tắc.

Lớp FanSpeedController

Biểu diễn bộ điều khiển tốc độ quạt. Có phương thức tăng/giảm mức độ tốc độ và cập nhật điện áp đầu ra dựa trên mức độ tốc độ hiện tại.

Bài tập 6

Thêm lớp FloorFan và sửa đổi lớp Circuit. Các thay đổi chủ yếu liên quan đến việc xử lý mạch song song và dãy nối tiếp.

Các vấn đề gặp phải

Vấn đề với câu hỏi lựa chọn nhiều

Khi xử lý câu hỏi lựa chọn nhiều, chỉ có một phần câu trả lời được hiển thị, dẫn đến đầu ra không đầy đủ. Ví dụ:

public String formatResult(String answer, boolean isCorrect) {
    Set<String> providedAnswers = new HashSet<>(Arrays.asList(answer.trim().split("hoặc")));
    if (isCorrect) {
        return super.formatResult(answer, true);
    } else if (!providedAnswers.isEmpty() && correctAnswers.containsAll(providedAnswers)) {
        return content + "~" + String.join(",", providedAnswers) + "~phần nào đó đúng";
    } else {
        return super.formatResult(answer, false);
    }
}

Vấn đề với thiết bị ánh sáng

Mặc dù ví dụ mẫu hoạt động tốt, nhưng vẫn có lỗi ở một số điểm thử nghiệm. Ví dụ:

class IncandescentLight extends Device {
    private double brightness;

    public IncandescentLight(String id) {
        super(id);
        this.brightness = 0;
    }

    @Override
    public void process() {
        System.out.println("@" + id + ":" + Math.round(brightness));
    }

    @Override
    public void updateVoltage(double inputVoltage) {
        if (inputVoltage <= 9) {
            brightness = 0;
        } else if (inputVoltage > 220) {
            brightness = 200;
        } else {
            brightness = ((inputVoltage - 10) * (150 / 210)) + 50;
        }
    }
}

Vấn đề với mạch điện

Khi xử lý mạch nối tiếp và song song, có sự sai lệch trong cách tính điện áp. Ví dụ:

private void calculateSeriesVoltage(String circuitId, double voltage) {
    List<String[]> connections = seriesCircuits.get(circuitId);
    if (connections == null) return;

    double totalResistance = connections.stream()
        .map(conn -> conn[0].split("-")[0])
        .map(devices::get)
        .filter(Objects::nonNull)
        .mapToDouble(device -> device.resistance)
        .sum();

    for (String[] connection : connections) {
        String deviceId = connection[0].split("-")[0];
        Device device = devices.get(deviceId);
        if (device != null) {
            double voltageDrop = voltage * (device.resistance / totalResistance);
            device.updateVoltage(voltageDrop);
        }
    }
}

Khuyến nghị cải tiến

Nên tối ưu tên biến, tăng cường chú thích để cải thiện khả năng đọc mã. Đồng thời, nên tự tạo thêm các trường hợp thử nghiệm đặc biệt để tránh phụ thuộc quá nhiều vào ví dụ mẫu.

Thẻ: Java oop DesignPatterns

Đăng vào ngày 14 tháng 7 lúc 16:30