MVC - IvanSholana/Pemrograman-Berbasis-Objek-Sistem-Informasi GitHub Wiki

MVC (Model-View-Controller)

image

1. Pengertian MVC

MVC adalah sebuah pola arsitektur (architectural pattern) yang digunakan untuk mengorganisasi kode dalam pengembangan perangkat lunak, terutama pada aplikasi berbasis GUI atau web. MVC memisahkan aplikasi menjadi tiga komponen utama:

  1. Model: Berfungsi untuk mengelola data, logika bisnis, dan aturan aplikasi.
  2. View: Bertugas untuk menampilkan data kepada pengguna dan menangani antarmuka pengguna (User Interface, UI).
  3. Controller: Berfungsi sebagai penghubung antara Model dan View, mengatur aliran data, dan merespons input pengguna.

2. Tujuan MVC

  1. Modularitas: Memisahkan tanggung jawab komponen sehingga kode lebih mudah dipahami, dikelola, dan diperbarui.
  2. Reusability: Komponen seperti Model atau View dapat digunakan kembali di bagian lain aplikasi.
  3. Scalability: Membantu aplikasi lebih mudah dikembangkan dengan menambahkan fitur baru tanpa mengganggu sistem yang sudah ada.
  4. Testability: Setiap komponen dapat diuji secara terpisah untuk memastikan kualitas aplikasi.

3. Komponen MVC

3.1. Model

  • Mengelola logika bisnis dan data aplikasi.
  • Berfungsi untuk mengambil, menyimpan, memperbarui, dan menghapus data.
  • Model tidak memiliki pengetahuan tentang bagaimana data akan ditampilkan.
  • Contoh:
    • Di aplikasi belanja, Model bisa berupa entitas seperti Produk, Pembeli, dan Transaksi.

Contoh Model (Java)

public class TaskModel {
    private int id;
    private String title;
    private String description;
    private boolean isCompleted;

    public TaskModel(int id, String title, String description) {
        this.id = id;
        this.title = title;
        this.description = description;
        this.isCompleted = false;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public boolean isCompleted() {
        return isCompleted;
    }

    public void setCompleted(boolean isCompleted) {
        this.isCompleted = isCompleted;
    }
}

3.2. View

  • Bertugas menampilkan data kepada pengguna (UI).
  • Mengambil data dari Model melalui Controller.
  • Tidak memiliki logika bisnis, hanya untuk menampilkan data.
  • Contoh:
    • Antarmuka grafis (GUI), halaman web, atau output di terminal.

Contoh View (Java)

import java.util.List;

public class TaskView {
    public void displayTask(List<TaskModel> tasks) {
        System.out.println("==== Task List ====");
        for (TaskModel task : tasks) {
            System.out.println(task.getId() + ". " + task.getTitle() + " (Completed: " + task.isCompleted() + ")");
        }

        System.out.println("===================\n");
    }

    public void displayTaskDetails(TaskModel task) {
        System.out.println("Task Details");
        System.out.println("ID : " + task.getId());
        System.out.println("Title: " + task.getTitle());
        System.out.println("Description: " + task.getDescription());
        System.out.println("Completed: " + task.isCompleted());
        System.out.println();
    }

    public void showMessage(String message) {
        System.out.println(message);
    }
}

3.3. Controller

  • Menghubungkan Model dan View.
  • Menerima input dari pengguna, memprosesnya, dan memperbarui Model atau View.
  • Menyediakan metode untuk mengatur data dan tampilan.

Contoh Controller (Java)

import java.util.ArrayList;
import java.util.List;

public class TaskController {
    private List<TaskModel> tasks;
    private TaskView view;

    public TaskController(TaskView view) {
        this.tasks = new ArrayList<>();
        this.view = view;
    }

    public void addTask(String title, String description) {
        int id = tasks.size() + 1;
        TaskModel task = new TaskModel(id, title, description);
        this.tasks.add(task);
        view.showMessage("Task added successfully");
    }

    public void listTasks() {
        view.displayTask(this.tasks);
    }

    private TaskModel findTaskById(int taskId) {
        for (TaskModel task : tasks) {
            if (task.getId() == taskId) {
                return task;
            }
        }
        return null;
    }

    public void viewTask(int taskId) {
        TaskModel task = findTaskById(taskId);
        if (task != null) {
            view.displayTaskDetails(task);
        } else {
            view.showMessage("Task not Found!");
        }
    }

    public void updateTask(int taskId, String newTitle, String newDescription) {
        TaskModel task = findTaskById(taskId);
        if (task != null) {
            task.setTitle(newTitle);
            task.setDescription(newDescription);
            view.showMessage("Task updated successfully");
        } else {
            view.showMessage("Task not Found!");
        }
    }

    public void deleteTask(int taskId) {
        TaskModel task = findTaskById(taskId);
        if (task != null) {
            this.tasks.remove(task);
            view.showMessage("Task deleted successfully");
        } else {
            view.showMessage("Task not found!");
        }
    };

    public void markTaskAsCompleted(int taskId) {
        TaskModel task = findTaskById(taskId);
        if (task != null) {
            task.setCompleted(true);
            view.showMessage("Task marked as complated");
        } else {
            view.showMessage("Task not found!");
        }
    }
}

4. Implementasi MVC

4.1. Main Class

Menggabungkan semua komponen dan menjalankan aplikasi.

import java.util.Scanner;

public class TaskManagementApp {
    public static void main(String[] args) {
        TaskView view = new TaskView();
        TaskController controller = new TaskController(view);
        Scanner scanner = new Scanner(System.in);

        while (true) {
            System.out.println("\n=== Task Management ===");
            System.out.println("1. Add Task");
            System.out.println("2. List Tasks");
            System.out.println("3. View Task Details");
            System.out.println("4. Update Task");
            System.out.println("5. Delete Task");
            System.out.println("6. Mark Task as Completed");
            System.out.println("7. Exit");
            System.out.print("Choose an option: ");

            int choice = scanner.nextInt();
            scanner.nextLine(); // Consume newline

            switch (choice) {
                case 1:
                    System.out.print("Enter task title: ");
                    String title = scanner.nextLine();
                    System.out.print("Enter task description: ");
                    String description = scanner.nextLine();
                    controller.addTask(title, description);
                    break;
                case 2:
                    controller.listTasks();
                    break;
                case 3:
                    System.out.print("Enter task ID: ");
                    int taskIdToView = scanner.nextInt();
                    controller.viewTask(taskIdToView);
                    break;
                case 4:
                    System.out.print("Enter task ID: ");
                    int taskIdToUpdate = scanner.nextInt();
                    scanner.nextLine();
                    System.out.print("Enter new title: ");
                    String newTitle = scanner.nextLine();
                    System.out.print("Enter new description: ");
                    String newDescription = scanner.nextLine();
                    controller.updateTask(taskIdToUpdate, newTitle, newDescription);
                    break;
                case 5:
                    System.out.print("Enter task ID: ");
                    int taskIdToDelete = scanner.nextInt();
                    controller.deleteTask(taskIdToDelete);
                    break;
                case 6:
                    System.out.print("Enter task ID: ");
                    int taskIdToComplete = scanner.nextInt();
                    controller.markTaskAsCompleted(taskIdToComplete);
                    break;
                case 7:
                    System.out.println("Exiting...");
                    scanner.close();
                    return;
                default:
                    System.out.println("Invalid option! Please try again.");
            }
        }
    }
}

5. Diagram MVC

Berikut adalah ilustrasi alur data dalam pola MVC:

   +----------+     Input        +------------+
   |  Viewer  | ---------------->| Controller |
   +----------+                  +------------+
        ^                              |
        |      Update/View Data        |
        +------------------------------+
               | Retrieve/Modify Data
               v
          +-----------+
          |   Model    |
          +-----------+

6. Kelebihan dan Kekurangan MVC

Kelebihan:

  1. Separation of Concerns: Memisahkan logika aplikasi, UI, dan kontrol sehingga kode lebih terstruktur.
  2. Reusability: Komponen seperti Model dan View dapat digunakan kembali.
  3. Maintainability: Lebih mudah memelihara dan memperbarui kode karena tanggung jawab setiap komponen jelas.

Kekurangan:

  1. Kompleksitas: Untuk aplikasi kecil, MVC bisa terasa terlalu berlebihan.
  2. Curva Pembelajaran: Pemula membutuhkan waktu untuk memahami pola ini.
  3. Komunikasi Antar Komponen: Jika tidak diimplementasikan dengan baik, bisa menjadi sulit untuk diikuti.

7. Studi Kasus

Buat aplikasi Sistem Manajemen Perpustakaan:

  1. Model:
    • Entity: Buku, Anggota, Transaksi.
    • Fitur: Tambah buku, cari buku, pinjam buku.
  2. View:
    • Menampilkan daftar buku, informasi anggota, dan detail transaksi.
  3. Controller:
    • Mengatur alur data antara Model dan View.
โš ๏ธ **GitHub.com Fallback** โš ๏ธ