Implementasi Repository — BAB 11
Tujuan Pembelajaran
Section titled “Tujuan Pembelajaran”Setelah mengikuti halaman ini, kamu diharapkan dapat:
- Membuat file
academic-repository.tsdi folderrepositories/. - Menerapkan
implements IRepository<T>pada class database. - Memproses penambahan, pencarian, pembaruan, dan penghapusan data secara Generic.
Pendahuluan
Section titled “Pendahuluan”Layer Repository bertanggung jawab langsung memanipulasi array data murni di memori RAM. Class ini tidak peduli tentang menu konsol atau nilai kelulusan. Tugasnya murni menjadi “pelayan gudang” yang menerima dan mengarsipkan data.
Penjelasan
Section titled “Penjelasan”Kita akan mengimplementasikan class AcademicRepository<T> di dalam folder src/repositories/. Class ini harus mematuhi kontrak IRepository<T> (BAB 7) dan menggunakan Generic Constraint (BAB 9) agar data yang dimasukkan dijamin memiliki properti id: number sebagai pembeda primer data.
Analogi Kehidupan Sehari-hari: Asisten Gudang Buku Sekolah
Section titled “Analogi Kehidupan Sehari-hari: Asisten Gudang Buku Sekolah”Mengimplementasikan class AcademicRepository seperti mempekerjakan asisten gudang baru yang teliti:
Aturan kerja asisten gudang (AcademicRepository):- Jika menerima buku baru ──► periksa apakah nomor rak kosong ──► masukkan ke rak (tambah)- Jika guru meminta buku tertentu ──► telusuri nomor rak ──► serahkan buku (cariBerdasarkanId)- Jika buku rusak ──► buang dari rak (hapus)Asisten gudang tidak membaca isi buku. Ia hanya memindahkan fisik buku dari meja masuk ke rak penyimpanan.
Visual Illustration: Alur Penyimpanan Data Generic
Section titled “Visual Illustration: Alur Penyimpanan Data Generic” DataRepository<T> (Generic Class) │ ┌───────────────┼───────────────┐ ▼ ▼ ▼ Siswa[] Guru[] Mapel[](Menyimpan Siswa) (Menyimpan Guru) (Menyimpan Mapel)Live Coding: Implementasi AcademicRepository
Section titled “Live Coding: Implementasi AcademicRepository”Langkah 1: Buat src/repositories/academic-repository.ts
Section titled “Langkah 1: Buat src/repositories/academic-repository.ts”import { IRepository } from "../interfaces/repository-interface";
// T wajib memiliki properti 'id' (Generic Constraint)export class AcademicRepository<T extends { id: number }> implements IRepository<T> { private database: T[] = [];
constructor(public namaTabel: string) {}
// Aksi C: Create (Tambah) tambah(item: T): boolean { const sudahAda = this.database.some((d) => d.id === item.id); if (sudahAda) { return false; // gagal jika ID sudah dipakai } this.database.push(item); return true; }
// Aksi R: Read (Ambil Semua) ambilSemua(): T[] { return this.database; }
// Aksi R: Read (Cari berdasarkan ID) cariBerdasarkanId(id: number): T | undefined { return this.database.find((d) => d.id === id); }
// Aksi U: Update (Menggunakan Partial) update(id: number, dataBaru: Partial<T>): boolean { const dataLama = this.cariBerdasarkanId(id); if (dataLama === undefined) { return false; // gagal jika data tidak ditemukan }
this.database = this.database.map((item) => { if (item.id === id) { return { ...item, ...dataBaru }; // gabungkan data lama dan baru } return item; }); return true; }
// Aksi D: Delete (Hapus) hapus(id: number): boolean { const indeks = this.database.findIndex((d) => d.id === id); if (indeks === -1) { return false; // gagal jika tidak ada } this.database.splice(indeks, 1); return true; }}Output
Section titled “Output”Setelah membuat file di atas, kita memiliki sebuah engine penyimpanan Generic database memori yang bisa menampung dan memanipulasi tipe data objek apa saja selama objek tersebut memiliki properti id.
Penjelasan Baris per Baris
Section titled “Penjelasan Baris per Baris”class AcademicRepository<T extends { id: number }>: Generic class dengan batasan propertiid(BAB 9).dataBaru: Partial<T>: Menerima objek sebagian kustom menggunakan utility typePartialbawaan TypeScript (BAB 9).this.database.some(...): Memeriksa apakah ada elemen di dalam array yang memenuhi kondisi ID duplikat (BAB 5).
Common Mistakes
Section titled “Common Mistakes”- Lupa extends { id: number }: Menulis
<T>saja tanpa batasan. Akibatnya, barisd.id === item.idakan memicu error compiler karena TypeScript tidak tahu apakahTmemiliki propertiidatau tidak.
Ringkasan
Section titled “Ringkasan”- Class repository diletakkan di dalam folder
src/repositories/. - Mengimplementasikan interface
IRepository<T>. - Menggunakan constraint
extends { id: number }agar ID aman dicari di dalam array. - Seluruh manipulasi data murni (push, map, splice) dilakukan di layer ini.
Latihan
Section titled “Latihan”- Buat file
academic-repository.tsdi foldersrc/repositories/komputermu. - Pastikan file tersebut berhasil di-import tanpa error.