<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sanudin</title>
    <description>The latest articles on DEV Community by Sanudin (@sanudin-dev).</description>
    <link>https://dev.to/sanudin-dev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3760854%2Fd3829bce-f434-4f4c-a857-ce8b6eca446a.png</url>
      <title>DEV Community: Sanudin</title>
      <link>https://dev.to/sanudin-dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sanudin-dev"/>
    <language>en</language>
    <item>
      <title>From OOP to SOLID: Everything You Need to Know in One Article</title>
      <dc:creator>Sanudin</dc:creator>
      <pubDate>Sun, 24 May 2026 16:52:32 +0000</pubDate>
      <link>https://dev.to/sanudin-dev/from-oop-to-solid-everything-you-need-to-know-in-one-article-44co</link>
      <guid>https://dev.to/sanudin-dev/from-oop-to-solid-everything-you-need-to-know-in-one-article-44co</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🕐 ~8 min read&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📝 A note on this article&lt;/strong&gt;&lt;br&gt;
This post is based on my personal study notes on OOP and SOLID principles. To make these notes more readable and useful — for myself and for others — I worked with AI to help expand and structure them into a proper blog format. The ideas, learning journey, and understanding are mine; the AI helped with the writing and presentation.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Good code doesn't happen by accident. Behind every codebase that's a pleasure to work with, there's a set of ideas guiding how things are structured and connected.&lt;/p&gt;

&lt;p&gt;This article covers that full journey — from what OOP is, how objects relate, what bad design looks like, and finally: the five SOLID principles that tie it all together.&lt;/p&gt;

&lt;p&gt;Let's go.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 1: What Is OOP?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Object Oriented Programming (OOP)&lt;/strong&gt; is a way of writing code that mirrors the real world. Instead of one long list of instructions, you group related data and behavior into &lt;em&gt;objects&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🤖 Think of a robot toy. It has &lt;strong&gt;properties&lt;/strong&gt; (color, height, battery) and &lt;strong&gt;behaviors&lt;/strong&gt; (walk, talk, wave). In OOP, that robot is an object — and the blueprint used to build it is called a &lt;strong&gt;class&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Two key terms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Class&lt;/strong&gt; — the blueprint (template)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Object&lt;/strong&gt; — a real instance built from the blueprint&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Four Pillars
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pillar&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Inheritance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A child class inherits properties and behaviors from a parent class&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Encapsulation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Internal data is hidden — only controlled access is allowed from outside&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Abstraction&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Complex internals are hidden; only what's needed is exposed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Polymorphism&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The same action can behave differently depending on the object&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Part 2: How Objects Relate
&lt;/h2&gt;

&lt;p&gt;Objects don't exist in isolation. They connect, collaborate, and depend on each other — and the &lt;em&gt;type&lt;/em&gt; of relationship matters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Association
&lt;/h3&gt;

&lt;p&gt;Two objects know about each other and can interact. Comes in three cardinalities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One-to-one&lt;/strong&gt; — one passport per person&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-to-many&lt;/strong&gt; — one teacher, many students&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Many-to-many&lt;/strong&gt; — many students, many courses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inside association, when one object "owns" another, the relationship is either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Aggregation&lt;/strong&gt; (loose) — the child survives without the parent. A backpack contains books, but the books still exist if you throw the backpack away.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Composition&lt;/strong&gt; (tight) — the child cannot exist without the parent. A house has rooms; demolish the house, the rooms cease to exist.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dependency
&lt;/h3&gt;

&lt;p&gt;A temporary, usage-based relationship. One class uses another inside a method but doesn't hold onto it permanently. Weaker than association.&lt;/p&gt;

&lt;h3&gt;
  
  
  Generalization &amp;amp; Realization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Generalization&lt;/strong&gt; — pulling shared traits from multiple classes into one superclass (inheritance)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Realization&lt;/strong&gt; — a class implementing an interface, promising to fulfill a defined contract&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Part 3: What Bad Design Looks Like
&lt;/h2&gt;

&lt;p&gt;Before learning the rules, it helps to understand what you're guarding against. Robert C. Martin identified three symptoms of bad design:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🪨 Rigidity&lt;/strong&gt; — the system is hard to change. Touch one thing, and a cascade of other things need updating. Developers become afraid to make changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🍪 Fragility&lt;/strong&gt; — the system breaks in unexpected places when you make a change. You fix a bug in the payment module, and somehow the email notifications stop working.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🏗️ Immobility&lt;/strong&gt; — useful components can't be reused. They're so entangled with their surroundings that extracting them would take longer than rewriting from scratch.&lt;/p&gt;

&lt;p&gt;All three share the same root cause: &lt;strong&gt;poor management of dependencies&lt;/strong&gt; between components.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 4: SOLID
&lt;/h2&gt;

&lt;p&gt;SOLID is a set of five principles that directly address the problems above. Each one targets a specific failure mode.&lt;/p&gt;




&lt;h3&gt;
  
  
  S — Single Responsibility Principle
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"A module should be responsible to one, and only one, actor."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every class should have exactly &lt;strong&gt;one reason to change&lt;/strong&gt; — it serves one actor (one group of stakeholders).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👨‍🍳 A restaurant worker who is simultaneously the chef, cashier, security guard, and delivery driver is a disaster waiting to happen. One change in one role disrupts all the others.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Split your classes. One responsibility each.&lt;/p&gt;




&lt;h3&gt;
  
  
  O — Open/Closed Principle
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"A software artifact should be open for extension but closed for modification."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Add new behavior by &lt;strong&gt;extending&lt;/strong&gt; — not by editing existing, working code.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔌 A power strip lets you plug in new devices without rewiring the strip itself. That's OCP in action.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When requirements change, slot in new code alongside the old — don't rewrite what's already working.&lt;/p&gt;




&lt;h3&gt;
  
  
  L — Liskov Substitution Principle
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"If S is a subtype of T, objects of type T may be replaced with objects of type S without altering program correctness."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A subclass must be &lt;strong&gt;fully substitutable&lt;/strong&gt; for its parent class. Every promise the parent makes, the child must keep.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🤖 If the parent robot can cook, the child robot must be able to cook too — not throw an error or silently do nothing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If your subclass has empty methods, stub implementations, or "not supported" throws — that's a Liskov violation.&lt;/p&gt;




&lt;h3&gt;
  
  
  I — Interface Segregation Principle
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Clients should not be forced to depend upon interfaces that they do not use."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Don't create fat interfaces that force classes to implement methods they don't need. &lt;strong&gt;Split interfaces&lt;/strong&gt; into smaller, focused ones.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🍴 Don't give every restaurant customer a steak knife, soup spoon, chopsticks, and a fondue skewer when they only ordered soup.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Smaller interfaces = narrower dependencies = changes stay localized.&lt;/p&gt;




&lt;h3&gt;
  
  
  D — Dependency Inversion Principle
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"High-level modules should not depend on low-level modules. Both should depend on abstractions."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Your business logic should not be hardwired to specific implementations. It should talk to &lt;strong&gt;interfaces&lt;/strong&gt; — and the low-level details implement those interfaces.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🤖 Don't solder a spatula into the robot's arm. Give the arm a standard connector, and let tools be swapped in and out.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is what makes infrastructure (databases, APIs, file systems) swappable without touching business logic.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Reference: SOLID at a Glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Principle&lt;/th&gt;
&lt;th&gt;Problem it solves&lt;/th&gt;
&lt;th&gt;Key question to ask&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SRP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Classes doing too much&lt;/td&gt;
&lt;td&gt;"Does this class serve more than one group of stakeholders?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OCP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Editing old code to add features&lt;/td&gt;
&lt;td&gt;"Can I add this as an extension instead of a modification?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LSP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Broken inheritance hierarchies&lt;/td&gt;
&lt;td&gt;"Can I swap the child for the parent without anything breaking?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ISP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fat interfaces with unused methods&lt;/td&gt;
&lt;td&gt;"Is this class forced to implement something it doesn't need?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DIP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Business logic locked to infrastructure&lt;/td&gt;
&lt;td&gt;"Does my high-level code depend on a concrete class it shouldn't?"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Where to Start
&lt;/h2&gt;

&lt;p&gt;If you're applying these for the first time:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start with SRP&lt;/strong&gt; — find your "doing too much" classes and split them&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check inheritance for LSP violations&lt;/strong&gt; — empty methods are the warning sign&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Introduce interfaces at infrastructure boundaries&lt;/strong&gt; — that's DIP in practice&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These principles aren't a checklist. They're questions to ask every time you sit down to write code.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://sanudin.dev/blog/oop-solid__part-1-what-is-oop" rel="noopener noreferrer"&gt;sanudin.dev&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>oop</category>
      <category>solid</category>
    </item>
    <item>
      <title>Dari OOP ke SOLID: Semua yang Perlu Kamu Tahu dalam Satu Artikel</title>
      <dc:creator>Sanudin</dc:creator>
      <pubDate>Sun, 24 May 2026 16:50:29 +0000</pubDate>
      <link>https://dev.to/sanudin-dev/dari-oop-ke-solid-semua-yang-perlu-kamu-tahu-dalam-satu-artikel-1b6o</link>
      <guid>https://dev.to/sanudin-dev/dari-oop-ke-solid-semua-yang-perlu-kamu-tahu-dalam-satu-artikel-1b6o</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🕐 ~8 menit baca&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📝 Catatan tentang artikel ini&lt;/strong&gt;&lt;br&gt;
Artikel ini dibuat berdasarkan catatan belajar pribadi saya tentang OOP dan prinsip SOLID. Untuk membuat catatan tersebut lebih mudah dibaca dan bermanfaat — bagi saya dan orang lain — saya menggunakan bantuan AI untuk mengembangkan dan menyusunnya menjadi artikel blog. Ide, perjalanan belajar, dan pemahamannya adalah milik saya; AI membantu di bagian penulisan dan penyajiannya.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Kode yang enak dibaca dan mudah diubah bukan kebetulan. Di balik setiap codebase yang menyenangkan untuk dikerjakan, ada sekumpulan ide yang memandu bagaimana semuanya disusun dan dihubungkan.&lt;/p&gt;

&lt;p&gt;Artikel ini membahas perjalanan lengkap itu — mulai dari apa itu OOP, bagaimana objek saling berhubungan, seperti apa desain yang buruk, hingga akhirnya: lima prinsip SOLID yang menyatukan semuanya.&lt;/p&gt;

&lt;p&gt;Yuk mulai.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bagian 1: Apa Itu OOP?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Object Oriented Programming (OOP)&lt;/strong&gt; adalah cara menulis kode yang mencerminkan dunia nyata. Alih-alih satu daftar panjang instruksi, kamu mengelompokkan data dan perilaku yang saling berkaitan ke dalam &lt;em&gt;objek&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🤖 Bayangkan mainan robot. Robot punya &lt;strong&gt;properti&lt;/strong&gt; (warna, tinggi, baterai) dan &lt;strong&gt;perilaku&lt;/strong&gt; (berjalan, berbicara, melambaikan tangan). Dalam OOP, robot itu adalah objek — dan cetak biru yang digunakan untuk membuatnya disebut &lt;strong&gt;class&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dua istilah kunci:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Class&lt;/strong&gt; — cetak biru (template)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Object&lt;/strong&gt; — wujud nyata yang dibuat dari cetak biru tersebut&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Empat Pilar OOP
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pilar&lt;/th&gt;
&lt;th&gt;Fungsinya&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Inheritance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Class anak mewarisi properti dan perilaku dari class induk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Encapsulation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Data internal disembunyikan — akses dari luar hanya melalui jalur yang ditentukan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Abstraction&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kerumitan internal disembunyikan; hanya yang perlu digunakan saja yang ditampilkan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Polymorphism&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Aksi yang sama bisa berperilaku berbeda tergantung pada objeknya&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Bagian 2: Bagaimana Objek Saling Berhubungan
&lt;/h2&gt;

&lt;p&gt;Objek tidak hidup sendiri-sendiri. Mereka terhubung, bekerja sama, dan saling bergantung — dan &lt;em&gt;jenis&lt;/em&gt; hubungannya penting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Asosiasi
&lt;/h3&gt;

&lt;p&gt;Dua objek saling mengenal dan bisa berinteraksi. Ada tiga jenis kardinalitas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One-to-one&lt;/strong&gt; — satu orang satu paspor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-to-many&lt;/strong&gt; — satu guru, banyak murid&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Many-to-many&lt;/strong&gt; — banyak murid, banyak mata pelajaran&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dalam asosiasi, ketika satu objek "memiliki" objek lain, hubungannya bisa berupa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Aggregation&lt;/strong&gt; (longgar) — objek anak bisa hidup tanpa induknya. Tas ransel berisi buku, tapi bukunya tetap ada meski tasnya dibuang.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Composition&lt;/strong&gt; (erat) — objek anak tidak bisa eksis tanpa induknya. Rumah punya kamar; hancurkan rumahnya, kamarnya ikut lenyap.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dependency
&lt;/h3&gt;

&lt;p&gt;Hubungan sementara berbasis pemakaian. Satu class memakai class lain di dalam sebuah method, tapi tidak menyimpannya secara permanen. Lebih lemah dari asosiasi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Generalization &amp;amp; Realization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Generalization&lt;/strong&gt; — mengangkat sifat-sifat yang sama dari beberapa class ke satu superclass (pewarisan)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Realization&lt;/strong&gt; — sebuah class mengimplementasikan interface, berjanji untuk memenuhi kontrak yang sudah didefinisikan&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Bagian 3: Seperti Apa Desain yang Buruk?
&lt;/h2&gt;

&lt;p&gt;Sebelum belajar aturannya, penting untuk memahami apa yang sedang kita hindari. Robert C. Martin mengidentifikasi tiga gejala desain yang buruk:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🪨 Rigidity (Kekakuan)&lt;/strong&gt; — sistem susah diubah. Sentuh satu hal, dan banyak hal lain ikut perlu diperbarui. Developer jadi takut untuk melakukan perubahan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🍪 Fragility (Kerapuhan)&lt;/strong&gt; — sistem rusak di tempat yang tidak terduga saat kamu melakukan perubahan. Kamu memperbaiki bug di modul pembayaran, tiba-tiba notifikasi email berhenti berfungsi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🏗️ Immobility (Ketidakmampuan Dipindahkan)&lt;/strong&gt; — komponen yang berguna tidak bisa dipakai ulang. Mereka terlalu kusut dengan sekitarnya sehingga mencabutnya butuh lebih lama dari menulis ulang dari awal.&lt;/p&gt;

&lt;p&gt;Ketiganya punya akar penyebab yang sama: &lt;strong&gt;pengelolaan dependensi antar komponen yang buruk&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bagian 4: SOLID
&lt;/h2&gt;

&lt;p&gt;SOLID adalah lima prinsip yang secara langsung mengatasi masalah di atas. Masing-masing menargetkan kegagalan desain yang spesifik.&lt;/p&gt;




&lt;h3&gt;
  
  
  S — Single Responsibility Principle
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Sebuah modul harus bertanggung jawab pada satu, dan hanya satu, aktor."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Setiap class harus punya tepat &lt;strong&gt;satu alasan untuk berubah&lt;/strong&gt; — ia melayani satu aktor (satu kelompok stakeholder).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👨‍🍳 Seorang pekerja restoran yang sekaligus menjadi koki, kasir, satpam, dan pengantar makanan adalah bencana yang menunggu terjadi. Perubahan di satu peran mengganggu semua peran lainnya.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pisahkan class-mu. Satu tanggung jawab per class.&lt;/p&gt;




&lt;h3&gt;
  
  
  O — Open/Closed Principle
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Artefak perangkat lunak harus terbuka untuk ditambahkan, tapi tertutup untuk dimodifikasi."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tambahkan perilaku baru dengan cara &lt;strong&gt;memperluas&lt;/strong&gt; — bukan mengedit kode lama yang sudah berjalan.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔌 Stop kontak memungkinkan kamu mencolokkan perangkat baru tanpa perlu membongkar kabelnya. Itulah OCP dalam praktik.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ketika kebutuhan berubah, tambahkan kode baru di samping yang lama — jangan tulis ulang yang sudah berjalan.&lt;/p&gt;




&lt;h3&gt;
  
  
  L — Liskov Substitution Principle
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Jika S adalah subtipe dari T, objek bertipe T bisa digantikan dengan objek bertipe S tanpa mengubah kebenaran program."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sebuah subclass harus &lt;strong&gt;sepenuhnya bisa menggantikan&lt;/strong&gt; class induknya. Setiap janji yang dibuat induk, harus dipenuhi oleh anak.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🤖 Kalau robot induk bisa memasak, robot anak juga harus bisa memasak — bukan melempar error atau diam saja tanpa melakukan apa-apa.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Kalau subclass-mu punya method kosong, implementasi stub, atau melempar "not supported" — itu pelanggaran Liskov.&lt;/p&gt;




&lt;h3&gt;
  
  
  I — Interface Segregation Principle
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Client tidak boleh dipaksa bergantung pada interface yang tidak mereka gunakan."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Jangan buat interface besar yang memaksa class mengimplementasikan method yang tidak mereka butuhkan. &lt;strong&gt;Pecah interface&lt;/strong&gt; menjadi bagian-bagian kecil yang lebih fokus.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🍴 Jangan berikan setiap pelanggan restoran pisau steak, sendok sup, sumpit, dan tusuk fondue ketika mereka hanya memesan sup.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Interface yang lebih kecil = dependensi yang lebih sempit = perubahan tetap terlokalisir.&lt;/p&gt;




&lt;h3&gt;
  
  
  D — Dependency Inversion Principle
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Modul tingkat tinggi tidak boleh bergantung pada modul tingkat rendah. Keduanya harus bergantung pada abstraksi."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Logika bisnis tidak boleh terkait langsung dengan implementasi spesifik. Ia harus bicara dengan &lt;strong&gt;interface&lt;/strong&gt; — dan detail tingkat rendah yang mengimplementasikan interface tersebut.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🤖 Jangan solder spatula ke tangan robot. Beri tangannya konektor standar, dan biarkan alat-alatnya bisa diganti-ganti.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Inilah yang membuat infrastruktur (database, API, file system) bisa diganti tanpa menyentuh logika bisnis.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ringkasan Cepat: SOLID Sekilas
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prinsip&lt;/th&gt;
&lt;th&gt;Masalah yang diatasi&lt;/th&gt;
&lt;th&gt;Pertanyaan kuncinya&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SRP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Class mengerjakan terlalu banyak hal&lt;/td&gt;
&lt;td&gt;"Apakah class ini melayani lebih dari satu kelompok stakeholder?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OCP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mengedit kode lama untuk menambah fitur&lt;/td&gt;
&lt;td&gt;"Bisakah ini ditambahkan sebagai ekstensi, bukan modifikasi?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LSP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hirarki pewarisan yang rusak&lt;/td&gt;
&lt;td&gt;"Bisakah anak menggantikan induk tanpa ada yang rusak?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ISP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Interface gemuk dengan method yang tidak dipakai&lt;/td&gt;
&lt;td&gt;"Apakah class ini dipaksa mengimplementasikan sesuatu yang tidak dibutuhkan?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DIP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Logika bisnis terikat ke infrastruktur&lt;/td&gt;
&lt;td&gt;"Apakah kode tingkat tinggi bergantung pada class konkret yang seharusnya tidak?"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Mulai dari Mana?
&lt;/h2&gt;

&lt;p&gt;Kalau kamu baru pertama kali menerapkan ini:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Mulai dengan SRP&lt;/strong&gt; — cari class yang "mengerjakan terlalu banyak" dan pecah&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Periksa pewarisan untuk pelanggaran LSP&lt;/strong&gt; — method kosong adalah tanda peringatannya&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tambahkan interface di batas infrastruktur&lt;/strong&gt; — itulah DIP dalam praktik&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Prinsip-prinsip ini bukan checklist. Mereka adalah pertanyaan yang perlu kamu ajukan setiap kali duduk untuk menulis kode.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://sanudin.dev/blog/oop-solid__part-1-what-is-oop" rel="noopener noreferrer"&gt;sanudin.dev&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>oop</category>
      <category>solid</category>
    </item>
  </channel>
</rss>
