Lewati ke konten utama

BAB 37. MODULAR ARCHITECTURE

Tujuan

Mencegah kode menjadi monolitik — di mana semua logika tercampur dan sulit diubah tanpa mempengaruhi bagian lain. Modular Architecture memastikan setiap domain bisnis terisolasi dan berkomunikasi hanya melalui interface.


Modul Utama TemuBelajar

ModulTanggung JawabDependency
AuthLogin, logout, ganti passwordUsers
UsersData dan manajemen penggunaSchools
StudentsProfil, skill, XP, SISUsers, Classrooms
TeachersDashboard dan monitoring guruUsers
RequestsPermintaan bantuan belajarStudents, Subjects
MatchingAI Matching EngineRequests, Students
BookingsPenjadwalan tutorRequests, Students
MeetingsCheck-In, Check-Out, QRBookings
ChatRealtime messagingBookings, Users
RatingsPenilaian dan feedbackMeetings
SISSocial Impact ScoreRatings, Meetings
LeaderboardRanking siswaSIS, Students
NotificationsPush dan in-app notifSemua modul
ReportsDashboard dan eksporSemua modul

Alur Antar Modul

flowchart LR
REQ["📝 Requests"] --> MATCH["🤖 Matching"]
MATCH --> BOOK["📅 Bookings"]
BOOK --> MEET["🤝 Meetings"]
BOOK --> CHAT["💬 Chat"]
MEET --> RATE["⭐ Ratings"]
RATE --> SIS["🌟 SIS"]
SIS --> LEAD["🏆 Leaderboard"]

MATCH -.->|"notify"| NOTIF["📲 Notifications"]
BOOK -.->|"notify"| NOTIF
MEET -.->|"notify"| NOTIF
RATE -.->|"notify"| NOTIF

style MATCH fill:#7c3aed,color:#fff
style NOTIF fill:#1f2937,color:#9ca3af

Prinsip Komunikasi Antar Modul

:::important Aturan Komunikasi Setiap modul hanya mengetahui interface (kontrak) dari modul lain, bukan implementasinya. Ini memastikan loose coupling. :::

Contoh — Modul Matching memanggil Notifications:

// Interface di Notifications module
interface NotificationServiceInterface
{
public function sendToUser(int $userId, string $title, string $body): void;
}

// Digunakan di Matching module — tanpa tahu implementasinya
class MatchingEngine
{
public function __construct(
private NotificationServiceInterface $notificationService
) {}

public function notifyTutor(Student $tutor, Request $request): void
{
$this->notificationService->sendToUser(
userId: $tutor->user_id,
title: 'Ada Request Bantuan Baru!',
body: "Siswa membutuhkan bantuan {$request->subject->name}"
);
}
}

Modul Boundaries

flowchart TD
subgraph AUTH ["🔐 Auth Module"]
L["Login"]
CP["Change Password"]
LO["Logout"]
end

subgraph REQ ["📝 Requests Module"]
CR["Create Request"]
VR["View Requests"]
UR["Update Request"]
end

subgraph MATCH ["🤖 Matching Module"]
CG["Candidate Generator"]
SE["Scoring Engine"]
NC["Notification Cascade"]
end

AUTH --> REQ
REQ --> MATCH

Keuntungan Modular Architecture

KeuntunganPenjelasan
IsolasiBug dalam satu modul tidak merembet ke modul lain
IndependenModul dapat dikembangkan oleh tim berbeda
ReusableModul Notifications dipakai oleh semua modul lain
TestableSetiap modul diuji secara unit
ScalableModul dapat diangkat menjadi microservice
MaintainablePerubahan bisnis terlokalisir

Contoh: Modul Chat (Realtime)

flowchart LR
App["📱 Flutter"] -->|"WebSocket"| Reverb["⚡ Laravel Reverb"]
Reverb -->|"Broadcast"| Channel["Private Channel\nper booking_id"]
Channel --> App2["📱 Flutter\n(Tutor)"]

App -->|"REST"| API["📤 POST /messages"]
API --> DB[("MySQL")]
DB -->|"Event"| Reverb

Chat modul menggunakan Laravel Reverb untuk WebSocket realtime, dengan setiap percakapan terisolasi pada channel privat booking.{id}.