Prinsip SOLID di Product Catalog
Ringkasan satu halaman. Dari Lesson 0008.
Lima prinsip
| Prinsip | Inti [2] | Contoh | Gejala pelanggaran | Padanan Node/React |
|---|---|---|---|---|
| SRP | Satu alasan untuk berubah; "alasan" = orang/peran yang meminta | Controller / Service / Repository | Service yang juga export CSV + kirim email; constructor gemuk | Route handler Express tipis |
| OCP | Tambah perilaku tanpa mengubah kode lama | IDiscountStrategy + PriceCalculator | switch (customerType) yang terus bertambah | Object map strategi |
| LSP | Pemakai interface tidak boleh dikejutkan implementasinya | IProductRepository SQL Server vs in-memory | NotImplementedException; exception di tempat kontrak mengembalikan null | Fake repo Jest yang setia pada kontrak |
| ISP | Interface sekecil kebutuhan konsumennya | IProductReader / IProductWriter | Interface 15 method untuk konsumen yang butuh 1 | Pick<Store, "products"> untuk props |
| DIP | Bergantung ke arah abstraksi, bukan detail | ProductService(IProductRepository repo) | new ProductRepository(...) di dalam Service | Provider NestJS / createService(repo) |
DIP dalam satu gambar
Panah = dependency compile-time. Alur runtime tidak berubah: Service tetap memanggil Repository. [1]
DIP = prinsip; Dependency Injection = teknik yang dimungkinkannya (container + constructor injection di Program.cs).
public class ProductService(IProductRepository repo) : IProductService { /* … */ }
builder.Services.AddScoped<IProductRepository, ProductRepository>(); // composition root
var sut = new ProductService(new Mock<IProductRepository>().Object); // unit test
Jawaban 60 detik: "SOLID mana yang paling sering Anda terapkan?"
SRP dan DIP, karena keduanya membuat kode bisa di-unit-test. SRP: Controller hanya HTTP, Service aturan bisnis, Repository akses data;
fitur baru seperti export CSV jadi class baru. DIP: Service bergantung pada IProductRepository, didaftarkan di Program.cs
dan diinjeksi lewat constructor, sehingga di test saya memberi mock Moq (seperti jest.fn()). Gejala SRP dilanggar: constructor dengan terlalu banyak dependency.
Pertanyaan lanjutan yang mungkin muncul
- "SRP vs separation of concerns?" → SRP berlaku di level class, tapi bisa dipakai sebagai prinsip arsitektur yang mirip separation of concerns (pembagian layer). [1]
- "Bagaimana tahu class melanggar SRP?" → banyak dependency yang diinjeksi adalah tandanya. [3]
- "Kenapa tidak
newsaja?" → dependency langsung sulit diganti dan sulit di-unit-test. [3] - "Explicit dependencies?" → class meminta semua kolaboratornya lewat constructor, supaya jujur pada pemakainya. [1]
- "Repository di atas EF Core perlu?" → lesson 0011.
Sumber: [1] Microsoft Learn: Architectural principles · [2] Robert C. Martin: Solid Relevance · [3] Dependency injection in ASP.NET Core