<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Rosihan Ari&#039;s Blog</title>
	<atom:link href="https://blog.rosihanari.net/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.rosihanari.net</link>
	<description>Never say &#039;hard&#039; to coding</description>
	<lastBuildDate>Mon, 17 Mar 2025 15:30:08 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://blog.rosihanari.net/wp-content/uploads/2019/08/cropped-240_F_84782312_N0KVq2xYRWolilxK4004VfdEyDUQKflX-1-32x32.jpg</url>
	<title>Rosihan Ari&#039;s Blog</title>
	<link>https://blog.rosihanari.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>OOP Python: Konsep Enkapsulasi</title>
		<link>https://blog.rosihanari.net/oop-python-konsep-enkapsulasi/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=oop-python-konsep-enkapsulasi</link>
					<comments>https://blog.rosihanari.net/oop-python-konsep-enkapsulasi/#respond</comments>
		
		<dc:creator><![CDATA[Rosihan Ari Yuana]]></dc:creator>
		<pubDate>Mon, 17 Mar 2025 15:30:07 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[python oop]]></category>
		<guid isPermaLink="false">https://blog.rosihanari.net/?p=6934</guid>

					<description><![CDATA[<p>Enkapsulasi (encapsulation) adalah sebuah fitur dalam object-oriented programming (OOP) yang sangat penting. Melalui fitur ini, kita bisa membatasi akses langsung terhadap atribut sebuah obyek sehingga validitas data yang bisa diassign ke dalam atribut tersebut bisa lebih terjamin. Artikel ini membahas tentang enkapsulasi, mulai dari contoh masalah yang membutuhkan enkapsulasi, apa pengertiannya, apa saja manfaatnya, serta...</p>
The post <a href="https://blog.rosihanari.net/oop-python-konsep-enkapsulasi/">OOP Python: Konsep Enkapsulasi</a> first appeared on <a href="https://blog.rosihanari.net">Rosihan Ari's Blog</a>.]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Enkapsulasi (<em>encapsulation</em>) adalah sebuah fitur dalam <em>object-oriented programming</em> (OOP) yang sangat penting. Melalui fitur ini, kita bisa membatasi akses langsung terhadap atribut sebuah obyek sehingga validitas data yang bisa diassign ke dalam atribut tersebut bisa lebih terjamin.</p>



<p class="wp-block-paragraph">Artikel ini membahas tentang enkapsulasi, mulai dari contoh masalah yang membutuhkan enkapsulasi, apa pengertiannya, apa saja manfaatnya, serta bagaimana implementasinya di Python</p>



<span id="more-6934"></span>



<h2 class="wp-block-heading">Contoh Masalah yang Membutuhkan Enkapsulasi</h2>



<p class="wp-block-paragraph">Bayangkan misalkan kita sedang membuat sebuah program untuk mengelola data bank. Dalam program tersebut, kita memiliki class <code>BankAccount</code> yang menyimpan informasi penting seperti saldo akun. Tentu saja, saldo akun ini adalah informasi sensitif yang tidak boleh dimanipulasi secara langsung dari luar class karena bisa menimbulkan masalah keamanan.</p>



<p class="wp-block-paragraph">Sebagai contoh, jika seseorang bisa mengakses atau mengubah saldo akun secara langsung, maka integritas data bisa terganggu. Ini bisa menyebabkan saldo menjadi negatif atau terjadi perubahan tanpa izin yang dapat membahayakan sistem keuangan.</p>



<p class="wp-block-paragraph">Perhatikan contoh kode program Python berikut ini</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
class BankAccount:
    def __init__(self, pemilik, saldo_awal):
        self.pemilik = pemilik
        self.saldo = saldo_awal

   # Metode untuk menambah saldo
    def deposit(self, jumlah):
        if jumlah &gt; 0:
            self.saldo += jumlah
            print(f&quot;Saldo bertambah: {jumlah}, Saldo sekarang: {self.saldo}&quot;)
        else:
            print(&quot;Jumlah deposit harus positif!&quot;)

    # Metode untuk menarik saldo
    def withdraw(self, jumlah):
        if jumlah &gt; 0 and jumlah &lt;= self.saldo:
            self.saldo -= jumlah
            print(f&quot;Berhasil menarik: {jumlah}, Saldo sekarang: {self.saldo}&quot;)
        else:
            print(&quot;Penarikan gagal: saldo tidak mencukupi atau jumlah tidak valid&quot;)

# Contoh Penggunaan
akun = BankAccount(&quot;Budi&quot;, 1000)
akun.deposit(500)        # Menambah saldo menjadi 1500
akun.withdraw(1000)      # Menarik saldo menjadi 500

# mengeset saldo menjadi minus
akun.saldo = -100000 

</pre></div>


<p class="wp-block-paragraph">Dari contoh di atas tampak bahwa atribut <code>saldo</code> dapat langsung diakses dan diubah nilainya menjadi minus. Seharusnya hal ini tidak dibolehkan secara sistem, karena data yang diassign ke dalam <code>saldo</code> tidaklah valid. Untuk itu perlu mekanisme guna mencegah supaya atribut saldo ini tidak bisa langsung diakses. Di sinilah pentingnya penerapan enkapsulasi.</p>



<h2 class="wp-block-heading">Pengertian Enkapsulasi</h2>



<p class="wp-block-paragraph">Enkapsulasi adalah salah satu prinsip utama dalam Pemrograman Berorientasi Objek (PBO) yang bertujuan untuk <strong>membatasi akses langsung ke data pada atribut</strong> dalam sebuah objek dan <strong>hanya memperbolehkan akses melalui method tertentu </strong>yang telah disediakan.</p>



<p class="wp-block-paragraph">Konsep enkapsulasi memungkinkan untuk:</p>



<ul class="wp-block-list">
<li>Menyembunyikan detail implementasi (data dan logika) dari luar class.</li>



<li>Membatasi akses langsung ke atribut</li>



<li>Menjaga data tetap konsisten dan aman dengan validasi internal.</li>
</ul>



<h2 class="wp-block-heading">Prosedur Penerapan Enkapsulasi di Python</h2>



<p class="wp-block-paragraph">Untuk menerapkan enkapsulasi dalam Python, kita dapat menggunakan pendekatan berikut:</p>



<ol class="wp-block-list">
<li><strong>Gunakan prefix double underscore (<code>__</code>)</strong> untuk mendefinisikan atribut atau metode sebagai <em>private</em> (hanya boleh diakses oleh class itu sendiri).</li>



<li><strong>Sediakan method getter dan setter</strong> untuk mengakses atau memanipulasi atribut private secara aman. Method getter digunakan untuk mengakses nilai atribut yang disembunyikan tersebut. Adapun method setter digunakan untuk mengassign nilai kepada atribut yang disembunyikan.</li>
</ol>



<h2 class="wp-block-heading">Contoh Penerapan Enkapsulasi dalam Python</h2>



<p class="wp-block-paragraph">Sekarang, mari kita selesaikan masalah pada contoh kasus di awal dengan menerapkan enkapsulasi:</p>



<h3 class="wp-block-heading">Masalah:</h3>



<p class="wp-block-paragraph">Saldo akun dalam <code>BankAccount</code> bisa diubah dari luar class, sehingga rawan dimanipulasi dan menyebabkan kerugian.</p>



<h3 class="wp-block-heading">Solusi dengan Enkapsulasi:</h3>



<ol class="wp-block-list">
<li>Sembunyikan atribut <code>saldo</code> dengan modifier <code>private</code> (<code>__</code>).</li>



<li>Buat metode <code>get_saldo()</code> dan <code>set_saldo()</code> untuk membaca dan mengubah saldo dengan validasi.</li>
</ol>



<p class="wp-block-paragraph">Berikut adalah implementasi dalam Python:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
class BankAccount:
    def __init__(self, pemilik, saldo_awal):
        self.pemilik = pemilik
        self.__saldo = saldo_awal

    # Method getter untuk membaca saldo (tanpa bisa diubah langsung)
    def get_saldo(self):
        return self.__saldo
    
    # Method setter untuk memperbarui saldo dengan validasi
    def set_saldo(self, jumlah):
        if jumlah &lt; 0:
            print(&quot;Jumlah saldo tidak boleh negatif!&quot;)
        else:
            self.__saldo = jumlah
            print(f&quot;Saldo berhasil diperbarui menjadi: {self.__saldo}&quot;)

    # Metode untuk menambah saldo
    def deposit(self, jumlah):
        if jumlah &gt; 0:
            self.__saldo += jumlah
            print(f&quot;Saldo bertambah: {jumlah}, Saldo sekarang: {self.__saldo}&quot;)
        else:
            print(&quot;Jumlah deposit harus positif!&quot;)

    # Metode untuk menarik saldo
    def withdraw(self, jumlah):
        if jumlah &gt; 0 and jumlah &lt;= self.__saldo:
            self.__saldo -= jumlah
            print(f&quot;Berhasil menarik: {jumlah}, Saldo sekarang: {self.__saldo}&quot;)
        else:
            print(&quot;Penarikan gagal: saldo tidak mencukupi atau jumlah tidak valid&quot;)

# Contoh Penggunaan
akun = BankAccount(&quot;Budi&quot;, 1000)
print(akun.get_saldo())  # Output: 1000

akun.set_saldo(2000)     # Update saldo
akun.deposit(500)        # Menambah saldo
akun.withdraw(1000)      # Menarik saldo

# Akses langsung ke atribut __saldo akan error
# print(akun.__saldo)   # AttributeError: 'BankAccount' object has no attribute '__saldo'

</pre></div>


<p class="wp-block-paragraph">Berikut ini beberapa penjelasan kode:</p>



<ol class="wp-block-list">
<li><code>__saldo</code> adalah atribut private yang tidak bisa diakses langsung dari luar class.</li>



<li><code>get_saldo()</code> adalah method getter untuk membaca saldo.</li>



<li><code>set_saldo()</code> adalah method setter yang memvalidasi nilai sebelum memperbarui saldo.</li>



<li><code>deposit()</code> dan <code>withdraw()</code> adalah metode untuk memanipulasi saldo dengan aturan tertentu.</li>
</ol>



<p class="wp-block-paragraph">Dengan cara ini, data menjadi lebih aman karena hanya bisa dimanipulasi melalui metode yang telah ditentukan.</p>



<h2 class="wp-block-heading">Manfaat Enkapsulasi</h2>



<p class="wp-block-paragraph">Berdasarkan penjelasan di atas, kita bisa memahami bahwa penerapan enkapsulasi memberikan banyak manfaat, antara lain: </p>



<ul class="wp-block-list">
<li>Perlindungan Data: Data sensitif hanya bisa diakses melalui method tertentu.</li>



<li>Validasi Data: Mencegah data yang tidak valid masuk ke dalam atribut.</li>



<li>Keamanan dan Konsistensi: Data tetap aman dan konsisten karena akses langsung dibatasi.</li>
</ul>The post <a href="https://blog.rosihanari.net/oop-python-konsep-enkapsulasi/">OOP Python: Konsep Enkapsulasi</a> first appeared on <a href="https://blog.rosihanari.net">Rosihan Ari's Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.rosihanari.net/oop-python-konsep-enkapsulasi/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SOLID Principles: Dependency Inversion Principle dalam Pemrograman</title>
		<link>https://blog.rosihanari.net/konsep-solid-dependency-inversion-principle-dalam-pemrograman/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=konsep-solid-dependency-inversion-principle-dalam-pemrograman</link>
					<comments>https://blog.rosihanari.net/konsep-solid-dependency-inversion-principle-dalam-pemrograman/#respond</comments>
		
		<dc:creator><![CDATA[Rosihan Ari Yuana]]></dc:creator>
		<pubDate>Tue, 11 Mar 2025 22:57:30 +0000</pubDate>
				<category><![CDATA[Coding Tips]]></category>
		<category><![CDATA[solid principles]]></category>
		<guid isPermaLink="false">https://blog.rosihanari.net/?p=6914</guid>

					<description><![CDATA[<p>Dalam pengembangan perangkat lunak, menjaga kode agar tetap mudah dirawat dan dapat diperluas merupakan tantangan yang tidak mudah. Hal ini menjadi alasan utama mengapa Prinsip SOLID dijadikan standar dalam pemrograman berorientasi objek (OOP). Pada artikel ini, kita akan membahas prinsip kelima dalam SOLID, yaitu Dependency Inversion Principle (DIP). Apa Itu Prinsip SOLID? Prinsip SOLID adalah...</p>
The post <a href="https://blog.rosihanari.net/konsep-solid-dependency-inversion-principle-dalam-pemrograman/">SOLID Principles: Dependency Inversion Principle dalam Pemrograman</a> first appeared on <a href="https://blog.rosihanari.net">Rosihan Ari's Blog</a>.]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Dalam pengembangan perangkat lunak, menjaga kode agar tetap mudah dirawat dan dapat diperluas merupakan tantangan yang tidak mudah. Hal ini menjadi alasan utama mengapa Prinsip SOLID dijadikan standar dalam pemrograman berorientasi objek (OOP). </p>



<p class="wp-block-paragraph">Pada artikel ini, kita akan membahas prinsip kelima dalam SOLID, yaitu <strong>Dependency Inversion Principle (DIP)</strong>.</p>



<span id="more-6914"></span>



<h2 class="wp-block-heading">Apa Itu Prinsip SOLID?</h2>



<p class="wp-block-paragraph">Prinsip SOLID adalah kumpulan dari lima prinsip desain dalam pemrograman berorientasi objek (OOP) yang bertujuan untuk membuat kode menjadi lebih mudah dipelihara, diperluas, dan scalable. Prinsip ini pertama kali diperkenalkan oleh Robert C. Martin (Uncle Bob) pada awal tahun 2000-an dan menjadi fondasi utama dalam pengembangan perangkat lunak modern yang bersifat modular dan berbasis kontrak.</p>



<p class="wp-block-paragraph">Prinsip SOLID terdiri dari lima konsep utama:</p>



<ol class="wp-block-list">
<li><strong><a href="https://blog.rosihanari.net/solid-principles-pentingnya-single-responsibility-principle-dalam-koding/" title="">Single Responsibility Principle (SRP)</a></strong>: Setiap class harus memiliki satu tanggung jawab saja.</li>



<li><strong><a href="https://blog.rosihanari.net/solid-principles-memahami-open-closed-principle-ocp/" title="">Open/Closed Principle (OCP)</a></strong>: Kode harus terbuka untuk dikembangkan, tetapi tertutup untuk modifikasi.</li>



<li><strong><a href="https://blog.rosihanari.net/solid-principles-memahami-prinsip-liskov-substitution/" title="">Liskov Substitution Principle (LSP)</a></strong>: Objek turunan harus bisa menggantikan objek induknya tanpa mengubah perilaku yang diharapkan.</li>



<li><strong><a href="https://blog.rosihanari.net/solid-principles-apa-itu-interface-segregation-principle/" title="">Interface Segregation Principle (ISP)</a></strong>: Developer tidak boleh dipaksa untuk mengimplementasikan interface yang tidak mereka gunakan.</li>



<li><strong>Dependency Inversion Principle (DIP)</strong>: Class-level dependency harus diarahkan ke abstraksi, bukan ke implementasi konkret.</li>
</ol>



<p class="wp-block-paragraph">Prinsip SOLID sangat penting karena membantu developer dalam menulis kode yang <em>clean</em>, mudah dibaca, dan mudah dikelola. Dengan menerapkan prinsip ini, kode menjadi lebih fleksibel terhadap perubahan, lebih mudah untuk dikembangkan tanpa memodifikasi kode yang sudah ada, dan lebih terstruktur untuk pengembangan perangkat lunak berskala besar. </p>



<p class="wp-block-paragraph">Selain itu, Prinsip SOLID juga membantu dalam mengurangi ketergantungan antar komponen, sehingga perubahan pada satu bagian kode tidak akan secara langsung mempengaruhi bagian kode lainnya. </p>



<p class="wp-block-paragraph">Selain itu, dengan desain yang lebih modular, kode menjadi lebih mudah untuk diuji (<em>testable</em>) dan mempermudah proses <em>debugging</em> serta <em>maintenance</em>. Dengan menerapkan SOLID, developer juga dapat membangun sistem yang lebih tahan terhadap perubahan dan memiliki performa yang lebih stabil dalam jangka panjang.</p>



<h2 class="wp-block-heading">Dependency Inversion Principle (DIP)</h2>



<p class="wp-block-paragraph">Dependency Inversion Principle (DIP) adalah prinsip kelima dalam konsep SOLID yang menyatakan bahwa <strong>modul tingkat tinggi (<em>high-level module</em>) tidak boleh bergantung langsung pada modul tingkat rendah (<em>low-level module</em>)</strong>. Sebaliknya, <strong>keduanya harus bergantung pada abstraksi</strong>. </p>



<p class="wp-block-paragraph">Prinsip DIP bertujuan untuk mengurangi ketergantungan antar komponen dalam kode dan meningkatkan fleksibilitas serta modularitas sistem. Dalam pengembangan perangkat lunak, modul tingkat tinggi biasanya berisi logika bisnis utama, sementara modul tingkat rendah berisi detail implementasi seperti pengambilan data dari database, pengiriman notifikasi, atau interaksi dengan API eksternal. </p>



<p class="wp-block-paragraph">Jika modul tingkat tinggi bergantung langsung pada detail implementasi dari modul tingkat rendah, maka setiap perubahan pada implementasi di level rendah dapat menyebabkan perubahan besar di level tinggi, yang akan mempersulit proses pengembangan dan pemeliharaan kode. </p>



<p class="wp-block-paragraph">Dengan menggunakan abstraksi sebagai penghubung antar modul, developer dapat mengganti atau memodifikasi implementasi <em>low-level</em> tanpa mempengaruhi logika utama di <em>high-level module</em>, sehingga kode menjadi lebih fleksibel dan mudah diperbarui.</p>



<h3 class="wp-block-heading">Contoh Kode yang Salah (Pelanggaran DIP)</h3>



<h4 class="wp-block-heading">Java</h4>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
class LayananNotifikasi {
    public void kirimNotifikasi(String pesan) {
        System.out.println(&quot;Mengirim notifikasi: &quot; + pesan);
    }
}

class Aplikasi {
    private LayananNotifikasi layanan;

    public Aplikasi() {
        layanan = new LayananNotifikasi(); // Ketergantungan langsung ke kelas konkret
    }

    public void proses() {
        layanan.kirimNotifikasi(&quot;Pesan baru dari aplikasi&quot;);
    }
}
</pre></div>


<h4 class="wp-block-heading">Python</h4>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
class LayananNotifikasi:
    def kirim_notifikasi(self, pesan):
        print(f&quot;Mengirim notifikasi: {pesan}&quot;)

class Aplikasi:
    def __init__(self):
        self.layanan = LayananNotifikasi()  # Ketergantungan langsung ke class konkret
    
    def proses(self):
        self.layanan.kirim_notifikasi(&quot;Pesan baru dari aplikasi&quot;)

# Membuat objek dan menjalankan proses
app = Aplikasi()
app.proses()

</pre></div>


<p class="wp-block-paragraph">Masalah pada Kode di Atas:</p>



<p class="wp-block-paragraph">Apabila dilihat, class <code>Aplikasi</code> bergantung langsung pada <code>LayananNotifikasi</code>, maka:</p>



<ul class="wp-block-list">
<li>Jika kita ingin mengganti metode pengiriman notifikasi (misalnya melalui email atau SMS), maka kita harus mengubah kode di <code>Aplikasi</code>. Tentu saja hal ini melanggar prinsip <a href="https://blog.rosihanari.net/solid-principles-memahami-open-closed-principle-ocp/" title="">OCP</a>.</li>



<li>Sulit untuk diuji, karena kita harus membuat obyek/instance dari <code>LayananNotifikasi</code>.</li>



<li>Kode menjadi kurang fleksibel dan sulit dikembangkan.</li>
</ul>



<p class="wp-block-paragraph">Lumayan juga dampaknya ya jika class <code>Aplikasi</code> bergantung langsung pada class <code>LayananNotifikasi</code>.</p>



<p class="wp-block-paragraph">OK sekarang kita perbaiki struktur kode programnya dengan menerapkan DIP.</p>



<h3 class="wp-block-heading">Contoh Kode yang Benar (Mengikuti DIP)</h3>



<p class="wp-block-paragraph">Untuk memperbaiki pelanggaran tersebut, kita bisa membuat interface (abstraksi) untuk <code>LayananNotifikasi</code>. Selanjutnya menghubungkan <code>Aplikasi</code> ke interface, bukan ke class yang konkret.</p>



<h4 class="wp-block-heading">Java</h4>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
interface LayananNotifikasi {
    void kirimNotifikasi(String pesan);
}

class LayananEmail implements LayananNotifikasi {
    public void kirimNotifikasi(String pesan) {
        System.out.println(&quot;Mengirim Email: &quot; + pesan);
    }
}

class Aplikasi {
    private LayananNotifikasi layanan;

    public Aplikasi(LayananNotifikasi layanan) {
        this.layanan = layanan;
    }

    public void proses() {
        layanan.kirimNotifikasi(&quot;Pesan baru dari aplikasi&quot;);
    }
}

public class Main {
    public static void main(String&#x5B;] args) {
        LayananNotifikasi layanan = new LayananEmail();
        Aplikasi app = new Aplikasi(layanan);
        app.proses();
    }
}
</pre></div>


<h4 class="wp-block-heading">Python</h4>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
from abc import ABC, abstractmethod

class LayananNotifikasi(ABC):
    @abstractmethod
    def kirim_notifikasi(self, pesan):
        pass

class LayananEmail(LayananNotifikasi):
    def kirim_notifikasi(self, pesan):
        print(f&quot;Mengirim Email: {pesan}&quot;)

class Aplikasi:
    def __init__(self, layanan):
        self.layanan = layanan
    
    def proses(self):
        self.layanan.kirim_notifikasi(&quot;Pesan baru dari aplikasi&quot;)

# Membuat objek dari LayananEmail
layanan = LayananEmail()
app = Aplikasi(layanan)
app.proses()

</pre></div>


<p class="wp-block-paragraph">Dengan menerapkan DIP, kode yang sebelumnya memiliki ketergantungan langsung pada detail implementasi di level rendah diubah agar hanya bergantung pada abstraksi. Dalam hal ini, modul tingkat tinggi (<em>high-level module</em>) hanya akan berinteraksi dengan interface atau <em>abstract class</em>, sehingga tidak terikat dengan implementasi konkret di level rendah. </p>



<p class="wp-block-paragraph">Perbaikan tersebut memungkinkan developer dengan mudah mengganti atau memperbarui detail implementasi tanpa harus memodifikasi logika utama. Selain itu, proses pengujian menjadi lebih mudah karena pengembang dapat membuat mock atau stub dari interface tanpa harus berurusan dengan detail implementasi. Dengan demikian, kode menjadi lebih modular dan reusable, karena pengembangan fitur baru atau penggantian teknologi dapat dilakukan tanpa mengganggu struktur utama kode. Perbaikan ini juga meningkatkan skalabilitas sistem karena komponen dapat diatur ulang atau diperbarui tanpa menimbulkan efek domino pada sistem secara keseluruhan.</p>



<h2 class="wp-block-heading">Strategi Implementasi DIP</h2>



<p class="wp-block-paragraph">Untuk menerapkan Dependency Inversion Principle dengan baik, seorang pengembang perlu membuat abstraksi dalam bentuk interface atau abstract class yang berfungsi sebagai penghubung antara modul tingkat tinggi dan modul tingkat rendah. Hal ini disebabkan karena secara prinsip modul tingkat tinggi tidak boleh membuat obyek/<em>instance</em> langsung dari class konkret, melainkan harus menerima dependensi dari luar. </p>



<p class="wp-block-paragraph">Ketergantungan pada class konkret harus digantikan dengan ketergantungan pada abstraksi, sehingga implementasi detail di modul tingkat rendah dapat dengan mudah diganti atau diperbarui tanpa mempengaruhi modul tingkat tinggi.</p>



<h2 class="wp-block-heading">Kapan Class Butuh DIP?</h2>



<p class="wp-block-paragraph">Class yang membutuhkan Dependency Inversion Principle biasanya memiliki ketergantungan langsung pada class konkret di level bawah, yang menyebabkan kode menjadi rapuh terhadap perubahan. Jika suatu class sering kali mengalami perubahan hanya karena ada modifikasi pada detail implementasi di level rendah, maka ini adalah indikasi kuat bahwa class tersebut perlu dipisahkan dari ketergantungan langsung dengan menggunakan abstraksi. </p>



<p class="wp-block-paragraph">Class yang sulit untuk diuji karena memiliki banyak ketergantungan pada class konkret juga memerlukan penerapan DIP. </p>



<p class="wp-block-paragraph">Selain itu, class yang memiliki banyak ketergantungan yang sulit dikonfigurasi ulang atau sulit untuk diganti juga merupakan kandidat yang ideal untuk penerapan DIP. </p>The post <a href="https://blog.rosihanari.net/konsep-solid-dependency-inversion-principle-dalam-pemrograman/">SOLID Principles: Dependency Inversion Principle dalam Pemrograman</a> first appeared on <a href="https://blog.rosihanari.net">Rosihan Ari's Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.rosihanari.net/konsep-solid-dependency-inversion-principle-dalam-pemrograman/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SOLID Principles: Pentingnya Prinsip Interface Segregation dalam Coding</title>
		<link>https://blog.rosihanari.net/solid-principles-apa-itu-interface-segregation-principle/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=solid-principles-apa-itu-interface-segregation-principle</link>
					<comments>https://blog.rosihanari.net/solid-principles-apa-itu-interface-segregation-principle/#respond</comments>
		
		<dc:creator><![CDATA[Rosihan Ari Yuana]]></dc:creator>
		<pubDate>Sat, 08 Mar 2025 09:36:38 +0000</pubDate>
				<category><![CDATA[Coding Tips]]></category>
		<category><![CDATA[solid principles]]></category>
		<guid isPermaLink="false">https://blog.rosihanari.net/?p=6897</guid>

					<description><![CDATA[<p>Interface Segregation Principle (ISP) adalah salah satu prinsip SOLID yang menyatakan bahwa sebuah interface tidak boleh memaksa pengembang untuk mengimplementasikan method yang tidak mereka butuhkan. Jika sebuah interface memiliki terlalu banyak metode yang tidak relevan, maka harus dipecah menjadi beberapa interface yang lebih kecil dan spesifik. Dengan menerapkan ISP, kode menjadi lebih modular, mudah dipelihara,...</p>
The post <a href="https://blog.rosihanari.net/solid-principles-apa-itu-interface-segregation-principle/">SOLID Principles: Pentingnya Prinsip Interface Segregation dalam Coding</a> first appeared on <a href="https://blog.rosihanari.net">Rosihan Ari's Blog</a>.]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Interface Segregation Principle (ISP) adalah salah satu prinsip SOLID yang menyatakan bahwa sebuah interface tidak boleh memaksa pengembang untuk mengimplementasikan method yang tidak mereka butuhkan. Jika sebuah interface memiliki terlalu banyak metode yang tidak relevan, maka harus dipecah menjadi beberapa interface yang lebih kecil dan spesifik. Dengan menerapkan ISP, kode menjadi lebih modular, mudah dipelihara, dan fleksibel. </p>



<p class="wp-block-paragraph">Artikel ini membahas secara mendalam tentang prinsip ISP dalam SOLID.</p>



<span id="more-6897"></span>



<h2 class="wp-block-heading">Apa Itu Prinsip SOLID?</h2>



<p class="wp-block-paragraph">Prinsip SOLID adalah kumpulan dari lima prinsip desain dalam pemrograman berorientasi objek (OOP) yang bertujuan untuk membuat kode menjadi lebih mudah dipelihara, diperluas, dan scalable. Prinsip ini pertama kali diperkenalkan oleh Robert C. Martin (Uncle Bob) pada awal tahun 2000-an dan menjadi landasan dalam pengembangan perangkat lunak modern.</p>



<p class="wp-block-paragraph">Prinsip SOLID terdiri dari lima konsep utama:</p>



<ol class="wp-block-list">
<li><strong><a href="https://blog.rosihanari.net/solid-principles-pentingnya-single-responsibility-principle-dalam-koding/" title="">Single Responsibility Principle (SRP)</a></strong>: Setiap class harus memiliki satu tanggung jawab saja.</li>



<li><strong><a href="https://blog.rosihanari.net/solid-principles-memahami-open-closed-principle-ocp/" title="">Open/Closed Principle (OCP)</a></strong>: Kode harus terbuka untuk perluasan, tetapi tertutup untuk modifikasi.</li>



<li><strong><a href="https://blog.rosihanari.net/solid-principles-memahami-prinsip-liskov-substitution/" title="">Liskov Substitution Principle (LSP)</a></strong>: Objek turunan harus bisa menggantikan objek induknya tanpa mengubah perilaku yang diharapkan.</li>



<li><strong>Interface Segregation Principle (ISP)</strong>: Tidak boleh ada paksaan untuk mengimplementasikan interface yang tidak digunakan.</li>



<li><strong><a href="https://blog.rosihanari.net/konsep-solid-dependency-inversion-principle-dalam-pemrograman/" title="">Dependency Inversion Principle (DIP)</a></strong> → Ketergantungan harus diarahkan pada abstraksi, bukan pada implementasi konkret.</li>
</ol>



<h2 class="wp-block-heading">Mengapa Perlu Prinsip SOLID?</h2>



<p class="wp-block-paragraph">Mengapa sih kok perlu prinsip SOLID ini segala dalam coding menggunakan OOP? Iya dong, karena hasil codingan kita kan ke depannya tidak hanya digunakan dan dikembangkan kita sendiri? Bisa jadi codingan kita kelak akan digunakan dan dikembangkan oleh orang lain, bahkan oleh tim pengembang.</p>



<p class="wp-block-paragraph">Dengan demikian perlu semacam penyamaan persepsi dan standarisasi yang disepakati bersama yang tujuan utamanya untuk memudahkan dalam pengembangan kode ke depannya, melalui sebuah prinsip tertentu.</p>



<p class="wp-block-paragraph">Secara umum, beberapa alasan dan manfaat prinsip SOLID ini antara lain:</p>



<ul class="wp-block-list">
<li>Mengurangi ketergantungan antar komponen</li>



<li>Meningkatkan fleksibilitas kode</li>



<li>Mempermudah proses perbaikan dan pengembangan</li>



<li>Mengurangi potensi <em>bug</em> dan <em>error </em>akibat perubahan kode</li>



<li>Meningkatkan kemudahan untuk menguji (<em>testability</em>)</li>
</ul>



<p class="wp-block-paragraph">Intinya bahwa prinsip SOLID membantu developer untuk menulis kode yang lebih bersih, mudah dibaca, dan lebih mudah dikelola dalam jangka panjang.</p>



<h2 class="wp-block-heading">Interface Segregation Principle (ISP)</h2>



<p class="wp-block-paragraph">Prinsip <strong>Interface Segregation</strong> menyatakan bahwa <strong>sebuah antarmuka (interface) tidak boleh memaksa klien untuk mengimplementasikan metode yang tidak mereka butuhkan</strong>.</p>



<p class="wp-block-paragraph">Artinya, sebuah interface harus dibuat sesuai kebutuhan klien dengan metode yang relevan saja, sehingga klien tidak dibebani dengan metode yang tidak mereka butuhkan.</p>



<p class="wp-block-paragraph">Jika sebuah interface memiliki terlalu banyak method yang tidak relevan bagi pengembang, maka:</p>



<ul class="wp-block-list">
<li>Akan muncul method kosong pada implementasi klien.</li>



<li>Jika ada perubahan pada method yang tidak digunakan, codingan pengembang bisa ikut terdampak.</li>



<li>Kode menjadi sulit untuk dipelihara karena pengembang dipaksa mematuhi kontrak yang tidak diperlukan (efek penggunaan interface).</li>
</ul>



<h3 class="wp-block-heading"><strong>Contoh Kode yang Salah (Pelanggaran ISP)</strong></h3>



<p class="wp-block-paragraph">Berikut adalah contoh kasus pelanggaran <strong>Interface Segregation Principle</strong> dalam <strong>Java</strong> dan <strong>Python</strong>:</p>



<h4 class="wp-block-heading"><strong>Java &#8211; Interface Terlalu Luas Cakupannya</strong></h4>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
// Interface yang melanggar ISP karena terlalu besar
interface Pekerjan {
    void kerja();
    void makan();
}

class Robot implements Pekerja {
    @Override
    public void kerja() {
        System.out.println(&quot;Robot sedang bekerja&quot;);
    }

    @Override
    public void makan() {
        // Robot tidak perlu makan, tetapi terpaksa mengimplementasikan metode ini
        throw new UnsupportedOperationException(&quot;Robot tidak makan&quot;);
    }
}

</pre></div>


<h4 class="wp-block-heading"><strong>Python &#8211; Interface Terlalu Luas Cakupannya</strong></h4>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
from abc import ABC, abstractmethod

class Pekerja(ABC):
    @abstractmethod
    def kerja(self):
        pass
    
    @abstractmethod
    def makan(self):
        pass

class Robot(Pekerja):
    def kerja(self):
        print(&quot;Robot sedang bekerja&quot;)
    
    def makan(self):
        raise NotImplementedError(&quot;Robot tidak makan&quot;)

</pre></div>


<p class="wp-block-paragraph">Pada contoh di atas, class <code>Robot</code> terpaksa mengimplementasikan metode <code>makan()</code> meskipun robot tidak memiliki kemampuan untuk makan. Ini adalah pelanggaran ISP karena <code>Robot</code> dipaksa untuk mengikuti kontrak yang tidak diperlukan.</p>



<h3 class="wp-block-heading"><strong>Contoh Kode yang Benar (Mengikuti ISP)</strong></h3>



<p class="wp-block-paragraph">Untuk memperbaiki pelanggaran ISP, kita bisa memisahkan interface menjadi antarmuka yang lebih kecil dan spesifik.</p>



<h4 class="wp-block-heading"><strong>Java &#8211; Interface yang Dipisah</strong></h4>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
// Interface yang terpisah sesuai tanggung jawab
interface DapatBekerja {
    void kerja();
}

interface DapatMakan {
    void makan();
}

class Manusia implements DapatBekerja, DapatMakan {
    @Override
    public void kerja() {
        System.out.println(&quot;Manusia sedang bekerja&quot;);
    }

    @Override
    public void makan() {
        System.out.println(&quot;Manusia sedang makan&quot;);
    }
}

class Robot implements DapatBekerja {
    @Override
    public void kerja() {
        System.out.println(&quot;Robot sedang bekerja&quot;);
    }
}
</pre></div>


<h4 class="wp-block-heading"><strong>Python &#8211; Interface yang Dipisah</strong></h4>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
from abc import ABC, abstractmethod

class DapatBekerja(ABC):
    @abstractmethod
    def kerja(self):
        pass

class DapatMakan(ABC):
    @abstractmethod
    def makan(self):
        pass

class Manusia(DapatBekerja, DapatMakan):
    def kerja(self):
        print(&quot;Manusia sedang bekerja&quot;)

    def makan(self):
        print(&quot;Manusia sedang makan&quot;)

class Robot(DapatBekerja):
    def work(self):
        print(&quot;Robot sedang bekerja&quot;)

</pre></div>


<p class="wp-block-paragraph">Dengan memisahkan interface menjadi <code>DapatBekerja</code> dan <code>DapatMakan</code>, setiap class hanya perlu mengimplementasikan metode yang relevan dengan kebutuhannya. Sehingga, Robot hanya mengimplementasikan <code>Workable</code>, sehingga tidak ada implementasi metode yang tidak perlu.</p>



<h2 class="wp-block-heading">Strategi Implementasi ISP</h2>



<p class="wp-block-paragraph">Untuk menerapkan Interface Segregation Principle, bisa melalui strategi berikut:</p>



<p class="wp-block-paragraph">Untuk menerapkan Interface Segregation Principle (ISP) dengan efektif, pendekatan utama yang perlu dilakukan adalah dengan memecah interface berdasarkan tanggung jawab spesifik. Sebuah interface harus dirancang agar memiliki metode yang berkaitan erat satu sama lain dan tidak saling tumpang tindih. Jika sebuah interface memiliki terlalu banyak metode dengan fungsi yang tidak saling berhubungan, maka interface tersebut perlu dipecah menjadi beberapa interface yang lebih kecil dan lebih terfokus. Dengan demikian, setiap class yang mengimplementasikan interface hanya perlu menerapkan metode yang memang relevan dengan kebutuhannya. </p>



<p class="wp-block-paragraph">Selain itu, penggunaan multiple inheritance atau multiple interface dapat menjadi solusi jika sebuah class memerlukan kombinasi dari beberapa tanggung jawab yang berbeda. Strategi ini memungkinkan class untuk mengimplementasikan metode dari beberapa interface tanpa terikat pada satu kontrak besar yang berisi metode yang tidak diperlukan. </p>



<p class="wp-block-paragraph">Penting juga untuk memastikan bahwa tidak boleh ada pengembang yang dipaksa untuk mengimplementasikan metode yang tidak digunakan. Jika dalam implementasi ditemukan metode kosong atau berisi <code>raise NotImplementedError</code>, maka ini merupakan indikasi kuat bahwa interface perlu dipisah menjadi bagian yang lebih kecil dan lebih spesifik. Dengan merancang interface yang ramping dan modular, kode akan menjadi lebih fleksibel, mudah diperluas, dan lebih mudah dipelihara dalam jangka panjang.</p>The post <a href="https://blog.rosihanari.net/solid-principles-apa-itu-interface-segregation-principle/">SOLID Principles: Pentingnya Prinsip Interface Segregation dalam Coding</a> first appeared on <a href="https://blog.rosihanari.net">Rosihan Ari's Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.rosihanari.net/solid-principles-apa-itu-interface-segregation-principle/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SOLID Principles: Pentingnya Prinsip Liskov Substitution</title>
		<link>https://blog.rosihanari.net/solid-principles-memahami-prinsip-liskov-substitution/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=solid-principles-memahami-prinsip-liskov-substitution</link>
					<comments>https://blog.rosihanari.net/solid-principles-memahami-prinsip-liskov-substitution/#respond</comments>
		
		<dc:creator><![CDATA[Rosihan Ari Yuana]]></dc:creator>
		<pubDate>Thu, 27 Feb 2025 14:51:12 +0000</pubDate>
				<category><![CDATA[Coding Tips]]></category>
		<category><![CDATA[solid principles]]></category>
		<guid isPermaLink="false">https://blog.rosihanari.net/?p=6892</guid>

					<description><![CDATA[<p>Dalam pengembangan perangkat lunak, memastikan bahwa kode tetap konsisten dan tidak menimbulkan efek samping yang tidak terduga adalah hal yang penting. Salah satu prinsip dalam SOLID Principles yang membantu mencapai tujuan ini adalah Liskov Substitution Principle (LSP). Pada artikel ini, kita akan membahas konsep LSP, mengapa prinsip ini penting, dan bagaimana mengimplementasikannya dengan baik menggunakan...</p>
The post <a href="https://blog.rosihanari.net/solid-principles-memahami-prinsip-liskov-substitution/">SOLID Principles: Pentingnya Prinsip Liskov Substitution</a> first appeared on <a href="https://blog.rosihanari.net">Rosihan Ari's Blog</a>.]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Dalam pengembangan perangkat lunak, memastikan bahwa kode tetap konsisten dan tidak menimbulkan efek samping yang tidak terduga adalah hal yang penting. Salah satu prinsip dalam SOLID Principles yang membantu mencapai tujuan ini adalah <strong>Liskov Substitution Principle</strong> (LSP). Pada artikel ini, kita akan membahas konsep LSP, mengapa prinsip ini penting, dan bagaimana mengimplementasikannya dengan baik menggunakan contoh dalam Java dan Python.</p>



<span id="more-6892"></span>



<h2 class="wp-block-heading">Apa Itu SOLID Principles?</h2>



<p class="wp-block-paragraph">SOLID adalah kumpulan lima prinsip desain dalam Object-Oriented Programming (OOP) yang bertujuan untuk membuat kode lebih mudah dibaca, dipelihara, dan diperluas tanpa menyebabkan perubahan besar yang dapat merusak sistem. SOLID terdiri dari:</p>



<ol class="wp-block-list">
<li><strong>S</strong> &#8211; <a href="https://blog.rosihanari.net/solid-principles-pentingnya-single-responsibility-principle-dalam-koding/" title="">Single Responsibility Principle (<strong>SRP</strong>)</a></li>



<li><strong>O</strong> &#8211; <a href="https://blog.rosihanari.net/solid-principles-memahami-open-closed-principle-ocp/" title="">Open-Closed Principle (<strong>OCP</strong>)</a></li>



<li><strong>L</strong> &#8211; <a href="https://blog.rosihanari.net/solid-principles-memahami-prinsip-liskov-substitution/" title="">Liskov Substitution Principle (<strong>LSP</strong>)</a></li>



<li><strong>I</strong> &#8211; <a href="https://blog.rosihanari.net/konsep-solid-dependency-inversion-principle-dalam-pemrograman/" title="">Interface Segregation Principle (<strong>ISP</strong>)</a></li>



<li><strong>D</strong> &#8211; <a href="https://blog.rosihanari.net/konsep-solid-dependency-inversion-principle-dalam-pemrograman/" title="">Dependency Inversion Principle (<strong>DIP</strong>)</a></li>
</ol>



<h3 class="wp-block-heading">Mengapa SOLID Principles Penting?</h3>



<p class="wp-block-paragraph">Penerapan SOLID Principles membantu dalam membangun sistem perangkat lunak yang lebih modular, fleksibel, dan mudah diuji. Dengan menerapkan prinsip-prinsip ini, kita dapat mengurangi kompleksitas kode, meningkatkan skalabilitas, dan menghindari berbagai masalah umum dalam pengembangan perangkat lunak, seperti kode yang terlalu tergantung satu sama lain atau sulit diperbaiki.</p>



<h2 class="wp-block-heading">Apa Itu Liskov Substitution Principle (LSP)?</h2>



<p class="wp-block-paragraph"><strong>Liskov Substitution Principle (LSP)</strong> menyatakan bahwa <strong>subclass harus dapat menggantikan superclass tanpa mengubah perilaku atau behavior atau method  yang diharapkan dari program</strong>. Dengan kata lain, jika suatu kelas induk (superclass) dapat digunakan dalam suatu konteks, maka semua kelas turunannya juga harus dapat digunakan dalam konteks yang sama tanpa menyebabkan error atau perubahan yang tidak terduga.</p>



<h3 class="wp-block-heading">Mengapa Liskov Substitution Principle Penting?</h3>



<p class="wp-block-paragraph">Tanpa LSP, subclass dapat mengubah perilaku dasar yang diharapkan dari superclass, yang dapat menyebabkan bug tersembunyi dan membuat kode menjadi sulit dipahami serta dipelihara. Dengan menerapkan LSP, kode menjadi lebih konsisten, dapat diuji dengan mudah, dan lebih fleksibel dalam pengembangan jangka panjang.</p>



<h2 class="wp-block-heading">Contoh Bad Practice (Melanggar LSP)</h2>



<p class="wp-block-paragraph">Mari kita lihat contoh kode dalam Java dan Python yang melanggar prinsip Liskov Substitution.</p>



<h3 class="wp-block-heading"><strong>Java</strong> (Melanggar LSP)</h3>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
class Bird {
    void fly() {
        System.out.println(&quot;Burung bisa terbang&quot;);
    }
}

class Penguin extends Bird {
    void fly() {
        throw new UnsupportedOperationException(&quot;Penguin tidak dapat terbang&quot;);
    }
}

</pre></div>


<p class="wp-block-paragraph"><strong>Masalah:</strong> Jika kode kita mengasumsikan bahwa semua objek dari kelas <code>Bird</code> bisa terbang, tetapi objek dari <code>Penguin</code> tidak bisa, maka ini melanggar LSP. Jika ada kode yang mengandalkan <code>fly()</code>, maka saat menerima objek <code>Penguin</code>, akan terjadi error.</p>



<h3 class="wp-block-heading"><strong>Python</strong> (Melanggar LSP)</h3>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
class Bird:
    def fly(self):
        print(&quot;Burung bisa terbang&quot;)

class Penguin(Bird):
    def fly(self):
        raise Exception(&quot;Penguin tidak bisa terbang&quot;)

</pre></div>


<p class="wp-block-paragraph"><strong>Masalah:</strong> Sama seperti contoh Java, <code>Penguin</code> tidak bisa terbang tetapi tetap mewarisi metode <code>fly()</code>. Ini dapat menyebabkan bug jika kode lain mengasumsikan bahwa semua <code>Bird</code> bisa terbang.</p>



<h2 class="wp-block-heading">Contoh Good Practice (Mengikuti LSP)</h2>



<p class="wp-block-paragraph">Untuk memperbaiki masalah di atas, kita perlu memastikan bahwa subclass tidak mengubah kontrak yang didefinisikan oleh superclass.</p>



<h3 class="wp-block-heading"><strong>Java</strong> (Mengikuti LSP)</h3>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
class Bird {}

class FlyingBird extends Bird {
    void fly() {
        System.out.println(&quot;This bird is flying&quot;);
    }
}

class Sparrow extends FlyingBird {}

class Penguin extends Bird {}
</pre></div>


<p class="wp-block-paragraph">Sekarang, hanya burung yang bisa terbang yang memiliki metode <code>fly()</code>. <code>Penguin</code> tidak perlu mewarisi metode ini dan tidak akan menyebabkan error.</p>



<h3 class="wp-block-heading"><strong>Python</strong> (Mengikuti LSP)</h3>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
class Bird:
    pass

class FlyingBird(Bird):
    def fly(self):
        print(&quot;This bird is flying&quot;)

class Sparrow(FlyingBird):
    pass

class Penguin(Bird):
    pass

</pre></div>


<p class="wp-block-paragraph">Nah.. Sekarang, <code>Penguin</code> tidak lagi memiliki metode <code>fly()</code>, sehingga kode tetap konsisten dengan LSP.</p>



<h2 class="wp-block-heading">Manfaat dari Penerapan Liskov Substitution Principle</h2>



<p class="wp-block-paragraph">Dengan menerapkan LSP, kita mendapatkan berbagai manfaat sebagai berikut:</p>



<ul class="wp-block-list">
<li>Menghindari error yang tidak terduga akibat subclass yang tidak kompatibel dengan superclass.</li>



<li>Memastikan bahwa semua subclass dapat digunakan tanpa mempengaruhi perilaku yang diharapkan dari superclass.</li>



<li>Mempermudah pengujian karena kita tahu bahwa semua subclass akan bekerja dengan cara yang sama seperti superclass.</li>
</ul>



<h2 class="wp-block-heading">Ciri-ciri Class yang Perlu Menerapkan LSP</h2>



<p class="wp-block-paragraph">Tidak semua class harus diuji terhadap LSP, akan tetapi class yang memiliki ciri berikut sebaiknya mematuhi prinsip ini: (1) Class yang digunakan sebagai dasar untuk inheritance (misalnya <code>Animal</code>, <code>Vehicle</code>, <code>Shape</code>); (2) Class yang sering digunakan dalam polimorfisme (misalnya dalam desain berbasis antarmuka); (3) Class yang memiliki metode yang bisa berbeda implementasinya pada subclass; (4) Class yang sering digunakan dalam berbagai konteks sistem yang berbeda</p>



<p class="wp-block-paragraph">Pada artikel berikutnya, kita akan membahas prinsip keempat dalam SOLID: Interface Segregation Principle (ISP). Pastikan Anda mengikuti <a href="https://blog.rosihanari.net" title="">blog ini</a> agar tidak ketinggalan pembahasannya!</p>The post <a href="https://blog.rosihanari.net/solid-principles-memahami-prinsip-liskov-substitution/">SOLID Principles: Pentingnya Prinsip Liskov Substitution</a> first appeared on <a href="https://blog.rosihanari.net">Rosihan Ari's Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.rosihanari.net/solid-principles-memahami-prinsip-liskov-substitution/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SOLID Principles: Memahami Open-Closed Principle</title>
		<link>https://blog.rosihanari.net/solid-principles-memahami-open-closed-principle-ocp/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=solid-principles-memahami-open-closed-principle-ocp</link>
					<comments>https://blog.rosihanari.net/solid-principles-memahami-open-closed-principle-ocp/#respond</comments>
		
		<dc:creator><![CDATA[Rosihan Ari Yuana]]></dc:creator>
		<pubDate>Wed, 19 Feb 2025 09:34:44 +0000</pubDate>
				<category><![CDATA[Coding Tips]]></category>
		<category><![CDATA[solid principles]]></category>
		<guid isPermaLink="false">https://blog.rosihanari.net/?p=6875</guid>

					<description><![CDATA[<p>Dalam dunia pengembangan perangkat lunak, menjaga kode agar tetap mudah dipelihara dan diperluas adalah tantangan besar. Inilah alasan mengapa SOLID Principles menjadi standar dalam pemrograman berorientasi objek (OOP). Setelah artikel sebelumnya yang membahas prinsip pertama tentang Single Responsibility Principle (SRP), pada artikel ini kita akan membahas Open-Closed Principle (OCP), yaitu prinsip kedua dalam SOLID. Apa...</p>
The post <a href="https://blog.rosihanari.net/solid-principles-memahami-open-closed-principle-ocp/">SOLID Principles: Memahami Open-Closed Principle</a> first appeared on <a href="https://blog.rosihanari.net">Rosihan Ari's Blog</a>.]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Dalam dunia pengembangan perangkat lunak, menjaga kode agar tetap mudah dipelihara dan diperluas adalah tantangan besar. Inilah alasan mengapa SOLID Principles menjadi standar dalam pemrograman berorientasi objek (OOP). Setelah artikel sebelumnya yang membahas prinsip pertama tentang <a href="https://blog.rosihanari.net/solid-principles-pentingnya-single-responsibility-principle-dalam-koding/" title="">Single Responsibility Principle (SRP)</a>, pada artikel ini kita akan membahas <strong>Open-Closed Principle (OCP)</strong>, yaitu prinsip kedua dalam SOLID.</p>



<span id="more-6875"></span>



<h2 class="wp-block-heading">Apa Itu SOLID Principles?</h2>



<p class="wp-block-paragraph">SOLID adalah lima prinsip desain dalam <em>Object-Oriented Programming</em> (OOP) yang bertujuan untuk membuat kode lebih mudah dibaca, dipelihara, dan diperluas tanpa menyebabkan perubahan besar pada kode yang sudah ada. SOLID sendiri adalah akronim dari:</p>



<ol start="1" class="wp-block-list">
<li><strong>S</strong> &#8211; <em><a href="https://blog.rosihanari.net/solid-principles-pentingnya-single-responsibility-principle-dalam-koding/" title="">Single Responsibility Principle</a></em> (SRP)</li>



<li><strong>O</strong> &#8211; <em><a href="https://blog.rosihanari.net/solid-principles-memahami-open-closed-principle-ocp/" title="">Open-Closed Principle</a></em> (OCP)</li>



<li><strong>L</strong> &#8211; <em><a href="https://blog.rosihanari.net/solid-principles-memahami-prinsip-liskov-substitution/" title="">Liskov Substitution Principle</a></em> (LSP)</li>



<li><strong>I</strong> &#8211; <em><a href="https://blog.rosihanari.net/solid-principles-apa-itu-interface-segregation-principle/" title="">Interface Segregation Principle</a></em> (ISP)</li>



<li><strong>D</strong> &#8211; <a href="https://blog.rosihanari.net/konsep-solid-dependency-inversion-principle-dalam-pemrograman/" title=""><em>Dependency Inversion Principle</em> (DIP)</a></li>
</ol>



<h3 class="wp-block-heading">Mengapa SOLID Principles Penting?</h3>



<p class="wp-block-paragraph">SOLID Principles sangat penting dalam pengembangan perangkat lunak karena membantu menciptakan kode yang lebih terstruktur, modular, dan mudah dipelihara. Dengan menerapkan prinsip-prinsip ini, pengembang dapat menghindari kode yang terlalu kompleks dan sulit untuk diperbarui. Selain itu, SOLID Principles mempermudah kolaborasi dalam tim, karena kode yang mengikuti prinsip ini lebih mudah dipahami oleh berbagai anggota tim. Tidak hanya itu, prinsip ini juga meningkatkan efisiensi pengujian dan <em>debugging</em>, karena setiap bagian kode memiliki tanggung jawab yang jelas dan tidak bercampur dengan bagian lain. Dengan menjaga kode tetap fleksibel dan stabil, SOLID Principles membantu memastikan bahwa perangkat lunak dapat berkembang tanpa menyebabkan banyak perubahan yang tidak perlu, sehingga mengurangi risiko <em>bug</em> dan meningkatkan produktivitas pengembang.</p>



<h2 class="wp-block-heading">Apa Itu Open-Closed Principle (OCP)?</h2>



<p class="wp-block-paragraph"><strong>Open-Closed Principle</strong> menyatakan bahwa <strong>kode harus bersifat terbuka untuk ekstensi (pengembangan/perluasan), akan tetapi tertutup untuk modifikasi</strong>. Artinya, kita harus bisa menambahkan fitur baru tanpa harus mengubah kode yang sudah ada.</p>



<h3 class="wp-block-heading">Mengapa Open-Closed Principle Penting?</h3>



<p class="wp-block-paragraph">Tanpa OCP, kita akan sering mengubah kode lama setiap kali ada fitur baru, yang dapat menyebabkan bug tak terduga. Dengan menerapkan OCP, kita dapat memperluas sistem tanpa menyentuh kode lama, sehingga mengurangi risiko kesalahan.</p>



<h2 class="wp-block-heading">Contoh <em>Bad Practice</em> (Melanggar OCP)</h2>



<p class="wp-block-paragraph">Mari kita lihat contoh Java dan Python di mana prinsip Open-Closed dilanggar.</p>



<h3 class="wp-block-heading"><strong>Java</strong> (Melanggar OCP)</h3>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
class PaymentProcessor {
    void processPayment(String type) {
        if (type.equals(&quot;CreditCard&quot;)) {
            System.out.println(&quot;Memproses pembayaran Credit Card&quot;);
        } else if (type.equals(&quot;PayPal&quot;)) {
            System.out.println(&quot;Memproses pembayaran PayPal&quot;);
        }
    }
}
</pre></div>


<p class="wp-block-paragraph"><strong>Masalah:</strong> Jika kita ingin menambahkan metode pembayaran baru (misalnya Bitcoin), kita harus mengedit kelas ini. Ini melanggar OCP karena memodifikasi kode lama setiap kali ada fitur baru.</p>



<h3 class="wp-block-heading"><strong>Python</strong> (Melanggar OCP)</h3>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
class PaymentProcessor:
    def process_payment(self, method):
        if method == &quot;credit_card&quot;:
            print(&quot;Memproses pembayaran Credit Card&quot;)
        elif method == &quot;paypal&quot;:
            print(&quot;Memproses pembayaran PayPal&quot;)
</pre></div>


<p class="wp-block-paragraph"><strong>Masalah:</strong> Jika ingin menambahkan metode pembayaran lain, kita harus mengubah kode dalam <code>process_payment</code>, yang bisa berisiko menyebabkan bug.</p>



<h2 class="wp-block-heading">Contoh <em>Good Practice</em> (Mengikuti OCP)</h2>



<p class="wp-block-paragraph">Mari kita lihat bagaimana menggunakan OCP dengan baik dengan cara membuat abstraksi agar kode mudah diperluas tanpa mengubah yang sudah ada.</p>



<h3 class="wp-block-heading"><strong>Java</strong> (Mengikuti OCP)</h3>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
interface PaymentMethod {
    void pay();
}

class CreditCardPayment implements PaymentMethod {
    public void pay() {
        System.out.println(&quot;Memproses pembayaran Credit Card&quot;);
    }
}

class PayPalPayment implements PaymentMethod {
    public void pay() {
        System.out.println(&quot;Memproses pembayaran PayPal&quot;);
    }
}

class PaymentProcessor {
    void processPayment(PaymentMethod method) {
        method.pay();
    }
}
</pre></div>


<p class="wp-block-paragraph">Sekarang, jika kita ingin menambahkan metode pembayaran lain, kita hanya perlu membuat class baru tanpa mengubah <code>PaymentProcessor</code>!</p>



<h3 class="wp-block-heading"><strong>Python</strong> (Mengikuti OCP)</h3>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
from abc import ABC, abstractmethod

class PaymentMethod(ABC):
    @abstractmethod
    def pay(self):
        pass

class CreditCardPayment(PaymentMethod):
    def pay(self):
        print(&quot;Memproses pembayaran Credit Card&quot;)

class PayPalPayment(PaymentMethod):
    def pay(self):
        print(&quot;Memproses pembayaran PayPal&quot;)

class PaymentProcessor:
    def process_payment(self, method: PaymentMethod):
        method.pay()
</pre></div>


<p class="wp-block-paragraph">Keterangan: Dalam Python, untuk membuat abstract class dibutuhkan modul ABC (<em>abstract base classes</em>)</p>



<p class="wp-block-paragraph">Dengan pendekatan ini, kita bisa menambahkan metode pembayaran baru hanya dengan membuat class baru, tanpa menyentuh <code>PaymentProcessor</code>.</p>



<h2 class="wp-block-heading">Manfaat dari Penerapan Open-Closed Principle</h2>



<p class="wp-block-paragraph">Apa sih manfaatnya OCP? Dengan menerapkan OCP, paling tidak kita mendapatkan beberapa manfaat berikut:</p>



<ul class="wp-block-list">
<li>Mempermudah penambahan fitur baru tanpa merusak kode lama.</li>



<li>Mengurangi risiko bug akibat perubahan pada kode lama.</li>



<li>Membuat kode lebih bersifat modular dan mudah diperluas.</li>



<li>Memudahkan testing dan maintenance.</li>
</ul>



<p class="wp-block-paragraph">Nah.. banyak kan manfaatnya?</p>



<h2 class="wp-block-heading">Ciri-ciri Class yang Perlu Menerapkan OCP</h2>



<p class="wp-block-paragraph">Apa semua class memerlukan OCP ini? Tentu tidak.. Tidak semua class membutuhkan OCP, akan tetapi class yang memiliki ciri berikut sebaiknya menerapkan prinsip ini: </p>



<ul class="wp-block-list">
<li>sering diperbarui dengan fitur baru (misalnya sistem pembayaran, laporan, dan sistem rekomendasi)</li>



<li>memiliki banyak kondisi <code>if-else</code> atau <code>switch-case</code> untuk menangani banyak tipe operasi</li>



<li>memiliki dependensi (ketergantungan) tinggi terhadap logika bisnis yang sering berubah</li>



<li>sering mengalami perubahan untuk mengakomodasi permintaan baru</li>
</ul>



<p class="wp-block-paragraph">Open-Closed Principle (OCP) memastikan bahwa kode terbuka untuk perluasan (ekstensi), akan tetapi tertutup untuk modifikasi. Dengan menerapkan prinsip ini, kita dapat menambahkan fitur baru tanpa mengubah kode lama, sehingga kode lebih stabil, modular, dan mudah dipelihara.</p>



<p class="wp-block-paragraph">Pada artikel berikutnya, kita akan membahas prinsip ketiga dalam SOLID yaitu Liskov Substitution Principle (LSP). Pastikan Anda mengikuti <a href="https://blog.rosihanari.net" title="">blog ini</a> agar tidak ketinggalan pembahasannya!</p>The post <a href="https://blog.rosihanari.net/solid-principles-memahami-open-closed-principle-ocp/">SOLID Principles: Memahami Open-Closed Principle</a> first appeared on <a href="https://blog.rosihanari.net">Rosihan Ari's Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.rosihanari.net/solid-principles-memahami-open-closed-principle-ocp/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SOLID Principles: Konsep Single Responsibility dalam Koding</title>
		<link>https://blog.rosihanari.net/solid-principles-pentingnya-single-responsibility-principle-dalam-koding/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=solid-principles-pentingnya-single-responsibility-principle-dalam-koding</link>
					<comments>https://blog.rosihanari.net/solid-principles-pentingnya-single-responsibility-principle-dalam-koding/#respond</comments>
		
		<dc:creator><![CDATA[Rosihan Ari Yuana]]></dc:creator>
		<pubDate>Sun, 16 Feb 2025 07:31:20 +0000</pubDate>
				<category><![CDATA[Coding Tips]]></category>
		<category><![CDATA[solid principles]]></category>
		<guid isPermaLink="false">https://blog.rosihanari.net/?p=6866</guid>

					<description><![CDATA[<p>Dalam dunia pengembangan perangkat lunak, kode program yang baik bukan hanya tentang bagaimana ia berjalan, tetapi juga tentang bagaimana ia dapat dipelihara dan dikembangkan. Inilah mengapa SOLID Principles menjadi standar dalam praktik pemrograman berorientasi objek (OOP). Banyak perusahaan yang mengharuskan programmernya memahami SOLID Principles ini. Pada artikel pertama di blog ini, kita akan membahas prinsip...</p>
The post <a href="https://blog.rosihanari.net/solid-principles-pentingnya-single-responsibility-principle-dalam-koding/">SOLID Principles: Konsep Single Responsibility dalam Koding</a> first appeared on <a href="https://blog.rosihanari.net">Rosihan Ari's Blog</a>.]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Dalam dunia pengembangan perangkat lunak, kode program yang baik bukan hanya tentang bagaimana ia berjalan, tetapi juga tentang bagaimana ia dapat dipelihara dan dikembangkan. Inilah mengapa <strong>SOLID Principles</strong> menjadi standar dalam praktik pemrograman berorientasi objek (OOP). Banyak perusahaan yang mengharuskan programmernya memahami SOLID Principles ini. </p>



<p class="wp-block-paragraph">Pada artikel pertama di <a href="https://blog.rosihanari.net" title="">blog ini</a>, kita akan membahas prinsip pertama dalam SOLID yaitu: <strong>Single Responsibility Principle (SRP)</strong>.</p>



<span id="more-6866"></span>



<h2 class="wp-block-heading">Apa Itu SOLID Principles?</h2>



<p class="wp-block-paragraph">SOLID adalah lima prinsip desain dalam <em>Object-Oriented Programming</em> (OOP) yang bertujuan untuk membuat kode lebih mudah dibaca, dipelihara, dan diperluas tanpa menyebabkan perubahan besar pada kode yang sudah ada. SOLID sendiri adalah akronim dari:</p>



<ol start="1" class="wp-block-list">
<li><strong>S</strong> &#8211; <em><a href="https://blog.rosihanari.net/solid-principles-pentingnya-single-responsibility-principle-dalam-koding/" title="">Single Responsibility Principle</a></em> (SRP)</li>



<li><strong>O</strong> &#8211; <em><a href="https://blog.rosihanari.net/solid-principles-memahami-open-closed-principle-ocp/" title="">Open-Closed Principle</a></em> (OCP)</li>



<li><strong>L</strong> &#8211; <em><a href="https://blog.rosihanari.net/solid-principles-memahami-prinsip-liskov-substitution/" title="">Liskov Substitution Principle</a></em> (LSP)</li>



<li><strong>I</strong> &#8211; <a href="https://blog.rosihanari.net/solid-principles-apa-itu-interface-segregation-principle/" title=""><em>Interface Segregation Principle</em></a><a href="https://blog.rosihanari.net/solid-principles-apa-itu-interface-segregation-principle/" title=" (ISP)"> (ISP)</a></li>



<li><strong>D</strong> &#8211; <a href="https://blog.rosihanari.net/konsep-solid-dependency-inversion-principle-dalam-pemrograman/" title=""><em>Dependency Inversion Principle</em> (DIP)</a></li>
</ol>



<h2 class="wp-block-heading">Apa Itu Single Responsibility Principle (SRP)?</h2>



<p class="wp-block-paragraph"><strong>Single Responsibility Principle</strong> menyatakan bahwa <strong>setiap kelas harus memiliki satu tanggung jawab utama</strong>. Artinya, sebuah kelas hanya boleh memiliki satu alasan untuk berubah. Jika sebuah kelas memiliki lebih dari satu tanggung jawab, maka kode tersebut akan sulit untuk dikelola dan dipelihara.</p>



<h3 class="wp-block-heading">Kenapa SRP Itu Penting?</h3>



<p class="wp-block-paragraph">Tanpa menerapkan SRP, sebuah kode program akan menjadi <strong>monolitik</strong>, sulit diperbaiki, dan lebih rentan terhadap <em>bug</em>. Dengan SRP, kita mendapatkan keuntungan berikut:</p>



<ol class="wp-block-list">
<li>Kode lebih mudah dibaca dan dipahami </li>



<li>Lebih mudah untuk diuji secara unit testing </li>



<li>Meminimalisir efek domino saat ada perubahan </li>



<li>Kode menjadi lebih modular dan fleksibel </li>
</ol>



<h2 class="wp-block-heading">Contoh Pelanggaran SRP (<em>Bad Practice</em>)</h2>



<p class="wp-block-paragraph">Mari kita lihat contoh koding dalam bahasa Java dan Python di mana <strong>SRP dilanggar</strong>. Bayangkan kita memiliki kelas <code>Report</code> yang bertanggung jawab untuk <strong>menghasilkan laporan</strong>, <strong>mencetak laporan</strong>, dan <strong>menyimpan laporan ke database</strong>:</p>



<h3 class="wp-block-heading">Java:</h3>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
class Report {
    void generatePDF() {
        // Logika untuk membuat laporan dalam format PDF
    }

    void printReport() {
        // Logika untuk mencetak laporan
    }

    void saveToDatabase() {
        // Logika untuk menyimpan laporan ke database
    }
}

</pre></div>


<h3 class="wp-block-heading">Python:</h3>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
class Report:
    def generate_pdf(self):
        # Logika untuk membuat laporan dalam format PDF
        pass
    
    def print_report(self):
        # Logika untuk mencetak laporan
        pass
    
    def save_to_database(self):
        # Logika untuk menyimpan laporan ke database
        pass

</pre></div>


<p class="wp-block-paragraph"><strong>Masalah:</strong> Kelas <code>Report</code> menangani <strong>lebih dari satu tanggung jawab</strong>. Jika ada perubahan pada cara mencetak laporan, maka kita juga berisiko memodifikasi bagian lain yang tidak terkait, seperti penyimpanan ke database. Ini bertentangan dengan prinsip SRP.</p>



<h2 class="wp-block-heading">Cara Memperbaiki dengan SRP (<em>Good Practice</em>)</h2>



<p class="wp-block-paragraph">Untuk menerapkan <strong>Single Responsibility Principle</strong>, kita harus <strong>memisahkan tanggung jawab</strong> ke dalam kelas-kelas yang lebih spesifik.</p>



<h3 class="wp-block-heading">Java:</h3>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
class ReportGenerator {
    void generatePDF() {
        // Logika untuk membuat laporan dalam format PDF
    }
}

class ReportPrinter {
    void printReport() {
        // Logika untuk mencetak laporan
    }
}

class ReportSaver {
    void saveToDatabase() {
        // Logika untuk menyimpan laporan ke database
    }
}

</pre></div>


<h3 class="wp-block-heading">Python:</h3>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
class ReportGenerator:
    def generate_pdf(self):
        # Logika untuk membuat laporan dalam format PDF
        pass

class ReportPrinter:
    def print_report(self):
        # Logika untuk mencetak laporan
        pass

class ReportSaver:
    def save_to_database(self):
        # Logika untuk menyimpan laporan ke database
        pass

</pre></div>


<h2 class="wp-block-heading">Apa Keuntungan Penerapan SRP?</h2>



<p class="wp-block-paragraph">Setelah SRP diterapkan, apa saja sih keuntungannya?</p>



<ul class="wp-block-list">
<li>Jika ada perubahan pada cara mencetak laporan, maka kita hanya perlu mengubah <code>ReportPrinter</code>, tanpa menyentuh <code>ReportGenerator</code> atau <code>ReportSaver</code>.</li>



<li>Kode menjadi lebih mudah untuk diuji karena setiap kelas memiliki tanggung jawab yang jelas.</li>



<li><strong>Lebih fleksibel</strong> jika ke depannya kita ingin menambahkan fitur lain, seperti menyimpan laporan dalam format XML atau yang lainnya.</li>
</ul>



<h2 class="wp-block-heading">Apa Ciri Class yang Perlu Diterapkan SRP?</h2>



<p class="wp-block-paragraph">Apakah semua class dalam sebuah project perlu diterapkan SRP ini? Tentu saja tidak! Berikut ini adalah beberapa ciri-cirinya:</p>



<ol class="wp-block-list">
<li>Class yang Memiliki Lebih dari Satu Tanggung Jawab<br><br>Jika sebuah class memiliki lebih dari satu tugas utama, kemungkinan besar ia melanggar SRP. Tanda-tanda class ini adalah nama class terlalu umum atau mencakup banyak fungsi (misalnya <code>OrderManager</code>, <code>UserHandler</code>, <code>ReportProcessor</code>), atau class menangani banyak aspek dalam sistem, seperti mengolah data, menyimpan ke database, dan mencetak laporan.</li>



<li>Class yang Sering Berubah karena Alasan Berbeda<br><br>Jika sebuah class sering berubah karena berbagai alasan, itu pertanda bahwa ia menangani lebih dari satu tanggung jawab. Tanda-tanda class ini adalah saat ada perubahan kecil, banyak bagian class yang harus diedit.</li>



<li>Class yang Memiliki Nama yang Terlalu Umum atau &#8220;<em>God Class</em>&#8220;<br><br>Jika class memiliki nama seperti <code>Manager</code>, <code>Handler</code>, <code>Processor</code>, itu sering kali tanda bahwa class ini menangani banyak hal sekaligus. Tanda-tanda class ini adalah bahwa nama class sulit menggambarkan satu tanggung jawab spesifik, serta mengontrol banyak aspek sistem sekaligus.</li>
</ol>



<h2 class="wp-block-heading">Contoh Penerapan SRP dalam Proyek</h2>



<p class="wp-block-paragraph">Sekarang kita lihat bagaimana penerapan SRP ini ke dalam sebuah proyek. Misalkan kita ada proyek untuk membuat program Java dan Python untuk menghitung luas dan keliling dari beberapa bangun datar seperti persegi, persegi panjang, dan lingkaran.</p>



<h3 class="wp-block-heading">Belum Menerapkan SRP (Bad Practice)</h3>



<p class="wp-block-paragraph">Di contoh kode program dengan Java ini, satu class menangani perhitungan luas, keliling, dan juga input/output, sehingga sulit untuk diperluas dan diuji.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
import java.util.Scanner;

class ShapeCalculator {
    Scanner scanner = new Scanner(System.in);

    void calculate() {
        System.out.println(&quot;Pilih bangun datar: 1. Persegi  2. Persegi Panjang  3. Lingkaran&quot;);
        int choice = scanner.nextInt();

        switch (choice) {
            case 1:
                System.out.print(&quot;Masukkan sisi persegi: &quot;);
                double sisi = scanner.nextDouble();
                System.out.println(&quot;Luas: &quot; + (sisi * sisi));
                System.out.println(&quot;Keliling: &quot; + (4 * sisi));
                break;
            case 2:
                System.out.print(&quot;Masukkan panjang: &quot;);
                double panjang = scanner.nextDouble();
                System.out.print(&quot;Masukkan lebar: &quot;);
                double lebar = scanner.nextDouble();
                System.out.println(&quot;Luas: &quot; + (panjang * lebar));
                System.out.println(&quot;Keliling: &quot; + (2 * (panjang + lebar)));
                break;
            case 3:
                System.out.print(&quot;Masukkan jari-jari lingkaran: &quot;);
                double r = scanner.nextDouble();
                System.out.println(&quot;Luas: &quot; + (Math.PI * r * r));
                System.out.println(&quot;Keliling: &quot; + (2 * Math.PI * r));
                break;
            default:
                System.out.println(&quot;Pilihan tidak valid.&quot;);
        }
    }
}

public class Main {
    public static void main(String&#x5B;] args) {
        ShapeCalculator calculator = new ShapeCalculator();
        calculator.calculate();
    }
}
</pre></div>


<p class="wp-block-paragraph">atau jika dalam Python sebagai berikut</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
import math

class ShapeCalculator:
    def calculate(self):
        print(&quot;Pilih bangun datar: 1. Persegi  2. Persegi Panjang  3. Lingkaran&quot;)
        choice = int(input(&quot;Masukkan pilihan: &quot;))

        if choice == 1:
            sisi = float(input(&quot;Masukkan sisi persegi: &quot;))
            luas = sisi * sisi
            keliling = 4 * sisi
        elif choice == 2:
            panjang = float(input(&quot;Masukkan panjang: &quot;))
            lebar = float(input(&quot;Masukkan lebar: &quot;))
            luas = panjang * lebar
            keliling = 2 * (panjang + lebar)
        elif choice == 3:
            r = float(input(&quot;Masukkan jari-jari lingkaran: &quot;))
            luas = math.pi * r * r
            keliling = 2 * math.pi * r
        else:
            print(&quot;Pilihan tidak valid.&quot;)
            return

        print(f&quot;Luas: {luas}&quot;)
        print(f&quot;Keliling: {keliling}&quot;)

if __name__ == &quot;__main__&quot;:
    calculator = ShapeCalculator()
    calculator.calculate()
</pre></div>


<p class="wp-block-paragraph">Masalah dari kode program di atas adalah Class <code>ShapeCalculator</code> menangani banyak hal yaitu terkait dengan pengambilan input, perhitungan luas dan keliling, dan menampilkan output. Hal ini mengakibatkan sulit diuji karena semua fungsionalitas bercampur. Selain itu hal ini juga membuat kode program tidak fleksibel, jika ingin menambahkan bangun datar lain, maka harus mengedit kode utama.</p>



<h3 class="wp-block-heading">Setelah Menerapkan SRP (Good Practice)</h3>



<p class="wp-block-paragraph">Sekarang kita akan memisahkan tanggung jawab menjadi beberapa class agar lebih modular, fleksibel, dan mudah diuji.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: java; title: ; notranslate">
import java.util.Scanner;

// Abstraksi untuk semua bangun datar
interface Shape {
    double calculateArea();
    double calculatePerimeter();
}

// Implementasi Persegi
class Square implements Shape {
    private double side;

    public Square(double side) {
        this.side = side;
    }

    @Override
    public double calculateArea() {
        return side * side;
    }

    @Override
    public double calculatePerimeter() {
        return 4 * side;
    }
}

// Implementasi Persegi Panjang
class Rectangle implements Shape {
    private double length, width;

    public Rectangle(double length, double width) {
        this.length = length;
        this.width = width;
    }

    @Override
    public double calculateArea() {
        return length * width;
    }

    @Override
    public double calculatePerimeter() {
        return 2 * (length + width);
    }
}

// Implementasi Lingkaran
class Circle implements Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    public double calculateArea() {
        return Math.PI * radius * radius;
    }

    @Override
    public double calculatePerimeter() {
        return 2 * Math.PI * radius;
    }
}

// Class khusus untuk mengambil input dari user
class ShapeInput {
    private Scanner scanner = new Scanner(System.in);

    public Shape getShape() {
        System.out.println(&quot;Pilih bangun datar: 1. Persegi  2. Persegi Panjang  3. Lingkaran&quot;);
        int choice = scanner.nextInt();

        switch (choice) {
            case 1:
                System.out.print(&quot;Masukkan sisi persegi: &quot;);
                return new Square(scanner.nextDouble());
            case 2:
                System.out.print(&quot;Masukkan panjang: &quot;);
                double length = scanner.nextDouble();
                System.out.print(&quot;Masukkan lebar: &quot;);
                double width = scanner.nextDouble();
                return new Rectangle(length, width);
            case 3:
                System.out.print(&quot;Masukkan jari-jari lingkaran: &quot;);
                return new Circle(scanner.nextDouble());
            default:
                System.out.println(&quot;Pilihan tidak valid.&quot;);
                return null;
        }
    }
}

// Class khusus untuk menampilkan hasil (SRP)
class ShapePrinter {
    public static void printShapeInfo(Shape shape) {
        if (shape != null) {
            System.out.println(&quot;Luas: &quot; + shape.calculateArea());
            System.out.println(&quot;Keliling: &quot; + shape.calculatePerimeter());
        }
    }
}

// Class utama
public class Main {
    public static void main(String&#x5B;] args) {
        ShapeInput shapeInput = new ShapeInput();
        Shape shape = shapeInput.getShape();
        ShapePrinter.printShapeInfo(shape);
    }
}
</pre></div>


<p class="wp-block-paragraph">dan berikut ini adalah versi Python</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
import math

# Abstraksi untuk semua bangun datar
class Shape:
    def calculate_area(self):
        pass

    def calculate_perimeter(self):
        pass


# Implementasi Persegi
class Square(Shape):
    def __init__(self, side):
        self.side = side

    def calculate_area(self):
        return self.side * self.side

    def calculate_perimeter(self):
        return 4 * self.side


# Implementasi Persegi Panjang
class Rectangle(Shape):
    def __init__(self, length, width):
        self.length = length
        self.width = width

    def calculate_area(self):
        return self.length * self.width

    def calculate_perimeter(self):
        return 2 * (self.length + self.width)


# Implementasi Lingkaran
class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def calculate_area(self):
        return math.pi * self.radius * self.radius

    def calculate_perimeter(self):
        return 2 * math.pi * self.radius


# Class khusus untuk mengambil input dari user
class ShapeInput:
    @staticmethod
    def get_shape():
        print(&quot;Pilih bangun datar: 1. Persegi  2. Persegi Panjang  3. Lingkaran&quot;)
        choice = int(input(&quot;Masukkan pilihan: &quot;))

        if choice == 1:
            side = float(input(&quot;Masukkan sisi persegi: &quot;))
            return Square(side)
        elif choice == 2:
            length = float(input(&quot;Masukkan panjang: &quot;))
            width = float(input(&quot;Masukkan lebar: &quot;))
            return Rectangle(length, width)
        elif choice == 3:
            radius = float(input(&quot;Masukkan jari-jari lingkaran: &quot;))
            return Circle(radius)
        else:
            print(&quot;Pilihan tidak valid.&quot;)
            return None


# Class khusus untuk menampilkan hasil (SRP)
class ShapePrinter:
    @staticmethod
    def print_shape_info(shape):
        if shape:
            print(f&quot;Luas: {shape.calculate_area()}&quot;)
            print(f&quot;Keliling: {shape.calculate_perimeter()}&quot;)


# Class utama
if __name__ == &quot;__main__&quot;:
    shape = ShapeInput.get_shape()
    ShapePrinter.print_shape_info(shape)

</pre></div>


<p class="wp-block-paragraph">Dari perubahan tersebut, kita bisa merasakan benefitnya kan? Benefit yang pertama adalah kode lebih modular, di mana setiap class hanya memiliki satu tanggung jawab utama. Benefit ke dua yaitu mudah diperluas. Jika ingin menambahkan segitiga, cukup buat class <code>Triangle</code> yang mengimplementasikan <code>Shape</code> tanpa mengubah kode lain. Benefit ke tiga adalah mudah diuji, di mana kita bisa menguji class <code>Square,</code> <code>Rectangle</code>, dan <code>Circle</code> secara terpisah tanpa perlu melibatkan input/output.</p>



<p class="wp-block-paragraph">Bisa dipahami dengan mudah ya penjelasannya? Pada artikel berikutnya, kita akan membahas prinsip ke dua dalam SOLID yaitu <strong>Open/Closed Principle (OCP)</strong>. Pastikan Anda mengikuti <a href="https://blog.rosihanari.net" title="">blog ini</a> agar tidak ketinggalan pembahasannya.</p>The post <a href="https://blog.rosihanari.net/solid-principles-pentingnya-single-responsibility-principle-dalam-koding/">SOLID Principles: Konsep Single Responsibility dalam Koding</a> first appeared on <a href="https://blog.rosihanari.net">Rosihan Ari's Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.rosihanari.net/solid-principles-pentingnya-single-responsibility-principle-dalam-koding/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Uji Anova Satu Arah dengan Minitab</title>
		<link>https://blog.rosihanari.net/uji-anova-satu-arah-dengan-minitab/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=uji-anova-satu-arah-dengan-minitab</link>
					<comments>https://blog.rosihanari.net/uji-anova-satu-arah-dengan-minitab/#respond</comments>
		
		<dc:creator><![CDATA[Rosihan Ari Yuana]]></dc:creator>
		<pubDate>Tue, 12 Mar 2024 09:55:22 +0000</pubDate>
				<category><![CDATA[Data Science]]></category>
		<category><![CDATA[anova]]></category>
		<category><![CDATA[minitab]]></category>
		<category><![CDATA[statistik]]></category>
		<guid isPermaLink="false">https://blog.rosihanari.net/?p=6696</guid>

					<description><![CDATA[<p>Dalam bidang statistika atau analisis data numerik, dikenal istilah ANOVA (Analysis of Variance) atau disebut juga dengan ANAVA (Analisis Variansi). Tujuan dari ANOVA adalah untuk membandingkan rata-rata (mean) dari tiga kelompok atau lebih. Melalui dari uji ANOVA inilah akan diperiksa apakah ada perbedaan signifikan antara rata-rata kelompok. Uji ini mirip dengan uji-t (t-test), namun kelebihannya...</p>
The post <a href="https://blog.rosihanari.net/uji-anova-satu-arah-dengan-minitab/">Uji Anova Satu Arah dengan Minitab</a> first appeared on <a href="https://blog.rosihanari.net">Rosihan Ari's Blog</a>.]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Dalam bidang statistika atau analisis data numerik, dikenal istilah ANOVA (<em>Analysis of Variance</em>) atau disebut juga dengan ANAVA (Analisis Variansi). Tujuan dari ANOVA adalah untuk membandingkan rata-rata (<em>mean</em>) dari tiga kelompok atau lebih. Melalui dari uji ANOVA inilah akan diperiksa apakah ada perbedaan signifikan antara rata-rata kelompok. Uji ini mirip dengan uji-t (<em>t-test</em>), namun kelebihannya adalah mampu untuk menguji lebih dari dua kelompok (level).</p>



<p class="wp-block-paragraph">Salah satu jenis ANOVA adalah ANOVA satu arah (<em>one-way ANOVA</em>), yaitu jenis analisis variansi yang paling sederhana, di mana kita akan membandingkan rata-rata antara tiga kelompok atau lebih pada satu faktor atau satu variabel bebas. Faktor atau variabel bebas ini juga sering disebut sebagai &#8220;faktor perlakuan&#8221; karena itu adalah apa yang dimanipulasi dalam eksperimen.</p>



<p class="wp-block-paragraph">Melalui tutorial ini akan dibahas bagaimana cara melakukan uji ANOVA satu arah menggunakan salah satu software populer dalam statistika, yaitu MINITAB.</p>



<span id="more-6696"></span>



<h2 class="wp-block-heading">Contoh Kasus</h2>



<p class="wp-block-paragraph">Seorang ahli gizi telah menciptakan metode X yang telah diformulasikannya untuk menurunkan  berat badan. Selanjutnya dia ingin mengetahui, apakah metode X yang telah dikembangkannya itu benar-benar efektif untuk menurunkan berat badan, ataukah sama saja pengaruhnya dibandingkan metode lain yang telah dikembangkan orang. Untuk itu dia melakukan pengujian untuk mengetahui hal ini.</p>



<p class="wp-block-paragraph">Langkah pengujian yang dilakukannya adalah memilih metode penurunan berat badan lain yang telah dikembangkan orang, katakanlah metode A, B, dan C. Selanjutnya keempat metode tersebut (X, A, B, C) diterapkan kepada sampel 44 orang yang berbeda selama sebulan. Setelah sebulan, diperoleh data penurunan berat badan ke empat metode tersebut (dalam Kg) sebagai berikut.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-9.png"><img fetchpriority="high" decoding="async" width="387" height="352" src="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-9.png" alt="" class="wp-image-6706" style="width:255px;height:auto" srcset="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-9.png 387w, https://blog.rosihanari.net/wp-content/uploads/2024/03/image-9-300x273.png 300w, https://blog.rosihanari.net/wp-content/uploads/2024/03/image-9-110x100.png 110w" sizes="(max-width: 387px) 100vw, 387px" /></a><figcaption class="wp-element-caption">Data penurunan berat badan (Kg) dari empat metode</figcaption></figure>
</div>


<p class="wp-block-paragraph">Nah, bagaimana melakukan uji statistik untuk melihat apakah metode X yang dikembangkan di ahli gizi memiliki efektifitas yang berbeda dibandingkan metode lain, ataukah sama saja?</p>



<h2 class="wp-block-heading">Pembahasan</h2>



<p class="wp-block-paragraph">Contoh kasus di atas termasuk uji ANOVA satu arah disebabkan karena hanya ada satu faktor atau variabel bebas saja yang digunakan, yaitu metode penurunan berat badan. Variabel bebas ini terdapat 4 kelompok, yaitu metode X, A, B, dan C. Dalam hal ini, penurunan berat badan menjadi variabel terikatnya.</p>



<p class="wp-block-paragraph">Bagaimana cara melakukan uji ANOVA satu arah menggunakan Minitab? Berikut ini langkah-langkahnya.</p>



<h3 class="wp-block-heading">Langkah 1 &#8211; Entri Data</h3>



<p class="wp-block-paragraph">Masukkan data tabel di atas ke dalam worksheet Minitab. Untuk memasukkan data di atas, terdapat dua buah cara. Cara pertama adalah membedakan data antar kolom. Melalui cara ini, data dientrikan ke dalam 4 buah kolom yang berbeda dengan nama kolom yang berbeda pula. Dalam contoh ini, nama kolom diberi nama sesuai metode penurunan berat badannya.</p>



<p class="wp-block-paragraph">Dalam tutorial ini hanya akan dibahas penggunaan Minitab versi 21.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-10.png"><img decoding="async" width="441" height="437" src="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-10.png" alt="" class="wp-image-6707" style="width:273px;height:auto" srcset="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-10.png 441w, https://blog.rosihanari.net/wp-content/uploads/2024/03/image-10-300x297.png 300w, https://blog.rosihanari.net/wp-content/uploads/2024/03/image-10-150x150.png 150w, https://blog.rosihanari.net/wp-content/uploads/2024/03/image-10-101x100.png 101w, https://blog.rosihanari.net/wp-content/uploads/2024/03/image-10-120x120.png 120w" sizes="(max-width: 441px) 100vw, 441px" /></a><figcaption class="wp-element-caption">Entri data ke dalam minitab</figcaption></figure>
</div>


<p class="wp-block-paragraph">Adapun cara entri yang kedua akan dijelaskan di bagian akhir tutorial.</p>



<h3 class="wp-block-heading">Langkah 2 &#8211; Menentukan Uji Hipotesis</h3>



<p class="wp-block-paragraph">Sebelum melakukan uji ANOVA satu arah ini, terlebih dahulu kita perlu identifikasi hipotesis pengujiannya. </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ul class="wp-block-list">
<li><strong>Hipotesis null</strong>: tidak ada perbedaan mean data penurunan berat badan yang signifikan dari keempat metode</li>



<li><strong>Hipotesis alternatif</strong>: ada perbedaan mean data penurunan berat badan yang signifikan dari keempat metode</li>
</ul>
</blockquote>



<h3 class="wp-block-heading">Langkah 3 &#8211; Uji Hipotesis</h3>



<p class="wp-block-paragraph">Setelah kita definisikan hipotesisnya, langkah berikutnya adalah melakukan uji hipotesis dengan ANOVA satu arah. Untuk melakukan ini caranya adalah klik menu <strong>STAT</strong> &#8211; <strong>ANOVA</strong> &#8211; <strong>ONE WAY</strong>.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-4.png"><img decoding="async" width="594" height="184" src="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-4.png" alt="" class="wp-image-6701" style="width:387px;height:auto" srcset="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-4.png 594w, https://blog.rosihanari.net/wp-content/uploads/2024/03/image-4-300x93.png 300w, https://blog.rosihanari.net/wp-content/uploads/2024/03/image-4-150x46.png 150w" sizes="(max-width: 594px) 100vw, 594px" /></a><figcaption class="wp-element-caption">Menu akses uji ANOVA satu arah di Minitab</figcaption></figure>
</div>


<p class="wp-block-paragraph">Langkah berikutnya pada kotak dialog, pilih &#8220;<em>Response data are in a separate columns for each factor level</em>&#8220;, kemudian pada bagian <strong>Responses</strong> pilih semua nama kolom dari keempat metode. Lalu klik tombol SELECT.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-5.png"><img loading="lazy" decoding="async" width="744" height="568" src="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-5.png" alt="" class="wp-image-6702" style="width:397px;height:auto" srcset="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-5.png 744w, https://blog.rosihanari.net/wp-content/uploads/2024/03/image-5-300x229.png 300w, https://blog.rosihanari.net/wp-content/uploads/2024/03/image-5-131x100.png 131w, https://blog.rosihanari.net/wp-content/uploads/2024/03/image-5-250x190.png 250w" sizes="auto, (max-width: 744px) 100vw, 744px" /></a><figcaption class="wp-element-caption">Pilih keempat kolom metode penurunan berat badan</figcaption></figure>
</div>


<p class="wp-block-paragraph">Setelah keempat kolom dari keempat metode penurunan berat badan tersebut dimasukkan ke dalam kotak <strong>Responses</strong>, selanjutnya klik tombol <strong>COMPARISONS </strong>untuk menentukan metode dalam membandingkan <em>mean</em> dari ketiga metode.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-11.png"><img loading="lazy" decoding="async" width="736" height="564" src="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-11.png" alt="" class="wp-image-6708" style="width:399px;height:auto" srcset="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-11.png 736w, https://blog.rosihanari.net/wp-content/uploads/2024/03/image-11-300x230.png 300w, https://blog.rosihanari.net/wp-content/uploads/2024/03/image-11-130x100.png 130w" sizes="auto, (max-width: 736px) 100vw, 736px" /></a><figcaption class="wp-element-caption">Klik COMPARISONS</figcaption></figure>
</div>


<p class="wp-block-paragraph">Misalkan metode perbandingan mean yang akan digunakan adalah <em>Tukey</em>, maka pilih opsi tersebut pada kotak yang disediakan. Kita juga bisa mencoba menggunakan metode yang lain (<em>Fisher</em> atau <em>Dunnet</em>), dan hasilnya pun akan sama.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-12.png"><img loading="lazy" decoding="async" width="534" height="293" src="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-12.png" alt="" class="wp-image-6709" style="width:334px;height:auto" srcset="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-12.png 534w, https://blog.rosihanari.net/wp-content/uploads/2024/03/image-12-300x165.png 300w, https://blog.rosihanari.net/wp-content/uploads/2024/03/image-12-150x82.png 150w" sizes="auto, (max-width: 534px) 100vw, 534px" /></a><figcaption class="wp-element-caption">Pilih metode Tukey</figcaption></figure>
</div>


<p class="wp-block-paragraph">Terakhir, klik pada tombol OK.</p>



<h3 class="wp-block-heading">Langkah 4 &#8211; Baca Output</h3>



<p class="wp-block-paragraph">Selanjutnya Minitab akan menampilkan beberapa output berupa hasil uji statistiknya. Perhatikan tampilan berikut ini.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-13.png"><img loading="lazy" decoding="async" width="418" height="225" src="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-13.png" alt="" class="wp-image-6710" style="width:318px;height:auto" srcset="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-13.png 418w, https://blog.rosihanari.net/wp-content/uploads/2024/03/image-13-300x161.png 300w, https://blog.rosihanari.net/wp-content/uploads/2024/03/image-13-150x81.png 150w" sizes="auto, (max-width: 418px) 100vw, 418px" /></a><figcaption class="wp-element-caption">Informasi hipotesis yang akan diuji</figcaption></figure>
</div>


<p class="wp-block-paragraph">Gambar di atas menunjukkan hipotesis yang diuji, yaitu hipotesis nullnya semua mean penurunan berat badan semuanya sama (tidak berbeda secara signifikan), dan hipotesis alternatifnya tidak semua mean penurunan berat badan sama (ada perbedaan secara signifikan). Uji hipotesis dilakukan pada taraf signifikansi (alpha) sebesar 5%.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-14.png"><img loading="lazy" decoding="async" width="246" height="162" src="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-14.png" alt="" class="wp-image-6711" style="width:179px;height:auto" srcset="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-14.png 246w, https://blog.rosihanari.net/wp-content/uploads/2024/03/image-14-150x100.png 150w" sizes="auto, (max-width: 246px) 100vw, 246px" /></a><figcaption class="wp-element-caption">Informasi faktor dan level</figcaption></figure>
</div>


<p class="wp-block-paragraph">Informasi di atas menunjukkan banyaknya faktor dan level. Banyaknya faktor (variabel bebas) dalam kasus ini adalah 1, yaitu metode penurunan berat badan, dengan 4 level (kelompok) yaitu X, A, B, dan C.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-15.png"><img loading="lazy" decoding="async" width="417" height="216" src="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-15.png" alt="" class="wp-image-6712" style="width:282px;height:auto" srcset="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-15.png 417w, https://blog.rosihanari.net/wp-content/uploads/2024/03/image-15-300x155.png 300w, https://blog.rosihanari.net/wp-content/uploads/2024/03/image-15-150x78.png 150w" sizes="auto, (max-width: 417px) 100vw, 417px" /></a><figcaption class="wp-element-caption">Hasil uji statistik</figcaption></figure>
</div>


<p class="wp-block-paragraph">Selanjutnya tampilan di atas menunjukkan uji statistiknya. Perhatikan nilai P-Value. Berdasarkan hasil uji statistik diperoleh nilai P-Value nya adalah 0.005. Nilai ini lebih kecil dari nilai alpha (taraf signifikansi) default dari uji hipotesis, yaitu sebesar 5% atau 0.05. Secara teori, <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color"><em>jika nilai P-Value lebih kecil dari alpha, maka hipotesis null ditolak</em></mark>. Artinya dalam kasus ini disimpulkan ada perbedaan mean data penurunan berat badan yang signifikan dari keempat metode.</p>



<p class="wp-block-paragraph">Pertanyaan berikutnya adalah, jika memang terdapat perbedaan signifikan terhadap mean data penurunan berat badan dari keempat metode, maka metode manakah yang berbeda tersebut? Untuk menjawab hal ini, lihat tampilan berikut ini.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-16.png"><img loading="lazy" decoding="async" width="784" height="282" src="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-16.png" alt="" class="wp-image-6713" style="width:528px;height:auto" srcset="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-16.png 784w, https://blog.rosihanari.net/wp-content/uploads/2024/03/image-16-300x108.png 300w, https://blog.rosihanari.net/wp-content/uploads/2024/03/image-16-768x276.png 768w, https://blog.rosihanari.net/wp-content/uploads/2024/03/image-16-150x54.png 150w" sizes="auto, (max-width: 784px) 100vw, 784px" /></a><figcaption class="wp-element-caption">Pengelompokan mean tiap metode yang memiliki kesamaan</figcaption></figure>
</div>


<p class="wp-block-paragraph">Berdasarkan hasil di atas, kita bisa melihat bahwa metode A, X, dan B dianggap dalam kelompok yang sama, memiliki perbedaan mean yang tidak signifikan. Artinya ketiga metode ini memiliki keefektifan yang relatif sama dalam menurunkan berat badan. Sedangkan metode C ini juga relatif memiliki perbedaan mean yang tidak signifikan dengan metode B. Artinya kedua metode ini juga memiliki keefektifan yang relatif sama.</p>



<p class="wp-block-paragraph">Dengan demikian, dapat disimpulkan bahwa metode X yang telah dikembangkan si ahli gizi memiliki keefektifan yang relatif sama dengan metode A dan B dalam menurunkan berat badan. Namun, masih lebih efektif dibandingkan metode C.</p>



<h2 class="wp-block-heading">Alternatif Cara Entri Data</h2>



<p class="wp-block-paragraph">Selain cara entri data di Minitab di atas, data penurunan berat badan dapat pula dilakukan dengan tidak membedakannya pada kolom yang berbeda. Cukup dengan dua kolom saja. Kolom pertama berisi data penurunan berat badannya (variabel terikatnya), dan kolom kedua berisi data metode penurunan berat badannya (variabel bebasnya).</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-17.png"><img loading="lazy" decoding="async" width="252" height="731" src="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-17.png" alt="" class="wp-image-6714" style="width:164px;height:auto" srcset="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-17.png 252w, https://blog.rosihanari.net/wp-content/uploads/2024/03/image-17-103x300.png 103w, https://blog.rosihanari.net/wp-content/uploads/2024/03/image-17-34x100.png 34w" sizes="auto, (max-width: 252px) 100vw, 252px" /></a><figcaption class="wp-element-caption">Alternatif cara entri data</figcaption></figure>
</div>


<p class="wp-block-paragraph">Pada contoh di atas, kolom penurunan berat badannya diberi nama <code>Y</code>, dan kolom metodenya diberi nama <code>Metode</code>. Pada kolom metode diberi label 0, 1, 2, 3. Nilai 0 maksudnya adalah metode X, 1 untuk metode A, 2 untuk metode B, dan 3 untuk metode C. Hal ini dilakukan karena dalam Minitab data yang dientri harus numerik.</p>



<p class="wp-block-paragraph">Selanjutnya untuk melakukan uji hipotesis, caranya sama yaitu klik <strong>STAT</strong> &#8211; <strong>ANOVA</strong> &#8211; <strong>ONE WAY</strong>, hanya perbedaannya pada pengisian kotak dialognya. Isikan seperti ini.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-18.png"><img loading="lazy" decoding="async" width="740" height="216" src="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-18.png" alt="" class="wp-image-6715" style="width:466px;height:auto" srcset="https://blog.rosihanari.net/wp-content/uploads/2024/03/image-18.png 740w, https://blog.rosihanari.net/wp-content/uploads/2024/03/image-18-300x88.png 300w, https://blog.rosihanari.net/wp-content/uploads/2024/03/image-18-150x44.png 150w" sizes="auto, (max-width: 740px) 100vw, 740px" /></a><figcaption class="wp-element-caption">Pilih variabel bebas dan terikatnya</figcaption></figure>
</div>


<p class="wp-block-paragraph">Pastikan memilih &#8216;<em>Response data are in one column for all factor levels</em>&#8216;. Pada bagian <strong>Response</strong> isikan <code>Y</code> (sebagai variabel terikatnya), dan pada <strong>Factor</strong> isikan <code>Metode</code> (sebagai variabel bebasnya). Selanjutnya langkah berikutnya sama seperti sebelumnya.</p>



<p class="wp-block-paragraph">Mudah bukan melakukannya? Selamat belajar dan mencoba, semoga bermanfaat <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>The post <a href="https://blog.rosihanari.net/uji-anova-satu-arah-dengan-minitab/">Uji Anova Satu Arah dengan Minitab</a> first appeared on <a href="https://blog.rosihanari.net">Rosihan Ari's Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.rosihanari.net/uji-anova-satu-arah-dengan-minitab/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Query Multitable di MySQL (Studi Kasus)</title>
		<link>https://blog.rosihanari.net/query-multitable-di-mysql-studi-kasus/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=query-multitable-di-mysql-studi-kasus</link>
					<comments>https://blog.rosihanari.net/query-multitable-di-mysql-studi-kasus/#comments</comments>
		
		<dc:creator><![CDATA[Rosihan Ari Yuana]]></dc:creator>
		<pubDate>Mon, 18 Dec 2023 14:14:06 +0000</pubDate>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[SQL]]></category>
		<guid isPermaLink="false">https://blog.rosihanari.net/?p=6682</guid>

					<description><![CDATA[<p>Di dalam konsep basis data, hampir sebagian besar permasalahan melibatkan relasi antar tabel di dalam proses querying. Query yang melibatkan relasi antar tabel atau multitabel ini biasanya terjadi di dalam model data relasional, atau yang menggunakan relational database management system (RDBMS). Pada artikel ini akan saya coba untuk memberikan sebuah pembahasan bagaimana melakukan query multitable...</p>
The post <a href="https://blog.rosihanari.net/query-multitable-di-mysql-studi-kasus/">Query Multitable di MySQL (Studi Kasus)</a> first appeared on <a href="https://blog.rosihanari.net">Rosihan Ari's Blog</a>.]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Di dalam konsep basis data, hampir sebagian besar permasalahan melibatkan relasi antar tabel di dalam proses querying. Query yang melibatkan relasi antar tabel atau multitabel ini biasanya terjadi di dalam model data relasional, atau yang menggunakan <em>relational database management system</em> (RDBMS).</p>



<p class="wp-block-paragraph">Pada artikel ini akan saya coba untuk memberikan sebuah pembahasan bagaimana melakukan query multitable di <a href="https://blog.rosihanari.net/tag/mysql/" title="">MySQL</a>, yang akan dituangkan ke dalam sebuah studi kasus. Studi kasus yang saya angkat adalah sebuah database <strong>Car Dealer</strong>, dengan 10 buah tabel di dalamnya beserta sejumlah record di setiap tabel. Selanjutnya dari database tersebut saya akan tentukan 10 buah pertanyaan yang nantinya akan dijawab melalui hasil query. </p>



<span id="more-6682"></span>



<h2 class="wp-block-heading">Menyiapkan Database</h2>



<p class="wp-block-paragraph">Untuk keperluan studi kasus ini, pertama kita siapkan databasenya. Buatlah sebuah database di MySQL dengan nama: <strong>dbcardealer</strong>.</p>



<p class="wp-block-paragraph">Selanjutnya unduh file MySQL dump berikut ini</p>



<div class="wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex">
<div class="wp-block-button"><a class="wp-block-button__link wp-element-button" href="https://drive.google.com/file/d/1a9cU4M9cUwoKRT6nVYe4DkVLKZxjfvL5/view?usp=sharing">Download File</a></div>
</div>



<p class="wp-block-paragraph">Apabila file tersebut diekstrak, maka akan diperoleh sebuah file cardealer_new.sql. </p>



<p class="wp-block-paragraph">Langkah berikutnya silakan import file tersebut ke dalam database dbcardealer. Anda bisa melakukan hal ini melalui phpMyAdmin atau tool lainnya.</p>



<h2 class="wp-block-heading">Struktur Tabel Database</h2>



<p class="wp-block-paragraph">Setelah proses import tabel dan record sukses, akan terbentuk 10 buah tabel sebagai berikut beserta relasi antar tabelnya.</p>



<figure class="wp-block-image size-full"><a href="https://blog.rosihanari.net/wp-content/uploads/2023/12/image.png"><img loading="lazy" decoding="async" width="975" height="523" src="https://blog.rosihanari.net/wp-content/uploads/2023/12/image.png" alt="" class="wp-image-6683" srcset="https://blog.rosihanari.net/wp-content/uploads/2023/12/image.png 975w, https://blog.rosihanari.net/wp-content/uploads/2023/12/image-300x161.png 300w, https://blog.rosihanari.net/wp-content/uploads/2023/12/image-768x412.png 768w, https://blog.rosihanari.net/wp-content/uploads/2023/12/image-150x80.png 150w" sizes="auto, (max-width: 975px) 100vw, 975px" /></a></figure>



<p class="wp-block-paragraph">Database tersebut merepresentasikan sebuah perusahaan yang menyediakan layanan penjualan mobil dan layanan purna jual berupa service mobil. Perusahaan tersebut hanya menerima service dari mobil yang pernah dijualnya. </p>



<p class="wp-block-paragraph">Berikut ini adalah penjelasan masing-masing tabelnya:</p>



<ul class="wp-block-list">
<li>Tabel car: berisi data-data mobil yang sedang dijual atau pernah dijualnya </li>



<li>Tabel customer: berisi data-data pelanggan yang pernah membeli mobil</li>



<li>Tabel salesperson: berisi data para sales yang melayani penjualan mobil</li>



<li>Tabel salesinvoice: berisi transaksi penjualan mobil</li>



<li>Tabel parts: berisi data spare part yang disediakan oleh perusahaan untuk keperluan service</li>



<li>Tabel service: berisi data jenis layanan service yang ditawarkan </li>



<li>Tabel mechanic: berisi data tenaga mekanik yang akan menangani service</li>



<li>Tabel serviceticket: berisi data transaksi service yang pernah ditangani perusahaan</li>



<li>Tabel servicemechanic: berisi data tenaga mekanik yang pernah menangani service tertentu</li>



<li>Tabel partsused: berisi data sparepart yang pernah digunakan pada penanganan service tertentu</li>
</ul>



<h2 class="wp-block-heading">Problem Statements</h2>



<p class="wp-block-paragraph">Selanjutnya dari database di atas, kita akan mendapatkan informasi-informasi sebagai berikut:</p>



<ul class="wp-block-list">
<li>Siapa nama customer yang paling sering melakukan service?</li>



<li>Berapa besar total biaya jasa mekanik service untuk service ticket ID: 2?</li>



<li>Berapa besar total biaya sparepart dari service ticket ID: 2?</li>



<li>Berapa total profit dari penjualan sparepart dari service ticket ID: 2?</li>



<li>Tampilkan 5 besar waktu (bulan dan tahun) terjadi service paling banyak!</li>



<li>Siapa nama mekanik service yang paling banyak mendapat rate ‘Poor’ dari customer?</li>



<li>Siapa nama customer yang paling banyak memberi rate ‘Poor’ pada mekaniknya?</li>



<li>Tampilkan merek mobil yang jumlah servicenya lebih dari 20 kali!</li>



<li>Berapa rata-rata lama penyelesaian waktu service (dalam hari) setiap bulannya selama tahun 2018?</li>



<li>Buatlah rekap profit per bulan perusahaan dari hasil penjualan sparepart selama tahun 2018!</li>
</ul>



<h2 class="wp-block-heading">Solusi Permasalahan</h2>



<p class="wp-block-paragraph"><em><strong>Siapa nama customer yang paling sering melakukan service?</strong></em></p>



<p class="wp-block-paragraph">Untuk menjawab pertanyaan ini, kita akan membuat rekap jumlah berapa kali setiap customer pernah melakukan service. Dari data rekap ini nantinya kita sort secara <em>descending</em>. Costumer yang paling banyak melakukan service akan tampak pada data urutan pertama dari rekapnya.</p>



<p class="wp-block-paragraph">Data rekap akan kita dapatkan dengan memberikan query pada tabel: <code>customer</code>, dan <code>serviceticket</code>. Tabel <code>customer</code> untuk mendapatkan data nama customernya, dan tabel <code>serviceticket</code> untuk melihat data customer yang pernah melakukan service. Kedua tabel ini berelasi pada field <code>costumerID</code> (lihat gambar relasi antar tabel)</p>



<p class="wp-block-paragraph">Adapun querynya adalah sebagai berikut.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; gutter: false; title: ; notranslate">
SELECT customer.LastName, count(*) as JumService
FROM customer, serviceticket
WHERE customer.CustomerID = serviceticket.CustomerID
GROUP BY customer.CustomerID
ORDER BY JumService DESC
</pre></div>


<p class="wp-block-paragraph">Untuk membuat rekap jumlah berapa kali service per customer, caranya cukup menggunakan function <code>count(*)</code> yang nantinya digroup berdasarkan <code>customerID</code> nya. Di sini <code>customerID</code> dijadikan acuan dalam <em>grouping</em> karena sifatnya yang unik dari setiap customer.</p>



<p class="wp-block-paragraph">Hasil dari query di atas adalah sebagai berikut</p>



<figure class="wp-block-image size-full is-resized"><a href="https://blog.rosihanari.net/wp-content/uploads/2023/12/image-1.png"><img loading="lazy" decoding="async" width="372" height="372" src="https://blog.rosihanari.net/wp-content/uploads/2023/12/image-1.png" alt="" class="wp-image-6684" style="width:224px;height:auto" srcset="https://blog.rosihanari.net/wp-content/uploads/2023/12/image-1.png 372w, https://blog.rosihanari.net/wp-content/uploads/2023/12/image-1-300x300.png 300w, https://blog.rosihanari.net/wp-content/uploads/2023/12/image-1-150x150.png 150w, https://blog.rosihanari.net/wp-content/uploads/2023/12/image-1-100x100.png 100w, https://blog.rosihanari.net/wp-content/uploads/2023/12/image-1-120x120.png 120w" sizes="auto, (max-width: 372px) 100vw, 372px" /></a></figure>



<p class="wp-block-paragraph">Berdasarkan hasil query tersebut, tampaklah informasi bahwa yang paling sering melakukan service adalah customer dengan nama Eko.</p>



<p class="wp-block-paragraph"><strong><em>Berapa besar total biaya jasa mekanik service untuk service ticket ID: 2?</em></strong></p>



<p class="wp-block-paragraph">Untuk menjawab pertanyaan tersebut, terlebih dahulu kita tentukan tabel mana kita akan bekerja. Tabel yang akan dipilih untuk diberikan query adalah tabel: <code>service</code>, dan <code>servicemechanic</code>. Tabel <code>service</code> digunakan untuk mendapatkan data tarif service per jam nya, dan tabel <code>servicemechanic</code> untuk mendapatkan data jenis service apa saja yang dilakukan pada service ticket ID = 2. Dalam hal ini pada sebuah service ticket ID dapat dimungkinkan dilakukan beberapa layanan service yang dilakukan oleh beberapa mekanik yang berbeda. Kedua tabel ini berelasi melalui kolom <code>ServiceID</code>.</p>



<p class="wp-block-paragraph">Setelah didapatkan data layanan service apa saja yang dilakukan pada service ticket ID = 2, dan tarif service perjamnya, selanjutnya tinggal dikalikan dan akhirnya dijumlahkan dengan <code>SUM()</code> untuk mendapatkan total tarifnya. Berikut ini querynya.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; title: ; notranslate">
SELECT SUM(service.HourlyRate * servicemechanic.Hours) as TotalFee
FROM service, servicemechanic
WHERE service.ServiceID = servicemechanic.ServiceID 
		  AND servicemechanic.ServiceTicketID = '2'
</pre></div>


<p class="wp-block-paragraph">Hasil dari query di atas diperoleh IDR 5.130.000</p>



<p class="wp-block-paragraph"><strong><em>Berapa besar total biaya sparepart dari service ticket ID: 2?</em></strong></p>



<p class="wp-block-paragraph">Untuk menjawab pertanyaan ini, teknik penyelesaiannya mirip dengan pertanyaan sebelumnya. Hanya perbedaannya kita akan mencari data sparepart apa saja yang diperlukan pada service ticket ID = 2, kemudian melookup harga jualnya ke konsumen. Tabel yang akan digunakan untuk query adalah: <code>partsused</code>, dan <code>parts</code>. Tabel <code>partsused</code> nantinya untuk mendapatkan data sparepart yang digunakan pada service ticket ID tertentu, dan tabel <code>parts</code> untuk mendapatkan harga jual sparepartnya (kolom <code>RetailPrice</code>). Selanjutnya harga jual sparepart per buah ini dikalikan dengan banyaknya sparepart yang digunakan (kolom <code>NumberUsed</code>). Terakhir tinggal dijumlah total dengan <code>SUM()</code>.</p>



<p class="wp-block-paragraph">Antara tabel <code>partsused</code> dengan tabel <code>parts </code>berelasi melalui kolom <code>PartsID</code>. </p>



<p class="wp-block-paragraph">Query yang diberikan untuk menjawab pertanyaan di atas adalah sebagai berikut.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; gutter: false; title: ; notranslate">
SELECT SUM(partsused.NumberUsed * parts.RetailPrice) as TotalCost
FROM partsused, parts
WHERE partsused.PartsID = parts.PartsID 
		  AND partsused.ServiceTicketID = '2'
</pre></div>


<p class="wp-block-paragraph">Hasil dari query di atas diperoleh jawaban IDR 6.240.000</p>



<p class="wp-block-paragraph"><em><strong>Berapa total profit dari penjualan sparepart dari service ticket ID: 2?</strong></em></p>



<p class="wp-block-paragraph">Untuk menjawab pertanyaan ini, cukup memodifikasi dari query sebelumnya. Profit dari setiap penjualan sparepart dapat diperoleh dengan mencari selisih antara harga jual sparepart (RetailPrice) dengan harga beli sparepart (PurchasePrice) kemudian dikalikan dengan banyaknya quantity sparepartnya.</p>



<p class="wp-block-paragraph">Query yang diberikan adalah sebagai berikut.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; gutter: false; title: ; notranslate">
SELECT SUM(partsused.NumberUsed * (parts.RetailPrice - parts.PurchasePrice)) as TotalProfit
FROM partsused, parts
WHERE partsused.PartsID = parts.PartsID 
		  AND partsused.ServiceTicketID = '2'
</pre></div>


<p class="wp-block-paragraph">Hasil query diperoleh total profitnya adalah IDR 1.722.000</p>



<p class="wp-block-paragraph"><strong><em>Tampilkan 5 besar waktu (bulan dan tahun) terjadinya transaksi service paling banyak!</em></strong></p>



<p class="wp-block-paragraph">Untuk menjawab pertanyaan ini, kita hanya cukup menggunakan satu tabel saja untuk bekerja, yaitu tabel <code>serviceticket</code>. Dalam tabel ini terdapat data kapan transaksi service dilakukan (kolom <code>DateReceived</code>). Dalam hal ini kita akan membuat rekap jumlah transaksi berdasarkan tahun dan bulannya. Untuk waktu nanti kita akan susun dalam format <code>YYYY-MM</code>. Selanjutnya rekap data akan disort secara <em>descending</em> dan hanya akan ditampilkan 5 terbesar saja.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; gutter: false; title: ; notranslate">
SELECT CONCAT(YEAR(serviceticket.DateReceived), &quot;-&quot;, MONTH(serviceticket.DateReceived)) AS yearmonth, count(*) as Jumlah
FROM serviceticket
GROUP BY yearmonth
ORDER BY Jumlah DESC
LIMIT 0, 5
</pre></div>


<p class="wp-block-paragraph">Function <code>CONCAT()</code> digunakan untuk menggabungkan string YEAR, &#8220;-&#8220;, dan MONTH sehingga menjadi format YYYY-MM. Adapun perintah <code>LIMIT 0, 5</code> digunakan untuk membatasi tampilan 5 data saja dimulai dari data pertama (index ke-0).</p>



<p class="wp-block-paragraph">Hasil query akan diperoleh jawaban sebagai berikut.</p>



<figure class="wp-block-image size-full is-resized"><a href="https://blog.rosihanari.net/wp-content/uploads/2023/12/image-2.png"><img loading="lazy" decoding="async" width="327" height="276" src="https://blog.rosihanari.net/wp-content/uploads/2023/12/image-2.png" alt="" class="wp-image-6685" style="width:192px;height:auto" srcset="https://blog.rosihanari.net/wp-content/uploads/2023/12/image-2.png 327w, https://blog.rosihanari.net/wp-content/uploads/2023/12/image-2-300x253.png 300w, https://blog.rosihanari.net/wp-content/uploads/2023/12/image-2-118x100.png 118w" sizes="auto, (max-width: 327px) 100vw, 327px" /></a></figure>



<p class="wp-block-paragraph"><em><strong>Siapa nama mekanik service yang paling banyak mendapat rate ‘Poor’ dari customer?</strong></em></p>



<p class="wp-block-paragraph">Pertanyaan di atas dapat dijawab dengan memberikan query yang melibatkan tabel: <code>mechanic</code>, dan <code>servicemechanic</code>. Tabel <code>mechanic</code> untuk mendapatkan nama mekaniknya, dan tabel <code>servicemechanic</code> untuk mendapatkan data transaksi service yang pernah dilakukan. Data pada tabel <code>servicemechanic</code> ini nantinya kita filter hanya yang mendapat rate &#8216;Poor&#8217; saja. Selanjutnya kita buat rekap jumlah rate &#8216;Poor&#8217; untuk setiap mechanic berdasarkan <code>MechanicID</code> dan terakhir kita sort <em>descending</em>. </p>



<p class="wp-block-paragraph">Adapun kedua tabel berelasi pada kolom <code>MechanicID</code>.</p>



<p class="wp-block-paragraph">Query yang kita berikan adalah adalah sebagai berikut.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; gutter: false; title: ; notranslate">
SELECT mechanic.LastName, count(*) as JumPoor
FROM mechanic, servicemechanic
WHERE mechanic.MechanicID = servicemechanic.MechanicID
      AND servicemechanic.Rate = 'Poor'
GROUP BY mechanic.MechanicID
ORDER BY JumPoor DESC
</pre></div>


<p class="wp-block-paragraph">Output dari query di atas adalah</p>



<figure class="wp-block-image size-full is-resized"><a href="https://blog.rosihanari.net/wp-content/uploads/2023/12/image-3.png"><img loading="lazy" decoding="async" width="343" height="370" src="https://blog.rosihanari.net/wp-content/uploads/2023/12/image-3.png" alt="" class="wp-image-6688" style="width:184px;height:auto" srcset="https://blog.rosihanari.net/wp-content/uploads/2023/12/image-3.png 343w, https://blog.rosihanari.net/wp-content/uploads/2023/12/image-3-278x300.png 278w, https://blog.rosihanari.net/wp-content/uploads/2023/12/image-3-93x100.png 93w" sizes="auto, (max-width: 343px) 100vw, 343px" /></a></figure>



<p class="wp-block-paragraph">Berdasarkan hasil tersebut, tampak bahwa mekanik bernama Amir lah yang paling banyak mendapat rate &#8216;Poor&#8217;.</p>



<p class="wp-block-paragraph"><em><strong>Siapa nama customer yang paling banyak memberi rate ‘Poor’ pada mekaniknya?</strong></em></p>



<p class="wp-block-paragraph">Pertanyaan ini merupakan pengembangan dari pertanyaan sebelumnya. Tabel yang dipilih untuk menjawab pertanyaan ini adalah: <code>customer</code>, <code>servicemechanic</code>, dan <code>serviceticket</code>. Tabel <code>customer</code> untuk mendapatkan data nama customer. Tabel <code>servicemechanic</code> untuk mendapatkan data mekanik yang mendapat rate &#8216;Poor&#8217;. Serta tabel <code>serviceticket</code> untuk merelasikan antara data service dengan data costumer. Tabel <code>customer</code> dan <code>serviceticket</code> berelasi melalui kolom <code>CustomerID</code>. Adapun tabel <code>serviceticket</code> dan <code>servicemechanic</code> berelasi melalui kolom <code>ServiceTicketID</code>.</p>



<p class="wp-block-paragraph">Data hasil relasi ketiga tabel di atas nantinya akan dihitung rekapnya berdasarkan customernya, dan selanjutnya disorting secara <em>descending</em> untuk mendapatkan nama customer yang paling banyak memberikan rate &#8216;Poor&#8217; kepada mekaniknya.</p>



<p class="wp-block-paragraph">Query SQL yang diberikan adalah sebagai berikut.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; gutter: false; title: ; notranslate">
SELECT customer.LastName, count(*) as JumRatePoor
FROM customer, servicemechanic, serviceticket
WHERE customer.CustomerID = serviceticket.CustomerID
      AND servicemechanic.ServiceTicketID = serviceticket.ServiceTicketID
      AND servicemechanic.Rate = 'Poor'
GROUP BY customer.CustomerID
ORDER BY JumRatePoor DESC
</pre></div>


<p class="wp-block-paragraph">Hasil dari query tersebut adalah:</p>



<figure class="wp-block-image size-full is-resized"><a href="https://blog.rosihanari.net/wp-content/uploads/2023/12/image-4.png"><img loading="lazy" decoding="async" width="391" height="370" src="https://blog.rosihanari.net/wp-content/uploads/2023/12/image-4.png" alt="" class="wp-image-6689" style="width:197px;height:auto" srcset="https://blog.rosihanari.net/wp-content/uploads/2023/12/image-4.png 391w, https://blog.rosihanari.net/wp-content/uploads/2023/12/image-4-300x284.png 300w, https://blog.rosihanari.net/wp-content/uploads/2023/12/image-4-106x100.png 106w" sizes="auto, (max-width: 391px) 100vw, 391px" /></a></figure>



<p class="wp-block-paragraph">Berdasarkan hasil di atas, tampak bahwa customer yang paling banyak memberikan rate Poor adalah Eko.</p>



<p class="wp-block-paragraph"><strong><em>Tampilkan merek mobil yang jumlah servicenya lebih dari 20 kali!</em></strong></p>



<p class="wp-block-paragraph">Tabel yang akan dipilih untuk menjawab pertanyaan ini adalah: <code>car</code>, dan <code>serviceticket</code>. Tabel <code>car </code>untuk mendapatkan merek mobilnya (kolom <code>MAKE</code>), dan tabel <code>serviceticket</code> untuk menghitung jumlah service yang pernah terjadi. Tabel <code>car</code> dan <code>serviceticket </code>berelasi melalui kolom <code>CarID</code>.</p>



<p class="wp-block-paragraph">Adapun untuk membatasi tampilan hasil query yaitu hanya yang jumlah servicenya lebih dari 20 kali, kita akan gunakan <code>HAVING</code>. Filter dengan <code>HAVING</code> ini dilakukan karena jumlah service ini dihitung melalui rekap dari pengunaan <em>aggregate function</em> <code>COUNT()</code>.</p>



<p class="wp-block-paragraph">Berikut ini adalah query SQL nya:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; gutter: false; title: ; notranslate">
SELECT car.Make, count(*) as JumService
FROM car, serviceticket
WHERE car.CarID = serviceticket.CarID
GROUP BY car.Make
HAVING JumService &gt; 20
ORDER BY JumService DESC
</pre></div>


<p class="wp-block-paragraph">Sehingga diperoleh informasi merek mobil yang pernah diservice lebih dari 20 kali adalah sbb:</p>



<figure class="wp-block-image size-full is-resized"><a href="https://blog.rosihanari.net/wp-content/uploads/2023/12/image-5.png"><img loading="lazy" decoding="async" width="374" height="137" src="https://blog.rosihanari.net/wp-content/uploads/2023/12/image-5.png" alt="" class="wp-image-6691" style="width:199px;height:auto" srcset="https://blog.rosihanari.net/wp-content/uploads/2023/12/image-5.png 374w, https://blog.rosihanari.net/wp-content/uploads/2023/12/image-5-300x110.png 300w, https://blog.rosihanari.net/wp-content/uploads/2023/12/image-5-150x55.png 150w" sizes="auto, (max-width: 374px) 100vw, 374px" /></a></figure>



<p class="wp-block-paragraph"><strong><em>Berapa rata-rata lama penyelesaian waktu service (dalam hari) setiap bulannya selama tahun 2018?</em></strong></p>



<p class="wp-block-paragraph">Jawaban dari pertanyaan ini cukup diperoleh dari tabel serviceticket. Hal yang perlu dicari terlebih dahulu adalah lamanya durasi antara tanggal mulai service dilakukan sampai dengan tanggal diserahkannya kembali mobil ke customer. Untuk menghitung durasi dari dua tanggal ini dapat menggunakan function DATEDIFF(). Selanjutnya durasi ini nantinya akan dicari reratanya dengan AVG() dikelompokkan berdasarkan angka bulan dari tahun 2018.</p>



<p class="wp-block-paragraph">Adapun bentuk query SQL untuk implementasi ide di atas adalah sbb:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; gutter: false; title: ; notranslate">
SELECT MONTH(serviceticket.DateReceived) as Bulan, AVG(DATEDIFF(serviceticket.DateReturnedToCustomer, serviceticket.DateReceived)) as AvgService
FROM serviceticket
WHERE YEAR(serviceticket.DateReceived) = '2018'
GROUP BY Bulan
ORDER BY Bulan ASC
</pre></div>


<p class="wp-block-paragraph">Akhirnya diperoleh hasil rerata durasi lama service tiap bulan di tahun 2018 sbb:</p>



<figure class="wp-block-image size-full is-resized"><a href="https://blog.rosihanari.net/wp-content/uploads/2023/12/image-6.png"><img loading="lazy" decoding="async" width="310" height="597" src="https://blog.rosihanari.net/wp-content/uploads/2023/12/image-6.png" alt="" class="wp-image-6692" style="width:174px;height:auto" srcset="https://blog.rosihanari.net/wp-content/uploads/2023/12/image-6.png 310w, https://blog.rosihanari.net/wp-content/uploads/2023/12/image-6-156x300.png 156w, https://blog.rosihanari.net/wp-content/uploads/2023/12/image-6-52x100.png 52w" sizes="auto, (max-width: 310px) 100vw, 310px" /></a></figure>



<p class="wp-block-paragraph"><strong><em>Buatlah rekap profit per bulan perusahaan dari hasil penjualan sparepart selama tahun 2018!</em></strong></p>



<p class="wp-block-paragraph">Untuk mendapatkan besar total profit penjualan sparepart tiap bulannya adalah dengan menghitung profit per item sparepart yaitu mencari selisih harga jual (<code>RetailPrice</code>) dengan harga beli (<code>PurchasePrice</code>) dari tabel <code>parts</code>. Selanjutnya profit per item sparepart ini dikalikan dengan besar quantity nya dari kolom <code>NumberUsed</code> dari tabel <code>partsused</code> untuk mendapatkan total profit dari satu buah item. Total profit per item ini nantinya dijumlah total di setiap bulannya dengan <code>SUM()</code> dikelompokkan berdasarkan bulannya. Waktu pelaksanaan service diambil dari tabel <code>serviceticket</code>. Sehingga untuk menjawab pertanyaan ini dibutuhkan tiga tabel, yaitu: <code>serviceticket</code>, <code>parts</code>, dan <code>partsused</code>.</p>



<p class="wp-block-paragraph">Antara tabel <code>serviceticke</code>t dan <code>partsused</code> berelasi melalui kolom <code>ServiceTicketID</code>, dan antara tabel <code>parts</code> dan <code>partsused</code> berelasi melalui kolom <code>PartsID</code>.</p>



<p class="wp-block-paragraph">Berikut ini adalah query SQL nya:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: sql; gutter: false; title: ; notranslate">
SELECT MONTH(serviceticket.DateReceived) as Bulan, SUM(partsused.NumberUsed * (parts.RetailPrice-parts.PurchasePrice)) as TotalProfit
FROM serviceticket, parts, partsused
WHERE serviceticket.ServiceTicketID = partsused.ServiceTicketID
      AND parts.PartsID = partsused.PartsID
      AND YEAR(serviceticket.DateReceived) = '2018'
GROUP BY Bulan
ORDER BY Bulan ASC
</pre></div>


<p class="wp-block-paragraph">dan.. akhirnya didapatlah total profit penjualan sparepart per bulan selama tahun 2018.</p>



<figure class="wp-block-image size-full is-resized"><a href="https://blog.rosihanari.net/wp-content/uploads/2023/12/image-7.png"><img loading="lazy" decoding="async" width="300" height="588" src="https://blog.rosihanari.net/wp-content/uploads/2023/12/image-7.png" alt="" class="wp-image-6693" style="width:185px;height:auto" srcset="https://blog.rosihanari.net/wp-content/uploads/2023/12/image-7.png 300w, https://blog.rosihanari.net/wp-content/uploads/2023/12/image-7-153x300.png 153w, https://blog.rosihanari.net/wp-content/uploads/2023/12/image-7-51x100.png 51w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></figure>The post <a href="https://blog.rosihanari.net/query-multitable-di-mysql-studi-kasus/">Query Multitable di MySQL (Studi Kasus)</a> first appeared on <a href="https://blog.rosihanari.net">Rosihan Ari's Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.rosihanari.net/query-multitable-di-mysql-studi-kasus/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Teknik Sorting List Multidimensi di Python</title>
		<link>https://blog.rosihanari.net/teknik-sorting-list-multidimensi-dan-baca-file-di-python/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=teknik-sorting-list-multidimensi-dan-baca-file-di-python</link>
					<comments>https://blog.rosihanari.net/teknik-sorting-list-multidimensi-dan-baca-file-di-python/#respond</comments>
		
		<dc:creator><![CDATA[Rosihan Ari Yuana]]></dc:creator>
		<pubDate>Mon, 18 Dec 2023 02:06:52 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[list]]></category>
		<category><![CDATA[python]]></category>
		<guid isPermaLink="false">https://blog.rosihanari.net/?p=6676</guid>

					<description><![CDATA[<p>Salah satu kelebihan Python untuk keperluan datascience adalah memiliki beberapa jenis struktur data dinamis yang dapat digunakan untuk menyimpan beberapa data sekaligus dalam sebuah variabel. Beberapa di antaranya adalah: List, Array, Set, Tuple, Dictionary, dan Dataframe. Masing-masing jenis struktur data memiliki karakteristik yang berbeda. Artikel ini khusus akan membahas bagaimana melakukan sorting data list berbentuk...</p>
The post <a href="https://blog.rosihanari.net/teknik-sorting-list-multidimensi-dan-baca-file-di-python/">Teknik Sorting List Multidimensi di Python</a> first appeared on <a href="https://blog.rosihanari.net">Rosihan Ari's Blog</a>.]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Salah satu kelebihan Python untuk keperluan <a href="https://blog.rosihanari.net/category/data-science/" title=""><em>datascience</em> </a>adalah memiliki beberapa jenis struktur data dinamis yang dapat digunakan untuk menyimpan beberapa data sekaligus dalam sebuah variabel. Beberapa di antaranya adalah: List, Array, Set, Tuple, Dictionary, dan Dataframe. Masing-masing jenis struktur data memiliki karakteristik yang berbeda. </p>



<p class="wp-block-paragraph">Artikel ini khusus akan membahas bagaimana melakukan sorting data <a href="https://blog.rosihanari.net/tag/list/" title="">list</a> berbentuk multidimensi di Python, yang akan dipadu dengan teknik pembacaan data dari sebuah file.</p>



<span id="more-6676"></span>



<h2 class="wp-block-heading">Karakteristik List di Python</h2>



<p class="wp-block-paragraph">Sebagai sebuah struktur data dinamis, list memiliki beberapa karakteristik yaitu:</p>



<ul class="wp-block-list">
<li>Bersifat mutable: struktur datanya bisa diubah (ditambah, dihapus, disort, disisipkan)</li>



<li>Untuk akses data dalam list menggunakan sistem indexing yang dimulai dari 0, 1, 2, dst</li>



<li>Data yang disimpan dalam list tidak harus bertipe data sama</li>



<li>Elemen data dalam sebuah list dapat berupa list juga</li>
</ul>



<p class="wp-block-paragraph">Jika sebuah list berisi data berupa list juga, maka akibatnya akan terbentuk sebuah list multidimensi seperti contoh berikut ini.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; gutter: false; title: ; notranslate">
myList = &#x5B;&#x5B;1, 2, 3], &#x5B;4, 5, 6], &#x5B;7, 8, 9]]
</pre></div>


<p class="wp-block-paragraph">Contoh di atas akan terbentuk sebuah list dengan dimensi 3&#215;3, yang terdiri dari 3 baris dan 3 kolom. </p>



<p class="wp-block-paragraph">Misalkan kita memiliki sebuah list multidimensi berukuran <em>m</em>x<em>n</em>, bagaimana cara melakukan sorting berdasarkan key dari kolom tertentu? Sebagai contoh misalkan kita memiliki sebuah list berisi serangkaian data NIM, Nama Mhs, dan Nilai sbb:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; gutter: false; title: ; notranslate">
data = &#x5B;&#x5B;&quot;M01&quot;, &quot;Mr. A&quot;, 78], &#x5B;&quot;M02&quot;, &quot;Mr. B&quot;, 89 ], &#x5B;&quot;M03&quot;, &quot;Mr. C&quot;, 57]]
</pre></div>


<p class="wp-block-paragraph">Bagaimana cara kita melakukan sorting list data tersebut berdasarkan nilai mahasiswanya secara ascending atau descending? Hal ini yang akan kita bahas pada artikel ini.</p>



<h2 class="wp-block-heading">Problem Statement</h2>



<p class="wp-block-paragraph">Untuk menjawab permasalahan di atas, kita akan mencoba mengimplementasikannya dalam sebuah studi kasus. Misalkan kita memiliki sebuah file (<strong>mydata.txt</strong>) yang tersimpan di direktori D:\ berisi data sbb:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
K3512301#Mr. X#80
K3512302#Mr. Y#50
K3512303#Mr. Z#65
</pre></div>


<p class="wp-block-paragraph">Selanjutnya kita ingin membuat program Python untuk membaca semua data dari file tersebut, dan menampilkan outputnya dalam bentuk data yang telah terurut (<em>sorted</em>) secara <em>descending</em> berdasarkan nilainya. Sehingga harapannya akan muncul tampilan berikut ini.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
NIM: K3512301 , Name: Mr. X , Grade: 80
NIM: K3512303 , Name: Mr. Z , Grade: 65
NIM: K3512302 , Name: Mr. Y , Grade: 50
</pre></div>


<h2 class="wp-block-heading">Solusi Permasalahan</h2>



<p class="wp-block-paragraph">Untuk membuat program penyelesaian masalah di atas, kita mulai dari proses membuka file <strong>mydata.txt</strong> nya terlebih dahulu dengan function <code>open()</code> dengan mode <em>read</em> (<code>r</code>). Oya supaya tidak lupa, sekalian ditambah perintah untuk menutup filenya dengan <code>close()</code>.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; gutter: false; title: ; notranslate">
# membuka file dengan mode read (r)
myFile = open(&quot;d:\data.txt&quot;, &quot;r&quot;)

# menutup file
myFile.close()
</pre></div>


<p class="wp-block-paragraph">Langkah berikutnya adalah membaca semua isi file dengan teknik pembacaan secara baris per baris menggunakan method <code>readlines()</code>. </p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; gutter: false; title: ; notranslate">
# membuka file dengan mode read (r)
myFile = open(&quot;d:\data.txt&quot;, &quot;r&quot;)

# membaca isi file baris perbaris 
dataAll = myFile.readlines() 

# menutup file
myFile.close()
</pre></div>


<p class="wp-block-paragraph">Apabila <code>dataAll</code> ini diberikan perintah <code>print(dataAll)</code> maka akan diperoleh sebuah list berisi data perbaris file, yaitu:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
&#x5B;'K3512301#Mr. X#80\n', 'K3512302#Mr. Y#50\n', 'K3512303#Mr. Z#65\n']
</pre></div>


<p class="wp-block-paragraph">Perhatikan di dalam listnya! Pada data nilai akan terdapat tambahan karakter <em>newline</em> <code>\n</code>. Karakter ini nantinya akan kita hapus dengan teknik tertentu. Dengan demikian kita dapatkan sebuah list dengan 3 buah data di dalamnya, sesuai dengan banyaknya baris dalam file.</p>



<p class="wp-block-paragraph">Langkah berikutnya adalah memecah setiap data yang ada dalam list untuk mendapatkan NIM, Nama, dan Nilai masing-masing. Sebagai contoh untuk data <code>'K3512301#Mr. X#80\n'</code> kita akan ambil NIM nya yaitu <code>'K3512301'</code>, nama mahasiswanya <code>'Mr. X'</code>, dan nilainya <code>80</code>. Proses ini akan dilakukan berulang-ulang untuk setiap data. Sehingga ini nanti akan dilakukan dengan sebuah looping. Namun sebelum kita melakukan hal tersebut, terlebih dahulu kita siapkan sebuah list (<em>empty list</em>), misalkan kita beri nama <code>myData</code>, untuk menyimpan hasil pecahan data tersebut. </p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
# membuka file dengan mode read (r)
myFile = open(&quot;d:\data.txt&quot;, &quot;r&quot;)

# membaca isi file baris perbaris 
dataAll = myFile.readlines() 

# inisialisasi data list
myData = &#x5B;]

# menutup file
myFile.close()
</pre></div>


<p class="wp-block-paragraph">OK sekarang kita akan membuat kode untuk memecah data (<em>data splitting</em>) untuk mendapatkan NIM, Nama, dan Nilai kemudian hasil pecahannya akan kita tambahkan ke dalam list <code>myData</code>. Untuk memecah data guna mendapatkan data NIM, Nama, dan Nilai kita bisa menggunakan method <code>split('#')</code>. </p>



<p class="wp-block-paragraph">Oya untuk menghilangkan tanda \n yang ada di data nilai bagaimana? kita bisa menghilangkannya dengan method <code>replace("\n", "")</code> yaitu mengganti tanda <code>\n</code> dengan <em>blank character</em>. Setelah tanda <code>\n</code> ini dihilangkan, sebaiknya data nilai kita <em>convert</em> ke dalam tipe data integer menggunakan <code>int()</code> supaya nantinya bisa digunakan sebagai acuan proses sortingnya. Konversi ke integer ini perlu dilakukan karena data nilai ini masih bertipe data string.</p>



<p class="wp-block-paragraph">Selanjutnya misalkan data NIM, Nama, dan Nilai sudah diperoleh dari proses pemecahan data (<em>data splitting</em>), langkah berikutnya adalah menambahkan data ini ke dalam list <code>myData</code> menggunakan method <code>append()</code>. Namun ketiga data tersebut harus dikonstruksi ke dalam list dulu untuk memudahkan proses sorting. Hal ini bisa dilakukan dengan memberikan perintah <code>append([nim, nama, nilai])</code>.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
# membuka file dengan mode read (r)
myFile = open(&quot;d:\data.txt&quot;, &quot;r&quot;)

# membaca isi file baris perbaris 
dataAll = myFile.readlines() 

# inisialisasi data list
myData = &#x5B;]

# untuk setiap data pada dataAll lakukan...
for data in dataAll:
    # menghapus \n
    data = data.replace(&quot;\n&quot;, &quot;&quot;)
    # memecah data berdasarkan tanda #
    splitData = data.split(&quot;#&quot;)
    # menambahkan data hasil pecahan ke dalam list myData, dengan
    # splitData&#x5B;0] adalah data nim
    # splitData&#x5B;1] adalah data nama
    # splitData&#x5B;2] adalah data nilai
    myData.append(&#x5B;splitData&#x5B;0], splitData&#x5B;1], int(splitData&#x5B;2])])

# menutup file
myFile.close()
</pre></div>


<p class="wp-block-paragraph">Dari program di atas, apabila <code>myData</code> ditampilkan datanya dengan <code>print(myData)</code> maka akan diperoleh struktur list multidimensi berukuran 3&#215;3 sebagai berikut</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
&#x5B;&#x5B;'K3512301', 'Mr. X', 80], &#x5B;'K3512302', 'Mr. Y', 50], &#x5B;'K3512303', 'Mr. Z', 65]]
</pre></div>


<p class="wp-block-paragraph">Langkah terakhir adalah kita akan melakukan sorting <code>myData</code> berdasarkan nilainya secara <em>descending</em>. Dalam hal ini posisi data nilai ada di index ke-2 dari setiap data listnya. Untuk melakukan sorting <em>descending</em> berdasarkan data index ke-2 kita bisa gunakan perintah <code>sort(key=itemgetter(2), reverse=True)</code>. Namun untuk bisa menggunakan perintah <code>itemgetter()</code> terlebih dahulu kita harus mengimportnya dengan perintah: <code>import library from operator import itemgetter</code>.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
#import library
from operator import itemgetter

# membuka file dengan mode read (r)
myFile = open(&quot;d:\data.txt&quot;, &quot;r&quot;)

# membaca isi file baris perbaris 
dataAll = myFile.readlines() 

# inisialisasi data list
myData = &#x5B;]

# untuk setiap data pada dataAll lakukan...
for data in dataAll:
    # menghapus \n
    data = data.replace(&quot;\n&quot;, &quot;&quot;)
    # memecah data berdasarkan tanda #
    splitData = data.split(&quot;#&quot;)
    # menambahkan data hasil pecahan ke dalam list myData, dengan
    # splitData&#x5B;0] adalah data nim
    # splitData&#x5B;1] adalah data nama
    # splitData&#x5B;2] adalah data nilai
    myData.append(&#x5B;splitData&#x5B;0], splitData&#x5B;1], int(splitData&#x5B;2])])

# sorting data ascending berdasarkan nilai (index ke-2)
myData.sort(key=itemgetter(2), reverse=True)

# menutup file
myFile.close()
</pre></div>


<p class="wp-block-paragraph">Setelah selesai melakukan sorting <em>descending</em> berdasarkan nilai, selanjutnya kita bisa tampilkan data <code>myData</code> nya.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
#import library
from operator import itemgetter

# membuka file dengan mode read (r)
myFile = open(&quot;d:\data.txt&quot;, &quot;r&quot;)

# membaca isi file baris perbaris 
dataAll = myFile.readlines() 

# inisialisasi data list
myData = &#x5B;]

# untuk setiap data pada dataAll lakukan...
for data in dataAll:
    # menghapus \n
    data = data.replace(&quot;\n&quot;, &quot;&quot;)
    # memecah data berdasarkan tanda #
    splitData = data.split(&quot;#&quot;)
    # menambahkan data hasil pecahan ke dalam list myData, dengan
    # splitData&#x5B;0] adalah data nim
    # splitData&#x5B;1] adalah data nama
    # splitData&#x5B;2] adalah data nilai
    myData.append(&#x5B;splitData&#x5B;0], splitData&#x5B;1], int(splitData&#x5B;2])])

# sorting data ascending berdasarkan nilai (index ke-2)
myData.sort(key=itemgetter(2), reverse=True)

# print output myData
for data in myData:
    print(&quot;NIM:&quot;,data&#x5B;0],&quot;, Name:&quot;, data&#x5B;1],&quot;, Grade:&quot;,data&#x5B;2])

# menutup file
myFile.close()
</pre></div>


<p class="wp-block-paragraph">OK itu dia ide penyelesaian dan implementasi kode program Python untuk masalah yang diberikan. Mudah bukan membuatnya? Dengan menggunakan perintah <code>sort()</code> kita bisa melakukan sorting multidimensi di Python, namun terlebih dahulu kita tentukan key yaitu index mana yang akan dijadikan acuan sortingnya menggunakan <code>itemgetter()</code>. </p>The post <a href="https://blog.rosihanari.net/teknik-sorting-list-multidimensi-dan-baca-file-di-python/">Teknik Sorting List Multidimensi di Python</a> first appeared on <a href="https://blog.rosihanari.net">Rosihan Ari's Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.rosihanari.net/teknik-sorting-list-multidimensi-dan-baca-file-di-python/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Penerapan Teknik &#8216;Clean Code&#8217; di Python</title>
		<link>https://blog.rosihanari.net/penerapan-teknik-clean-code-di-python/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=penerapan-teknik-clean-code-di-python</link>
					<comments>https://blog.rosihanari.net/penerapan-teknik-clean-code-di-python/#respond</comments>
		
		<dc:creator><![CDATA[Rosihan Ari Yuana]]></dc:creator>
		<pubDate>Sun, 01 Oct 2023 09:43:45 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[clean code]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[tips]]></category>
		<guid isPermaLink="false">https://blog.rosihanari.net/?p=6655</guid>

					<description><![CDATA[<p>Menulis kode yang &#8220;bersih&#8221; atau &#8220;clean code&#8221; adalah salah satu prinsip dasar dalam pengembangan perangkat lunak. Kode yang bersih lebih mudah dibaca, dimengerti, dan dikelola. Teknik &#8216;clean code&#8217; bukan hanya tentang estetika kode, tetapi juga tentang membangun perangkat lunak yang efisien, efektif, dan dapat diandalkan. Apa saja manfaat dari &#8216;clean code&#8217;, dan bagaimana cara penerapannya...</p>
The post <a href="https://blog.rosihanari.net/penerapan-teknik-clean-code-di-python/">Penerapan Teknik ‘Clean Code’ di Python</a> first appeared on <a href="https://blog.rosihanari.net">Rosihan Ari's Blog</a>.]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Menulis kode yang &#8220;bersih&#8221; atau &#8220;clean code&#8221; adalah salah satu prinsip dasar dalam pengembangan perangkat lunak. Kode yang bersih lebih mudah dibaca, dimengerti, dan dikelola. Teknik &#8216;clean code&#8217; bukan hanya tentang estetika kode, tetapi juga tentang membangun perangkat lunak yang efisien, efektif, dan dapat diandalkan. Apa saja manfaat dari &#8216;clean code&#8217;, dan bagaimana cara penerapannya di Python akan dikupas di artikel ini.</p>



<span id="more-6655"></span>



<h2 class="wp-block-heading">Pengertian Teknik &#8216;Clean Code&#8217;</h2>



<p class="wp-block-paragraph">Teknik &#8220;clean code&#8221; dalam pemrograman mengacu pada praktik menulis kode yang mudah dibaca, dimengerti, dan dikelola oleh pengembang lain (atau bahkan oleh penulis kode itu sendiri di masa depan). Ini bukan hanya tentang membuat kode bekerja, tetapi tentang menulis kode yang &#8220;bersih&#8221; dan efisien dalam struktur dan gayanya.</p>



<p class="wp-block-paragraph">Berikut adalah beberapa aspek utama dari teknik &#8220;clean code&#8221;:</p>



<ol class="wp-block-list">
<li><strong>Keterbacaan</strong>: Kode harus ditulis dengan cara yang memudahkan orang lain untuk membaca dan memahaminya. Ini mencakup pemilihan nama variabel yang deskriptif, penggunaan komentar yang bermakna, dan struktur yang logis.</li>



<li><strong>Konsistensi</strong>: Menggunakan konvensi penamaan yang konsisten, gaya format, dan pendekatan pemrograman di seluruh kode.</li>



<li><strong>Singkat tapi Jelas</strong>: Hindari kode yang berlebihan atau tidak perlu, tetapi pastikan kode tetap jelas dan mudah dimengerti.</li>



<li><strong>DRY (Don&#8217;t Repeat Yourself)</strong>: Jika ada blok kode atau logika yang berulang di beberapa tempat, pertimbangkan untuk mengabstraksinya menjadi fungsi atau metode tersendiri.</li>



<li><strong>Pemisahan Tanggung Jawab</strong>: Setiap fungsi atau kelas harus memiliki satu tujuan atau tanggung jawab. Ini sering disebut sebagai prinsip &#8220;Single Responsibility&#8221;.</li>



<li><strong>Mudah Diperluas</strong>: Kode harus ditulis dengan cara yang memudahkan penambahan atau perubahan fitur di masa depan tanpa mengganggu bagian lain dari sistem.</li>



<li><strong>Penggunaan Komentar dengan Bijak</strong>: Komentar harus digunakan untuk menjelaskan mengapa suatu pendekatan diambil atau untuk menjelaskan bagian kode yang kompleks. Namun, kode itu sendiri harus sejelas mungkin sehingga meminimalkan kebutuhan akan komentar.</li>



<li><strong>Mengikuti Standar dan Konvensi</strong>: Setiap bahasa pemrograman atau kerangka kerja biasanya memiliki standar atau konvensi tertentu yang dianjurkan. Mengikuti standar ini dapat membantu menjaga konsistensi dan keterbacaan kode.</li>
</ol>



<p class="wp-block-paragraph">Secara keseluruhan, tujuan dari &#8220;clean code&#8221; adalah untuk memastikan bahwa kode tidak hanya fungsional, tetapi juga terstruktur dengan baik, efisien, dan mudah dikelola. Ini penting untuk memastikan keberlanjutan proyek, kolaborasi yang efektif antar pengembang, dan kualitas produk perangkat lunak yang tinggi.</p>



<h2 class="wp-block-heading">Manfaat Teknik &#8216;Clean Code&#8217;</h2>



<p class="wp-block-paragraph">Teknik &#8216;clean code&#8217; dalam pemrograman membawa sejumlah manfaat penting, antara lain:</p>



<ol class="wp-block-list">
<li><strong>Keterbacaan (Readability)</strong>: Kode yang bersih mudah dibaca dan dimengerti. Ini memudahkan pengembang lain untuk memahami alur dan logika dari kode tersebut tanpa harus menghabiskan banyak waktu.</li>



<li><strong>Pemeliharaan (Maintainability)</strong>: Kode yang bersih dan terstruktur dengan baik lebih mudah untuk dikelola dan diperbarui. Perubahan dan penambahan fitur baru menjadi lebih cepat dan efisien.</li>



<li><strong>Kurangnya Kesalahan (Fewer Bugs)</strong>: Dengan struktur yang jelas dan penamaan yang deskriptif, potensi untuk kesalahan atau bug berkurang. Kode yang bersih cenderung memiliki lebih sedikit kesalahan daripada kode yang berantakan atau rumit.</li>



<li><strong>Kolaborasi yang Efektif</strong>: Saat bekerja dalam tim, kode yang bersih memudahkan anggota tim lain untuk berkolaborasi, memberikan umpan balik, atau menambahkan kode mereka sendiri.</li>



<li><strong>Efisiensi Waktu</strong>: Meskipun mungkin memerlukan waktu tambahan di awal untuk menulis kode yang bersih, investasi ini akan membuahkan hasil dalam jangka panjang dengan mengurangi waktu yang diperlukan untuk debugging dan pemeliharaan.</li>



<li><strong>Ketergantungan yang Rendah (Low Coupling)</strong>: Prinsip clean code mendorong desain yang memiliki ketergantungan yang rendah antar komponen, yang berarti perubahan pada satu bagian kode tidak akan memiliki dampak besar pada bagian lain dari kode.</li>



<li><strong>Dokumentasi Implisit</strong>: Kode yang bersih dan deskriptif seringkali menjelaskan dirinya sendiri, mengurangi kebutuhan untuk dokumentasi eksternal yang berlebihan.</li>



<li><strong>Keseragaman (Consistency)</strong>: Mengikuti standar dan konvensi tertentu dalam menulis kode memastikan keseragaman di seluruh kode, yang memudahkan pembacaan dan pemahaman.</li>



<li><strong>Meningkatkan Kualitas Produk</strong>: Secara keseluruhan, kode yang bersih meningkatkan kualitas produk perangkat lunak, mengurangi insiden kesalahan, dan meningkatkan kepuasan pengguna.</li>



<li><strong>Kepuasan Profesional</strong>: Menulis kode yang bersih dan rapi memberikan kepuasan tersendiri bagi pengembang. Ini mencerminkan profesionalisme dan dedikasi terhadap kualitas kerja.</li>
</ol>



<h2 class="wp-block-heading">Penerapan &#8216;Clean Code&#8217; di Python</h2>



<p class="wp-block-paragraph">Dalam bahasa pemrograman Python, ada beberapa teknik dan konvensi yang dianjurkan untuk mencapai tujuan ini. Artikel ini akan membahas beberapa teknik tersebut beserta contoh-contohnya.</p>



<h3 class="wp-block-heading">1. Penamaan yang Jelas</h3>



<p class="wp-block-paragraph"><strong>Prinsip</strong>: Gunakan nama variabel, fungsi, dan kelas yang deskriptif dan jelas.</p>



<p class="wp-block-paragraph"><strong>Contoh</strong>:</p>



<ul class="wp-block-list">
<li>Buruk: <code>def p(x, y):</code></li>



<li>Baik: <code>def hitung_luas_persegi_panjang(panjang, lebar):</code></li>
</ul>



<h3 class="wp-block-heading">2. Hindari Kode yang Berulang (DRY &#8211; Don&#8217;t Repeat Yourself)</h3>



<p class="wp-block-paragraph"><strong>Prinsip</strong>: Jika Anda menemukan diri Anda menulis kode yang sama di beberapa tempat, pertimbangkan untuk membuat fungsi atau kelas.</p>



<p class="wp-block-paragraph"><strong>Contoh</strong>:</p>



<ul class="wp-block-list">
<li>Buruk:</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
  x = x * 10
  y = y * 10
  z = z * 10
</pre></div>


<ul class="wp-block-list">
<li>Baik:</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
  def perkalian_sepuluh(angka):
      return angka * 10

  x = perkalian_sepuluh(x)
  y = perkalian_sepuluh(y)
  z = perkalian_sepuluh(z)
</pre></div>


<h3 class="wp-block-heading">3. Gunakan Spasi dengan Konsisten</h3>



<p class="wp-block-paragraph"><strong>Prinsip</strong>: Di Python, indentasi adalah bagian penting dari sintaks. Gunakan 4 spasi untuk setiap level indentasi.</p>



<p class="wp-block-paragraph"><strong>Contoh</strong>:</p>



<ul class="wp-block-list">
<li>Buruk:</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
  def fungsi():
  hasil = 10
      return hasil
</pre></div>


<ul class="wp-block-list">
<li>Baik:</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
  def fungsi():
      hasil = 10
      return hasil
</pre></div>


<h3 class="wp-block-heading">4. Hindari Kode yang Terlalu Panjang</h3>



<p class="wp-block-paragraph"><strong>Prinsip</strong>: Batasi panjang baris kode. PEP 8, panduan gaya Python, merekomendasikan batas 79 karakter untuk kode dan 72 untuk komentar.</p>



<p class="wp-block-paragraph"><strong>Contoh</strong>:</p>



<ul class="wp-block-list">
<li>Buruk:</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
  hasil = fungsi_satu(argument_satu, argument_dua, argument_tiga, argument_empat, argument_lima)
</pre></div>


<ul class="wp-block-list">
<li>Baik:</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
  hasil = fungsi_satu(argument_satu, argument_dua, argument_tiga,
                      argument_empat, argument_lima)
</pre></div>


<h3 class="wp-block-heading">5. Gunakan Komentar dengan Bijak</h3>



<p class="wp-block-paragraph"><strong>Prinsip</strong>: Komentar harus menjelaskan mengapa suatu tindakan diambil, bukan apa yang dilakukan kode tersebut.</p>



<p class="wp-block-paragraph"><strong>Contoh</strong>:</p>



<ul class="wp-block-list">
<li>Buruk:</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
  # Menambahkan 1 ke x
  x += 1
</pre></div>


<ul class="wp-block-list">
<li>Baik:</li>
</ul>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
  # Kompensasi untuk kesalahan pembulatan
  x += 1
</pre></div>


<h3 class="wp-block-heading">6. Gunakan Docstrings</h3>



<p class="wp-block-paragraph"><strong>Prinsip</strong>: Untuk fungsi atau kelas yang lebih kompleks, gunakan docstrings untuk menjelaskan apa yang dilakukan fungsi atau kelas tersebut.</p>



<p class="wp-block-paragraph"><strong>Contoh</strong>:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: python; title: ; notranslate">
  def hitung_luas(panjang, lebar):
      &quot;&quot;&quot;
      Menghitung luas persegi panjang.
      Args:
      - panjang (float): Panjang persegi panjang.
      - lebar (float): Lebar persegi panjang.

      Returns:
      float: Luas persegi panjang.
      &quot;&quot;&quot;
      return panjang * lebar
</pre></div>


<h2 class="wp-block-heading">Kesimpulan</h2>



<p class="wp-block-paragraph">Menulis &#8216;clean code&#8217; adalah investasi untuk masa depan. Kode yang bersih memudahkan pengembang lain (atau Anda sendiri di masa depan) untuk memahami, memodifikasi, dan memelihara kode tersebut. Dengan mengikuti prinsip-prinsip di atas, Anda dapat meningkatkan kualitas kode Python Anda dan membuatnya lebih &#8220;bersih&#8221;.</p>The post <a href="https://blog.rosihanari.net/penerapan-teknik-clean-code-di-python/">Penerapan Teknik ‘Clean Code’ di Python</a> first appeared on <a href="https://blog.rosihanari.net">Rosihan Ari's Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://blog.rosihanari.net/penerapan-teknik-clean-code-di-python/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
