Back home

Pola desain dengan Tutorial— Kekuatan OOP (bagian 2)

Perjalanan Pola Desain--Kekuatan OOP 2

Pola desain dengan Tutorial — Kekuatan OOP (bagian 2)

Pola Singleton: pola desain singleton murni dan semi-singleton di Swift Pola Singleton: Pola Desain Singleton Murni dan Semi-Singleton di Swift

Prasyarat — Seri blog ini memerlukan keahlian tingkat menengah dalam pemrograman berorientasi objek. Anda harus memiliki pengetahuan dasar tentang kelas, objek, konstruktor, warisan, nilai dan tipe referensi. Seorang Intermediate akan memperoleh ilmu dan para ahli akan mempertajam ilmunya dengan membaca seri ini dari awal sampai akhir. Prasyarat – Seri blog ini memerlukan keahlian menengah dalam pemrograman berorientasi objek. Anda harus memiliki pemahaman dasar tentang kelas, objek, konstruktor, warisan, nilai, dan tipe referensi. Pengguna tingkat menengah akan memperoleh pengetahuan, sedangkan para ahli akan meningkatkan pengetahuannya dengan membaca seri ini dari depan ke belakang.

Kelas tunggal

Kelas tunggal

Dalam pemrograman berorientasi objek, kelas tunggal adalah kelas yang hanya dapat memiliki satu objek selama seluruh siklus hidup suatu aplikasi atau proyek. Dalam pemrograman berorientasi objek, kelas tunggal adalah kelas yang hanya dapat memiliki satu objek selama seluruh siklus hidup suatu aplikasi atau proyek.

Pola desain Singleton adalah bagian dari kode siklus hidup Aplikasi iOS. Misalnya, dalam proyek iOS, kelas UIApplication adalah contoh terbaik dari kelas tunggal, yang dibuat oleh sistem iOS saat peluncuran aplikasi dan diteruskan ke AppDelegate sebagai parameter dalam metode application:didFinishLaunchingWithOptions:. Pola desain tunggal adalah bagian dari kode siklus hidup aplikasi iOS. Misalnya, dalam proyek iOS, kelas UIApplication adalah contoh terbaik dari kelas tunggal, yang dibuat oleh sistem iOS saat aplikasi diluncurkan dan diteruskan ke AppDelegate sebagai parameter dalam metode application:didFinishLaunchingWithOptions:.

Ada dua jenis pola desain Singleton.

Ada dua jenis pola desain tunggal.

  1. Pola desain tunggal murni Pola desain murni-tunggal

  2. Pola desain semi-tunggal Pola desain semi-tunggal

Pola Desain Murni-Singleton:

Pola desain Murni-Singleton:

Dalam pola ini, pemrogram yang menggunakan fungsionalitas kelas tunggal murni tidak diperbolehkan membuat turunan kelas tersebut. Seorang programmer hanya dapat memanggil metode dan mengakses properti yang tersedia untuk kelas tunggal dengan menggunakan instance kelas tersebut yang telah ditentukan sebelumnya. Dalam pola ini, pemrogram yang menggunakan fungsionalitas kelas tunggal murni tidak diperbolehkan membuat instance kelas tersebut. Pemrogram dapat memanggil metode dan mengakses properti yang tersedia hanya dengan menggunakan instance kelas tunggal yang telah ditentukan sebelumnya.

Objek kelas singleton murni secara otomatis dibuat selama peluncuran aplikasi dengan parameter yang telah ditentukan sebelumnya yang disebutkan oleh pengembang yang membuat kelas tersebut. Selama permulaan aplikasi, objek kelas tunggal murni secara otomatis dibuat menggunakan parameter yang telah ditentukan sebelumnya yang disebutkan oleh pengembang yang membuat kelas tersebut.

Kelas singleton murni harus ditandai sebagai final untuk menghindari kebingungan pewarisan. Secara cepat, Anda juga dapat menggunakan struktur untuk mencapai konsep yang sama. Kelas singleton murni harus ditandai sebagai final untuk menghindari kebingungan pewarisan. Di Swift, Anda juga bisa menggunakan struct untuk mengimplementasikan konsep yang sama.

Seorang programmer tidak dapat mewarisi kelas singleton murni. Saat Anda mencoba mewarisi kelas apa pun di Swift, Anda harus memanggil konstruktor superkelasnya. Memanggil konstruktor superclass tidak dimungkinkan di kelas singleton murni karena semua konstruktor kelas singleton murni selalu ditandai sebagai pribadi. Pemrogram tidak dapat mewarisi kelas tunggal murni. Saat Anda mencoba mewarisi dari kelas mana pun di Swift, Anda harus memanggil konstruktor kelas super. Tidak mungkin memanggil konstruktor kelas super di kelas singleton murni karena semua konstruktor kelas singleton murni ditandai sebagai pribadi.

Mari pahami pola desain ini secara sederhana dengan contoh di bawah ini. Mari kita pahami pola desain ini secara sederhana melalui contoh berikut.


//PureSingletonDesignPatterExample1.swift :

// Hitendra Solanki
// Pure-singleton design pattern Playground example
final class LogManager {
  //shared and only one available object
  static let logger: LogManager = LogManager(databaseURLEndpoint: "https://www.hitendrasolanki.com/logger/live")
  
  private var databaseURLEndpoint: String
  
  //marked as private, no one is allowed to access this initialiser outside of the class
  private init(databaseURLEndpoint: String) {
    self.databaseURLEndpoint = databaseURLEndpoint
  }
  
  func log(_ value: String...){
    //complex code to connect to the databaseURLEndpoint and send the value to server directly
  }
}

//This is function in playground which executes our test code
func main(){
  LogManager.logger.log("test log from medium blog") //this will log on "/live" endpoint
}

//call main to execute our test code
main()


Dalam contoh di atas, PureSingletonDesignPatterExample1.swift kami telah menandai semua metode init sebagai pribadi kelas LogManger sehingga tidak ada yang bisa membuat instance kelas tersebut. Jika kami mencoba membuat subkelas LogManger, kompiler akan memberikan Anda kesalahan. Dalam contoh di atas, PureSingletonDesignPatterExample1.swift kami telah menandai semua metode init sebagai metode privat kelas LogManger, jadi tidak ada yang bisa membuat instance kelas ini. Jika kami mencoba membuat subkelas LogManger, kompiler akan memberikan Anda kesalahan.

Aplikasi UIA, AppDelegate adalah contoh kelas singleton murni. Pernahkah Anda mencoba membuat objek kelas aplikasi UIA secara manual? Coba lakukan dan jalankan aplikasinya. [Apa yang telah terjadi? Aplikasi mogok, bukan? -Saya telah menguji kerusakan ini pada Swift 5, XCode 10.2] UIApplication dan AppDelegate adalah contoh kelas tunggal murni. Pernahkah Anda mencoba membuat objek aplikasi kelas UIA secara manual? Coba lakukan dan jalankan aplikasinya. Aplikasi mogok, bukan? - Saya sudah menguji kerusakan ini di Swift 5, XCode 10.2]

Keterbatasan Pola Desain Murni-Singleton,

Keterbatasan pola singleton murni,

Kami tidak dapat menguji kelas singleton murni dengan data pengujian. Dalam contoh di atas PureSingletonDesignPatterExample1.swift, misalkan Anda ingin menguji kelas LogManager dengan mengarahkannya ke beberapa URL mode pengujian alih-alih URL mode produksi, kami tidak dapat melakukannya saat kami menulis kasus pengujian di target XCTest. Kami tidak dapat menguji kelas tunggal murni dengan data pengujian. Dalam contoh di atas, PureSingletonDesignPatterExample1.swift, dengan asumsi Anda ingin menguji kelas LogManager, arahkan ke beberapa URL mode pengujian alih-alih URL mode produksi, kami tidak dapat melakukan ini saat kami menulis kasus pengujian di target XCTest.Kita dapat mengatasi keterbatasan ini dengan mengubah kelas pure-singleton menjadi kelas semi-singleton atau dengan menggunakan pola injeksi ketergantungan. Saya akan menulis artikel khusus tentang pola injeksi ketergantungan. Untuk saat ini, mari lanjutkan dengan pola desain semi-tunggal. Kita dapat mengatasi keterbatasan ini dengan mengubah kelas singleton murni menjadi kelas semi-singleton atau dengan menggunakan pola injeksi ketergantungan. Saya akan menulis artikel khusus tentang pola injeksi ketergantungan. Sekarang, mari lanjutkan menggunakan pola desain semi-tunggal.

Pola desain semi-tunggal:

Pola desain semi-tunggal:

  • Dalam pola desain semi-tunggal, pemrogram yang menggunakan kelas tersebut diperbolehkan membuat objek kelas tunggal jika diperlukan. serta juga diperbolehkan memanggil metode dan menggunakan properti kelas tunggal. Dalam pola desain semi-tunggal, pemrogram yang menggunakan kelas tersebut dapat membuat objek kelas tunggal jika diperlukan. Serta properti yang memungkinkan pemanggilan metode dan penggunaan kelas tunggal.

  • Seorang programmer juga dapat mewarisi kelas semi-singleton jika singleton tersebut tidak ditandai sebagai final oleh pengembang kelas singleton. Dalam pola desain semi-singleton untuk menandai kelas sebagai final tidak diperlukan. Pemrogram juga dapat mewarisi kelas semi-singleton jika pengembang kelas singleton tidak menandai kelas singleton sebagai final. Dalam pola semi-tunggal, kelas tidak perlu ditandai sebagai kelas final.


//SemiSingletonDesignPatterExample1.swift
// Hitendra Solanki
// Semi-singleton design pattern Playground example
//In semi-singleton design pattern, marking the class as final is optional
final class LogManager {
  //shared object
  static let logger: LogManager = LogManager(databaseURLEndpoint: "https://www.hitendrasolanki.com/logger/live")
  
  private var databaseURLEndpoint: String
  
  //not marked as private, anyone is allowed to access this initialiser outside of the class
  init(databaseURLEndpoint: String) {
    self.databaseURLEndpoint = databaseURLEndpoint
  }
  
  func log(_ value: String...){
    //complex code to connect to the databaseURLEndpoint and send the value to server directly
  }
}

//This is function executes our main code
func main(){
  LogManager.logger.log("main log from medium blog on live server endpoint") //this will log on "/live" endpoint
}


// This is function executes our TEST MODE code
// Here in playground, Hitendra Solanki created this method for the demostratino purpose only
// Usually we write this kind of test codes, inside the test targe of the XCode-project
func testThatLogManger(){
  
  //we are allowed to create an instace of class LogManager,
  //because it follows the Semi-Singleton design patterns
  let logManagerTestObject = LogManager(databaseURLEndpoint: "https://www.hitendrasolanki.com/logger/test")
  
  logManagerTestObject.log("test log from medium blog on test server endpoint") //this will log on "/test" endpoint
}

main() //call main
testThatLogManger() //call test execution

  • Dalam contoh di atas, SemiSingletonDesignPatterExample1.swift, kami belum menandai metode init sebagai pribadi, sehingga kami dapat membuat beberapa instance kelas semi-singleton untuk menghilangkan ketergantungan dari properti databaseURLEndpoint. Sekarang kita dapat membuat objek kelas LogManger dengan menggunakan nilai databaseURLEndpoint apa pun, sekarang kelas LogManger kita mengikuti pola semi-tunggal. Dalam contoh di atas, SemiSingletonDesignPatterExample1.swift, kami tidak menandai metode init sebagai pribadi, sehingga kami dapat membuat beberapa instance kelas semi-singleton untuk menghilangkan ketergantungan dari properti databaseURLEndpoint. Sekarang kita dapat membuat objek kelas LogManger menggunakan nilai databaseURLEndpoint apa pun dan sekarang kelas LogManger kita mengikuti pola semi-tunggal.

UserDefault, FileManager, NotificationCenter adalah contoh kelas semi-tunggal. Kita dapat menggunakan objek bersama yang telah ditentukan sebelumnya dari UserDefault, FileManager, dan NotificationCenter yaitu UserDefault.standard, FileManager.default, dan NotificationCenter.default. UserDefault, FileManager, dan NotificationCenter adalah contoh kelas semi-tunggal. Kita dapat menggunakan objek bersama yang telah ditentukan sebelumnya seperti UserDefault, FileManager, dan NotificationCenter, yaitu UserDefault.standard, FileManager.default, dan NotificationCenter.default.

Objek kelas murni atau semi-tunggal yang telah ditentukan sebelumnya selalu ada di memori dan tidak pernah dimusnahkan sampai Anda menutup aplikasi. Objek kelas semi singleton yang ditentukan programmer dimusnahkan setelah cakupan objek selesai. Objek yang telah ditentukan sebelumnya dari kelas murni atau semi-tunggal selalu ada di memori dan tidak dimusnahkan hingga aplikasi ditutup. Objek yang ditentukan pemrogram dari kelas semi-tunggal dimusnahkan setelah cakupan objek selesai.

Pertanyaan: Manakah cara yang lebih baik, “Pola desain murni-tunggal” atau “Pola desain semi-tunggal”, kapan saya harus menggunakan yang pertama dan kapan yang lain? Pertanyaan: Mana yang lebih baik, “Pola Desain Singleton Murni” atau “Pola Desain Semi-Singleton”? Dalam keadaan apa sebaiknya digunakan?

Ini sepenuhnya tergantung pada tanggung jawab kelas Anda. Jika Anda telah membuat kelas tunggal di proyek Anda dan perlu mengubah beberapa properti di beberapa titik atau jika Anda ingin menambahkan lebih banyak tanggung jawab ke kelas dengan menambahkan metode baru di masa depan dan jika Anda memerlukan kasus pengujiannya juga dengan data tiruan untuk metode yang baru ditambahkan, Anda harus menggunakan pola desain semi-tunggal. Itu semua tergantung pada fungsionalitas kelas Anda. Jika Anda telah membuat proyek kelas tunggal dan perlu mengubah beberapa properti di beberapa titik, atau di masa depan Anda ingin menambahkan metode baru, dan Anda perlu menggunakan data tiruan untuk menguji metode yang baru ditambahkan, Anda harus mengadopsi pola desain semi-tunggal.

Jika Anda membuat kelas, Anda sudah selesai dengan pengujian unit dan ingin mempublikasikannya melalui kerangka kerja atau pustaka, Anda bisa menggunakan pola desain tunggal murni. Karena Anda membuat kelas tersebut dan beberapa pengembang lain akan menggunakannya, maka pengujian unit kelas tunggal Anda adalah tanggung jawab Anda sebelum rilis, bukan tanggung jawab pengembang yang menggunakannya. Jika Anda telah membuat kelas, Anda telah menguji unitnya dan ingin mendistribusikannya melalui kerangka kerja atau pustaka, Anda dapat menggunakan pola desain Pure Singleton. Karena Anda membuat kelas ini, beberapa pengembang lain akan menggunakannya, jadi pengujian unit kelas singleton sebelum merilisnya adalah tanggung jawab Anda, bukan tanggung jawab pengembang yang menggunakannya.

Klik untuk melihat teks asli