SOLID Principle on Android App Development

  1. Single Responsibility
    • Each software module should have one and only one reason to change.
    • Suatu class atau method diusahakan hanya memiliki satu fungsi / tanggungjawab
    • Tujuannya untuk mempermudah difahami dan mempermudah proses pengembangan, mengurangi resiko senggolan karena codenya lebih terisolasi.
    • Contohnya penggunaan pattern MVP (Model View Presenter), dimana model class bertanggung jawab untuk menyimpan data, Presenter untuk mengolah data yang ada pada model, misalnya dengan melakukan validasi dan kalkulasi, View bertugas untuk menampilkan data yang telah diolah oleh presenter
  2. Open Close
    • Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification.
    • Open for extension : class atau method mudah untuk di-extend, dibuat subclass baru yang mewarisi property & method class parent-nya.
    • Close for modification : class atau method parentnya tidak harus mengalami perubahan.
    • Contohnya TextView dan ImageView
      • Dua View yang berbeda, dimana ImageView memiliki method untuk mengolah gambar seperti setScaleType sedangkan TextView tidak ada, meskipun keduanya extend dari class yang sama yaitu class View (Open for extension)
      • Keduanya mewarisi property dan method yang sama yang ada pada class View seperti setWidth, setHeight tanpa perlu merubahnya / tidak perlu perubahan di class parent-nya (Close for modification)
  3. Liskov Subtitution
    • Subtypes must be substitutable for their base type.
    • Subtipe harus dapat diganti dengan tipe dasarnya.
    • Prinsip agar sub-class dapat digantikan perannya oleh parent-class tanpa merusaknya
    • Teknik yang biasa digunakan adalah dengan menambah 1 class baru untuk menggrouping class yang sesuai dengan behaviournya
    • Tanpa Menggunakan LSP
    • Dengan Menggunakan LSP
    • Contoh di android
    • TextView extend View
    • LinearLayout extend ViewGroup dimana ViewGroup extend View
    • Sehingga ketika melakukan pengelompokan berdasarkan class View, maka hanya bisa mengakses property dan method yang ada pada class View, dan ketika misalnya melakukan perubahan warna background tidak akan merusak program.
    • Ketika melakukan pengelompokan berdasarkan ViewGroup, maka class TextView tidak dapat dimasukan kedalam kelompok ViewGroup, dan akan menampilkan error pada saat compile time, sehingga program akan lebih aman pada saat run time
    • Contoh kasus misalnya countChildView yang ada dalam ViewGroup, hanya class yang extend dari ViewGroup saja yang bisa, sedangkan yang lainnya seperti TextView tidak bisa
  1. Interface Segregation
    • Segregation artinya pemisahan
    • Interface segregation adalah konsep untuk memisahkan client class dari interface yang tidak diperlukan sehingga interface tersebut perlu dipisahkan kedalam interface baru yang lebih kecil
    • misalnya class Phone memiliki interface brandName, typeName, color, dan flipDirection
    • Karena tidak semua handphone dapat dilipat, maka kita perlu memisahkan interface untuk flipDirection, yang hanya akan di implement pada handphone yang dapat dilipat saja FlipPhone
    • Contoh lainnya misalnya kita membuat dialog confirmation dengan 2 buah button positive & negative action, dimana negative button bersifat optional show / hide. Maka kita memerlukan interface untuk masing-masing button, jangan dibuat dalam 1 interface.
  2. Dependency Inversion
    • Dependency artinya ketergantungan
    • Inversion / invers artinya pembalikan
    • High-level modules should not depend on low-level modules. Both should depend on abstraction
    • High level module = consumer
    • Low level module = core
    • Do not create new Object on high level / consumer module, but use an interface for abstraction
    • Tujuannya agar tidak terlalu terikat / less couple, jika suatu waktu nanti perlu pergantian core atau low level module tidak perlu banyak perubahan. 
    • Misalnya mengganti networking library dari Volley ke OkHttp.
      Kita bisa membuat interface baru untuk capture event onSuccess & onError, yang akan menghubungkan networking library yang kita gunakan dengan high level module di aplikasi kita misalnya class Presenter
    • https://javatechonline.com/solid-principles-the-dependency-inversion-principle/

0 comments:

Posting Komentar