Pola desain dengan Tutorial— Kekuatan OOP (bagian 1)
Perjalanan Pola Desain--Kekuatan OOP 1
Pola desain dengan Tutorial— Kekuatan OOP (bagian 1)
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 perantara 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. Seorang perantara akan memperoleh ilmu dan seorang ahli akan mempertajam ilmunya dengan membaca seri ini dari awal sampai akhir.
Pola desain digunakan untuk mewakili praktik terbaik yang diadopsi oleh komunitas pengembang perangkat lunak berorientasi objek yang berpengalaman. Pola desain digunakan untuk mewakili praktik terbaik yang diadopsi oleh komunitas pengembang perangkat lunak berorientasi objek yang berpengalaman.
Pola desain pembangun membantu kita membangun objek dengan cara yang lebih sederhana dan mudah dibaca. Pola desain pembangun mengikuti dua aturan sederhana seperti yang disebutkan di bawah. Pola desain pembangun membantu kita membangun objek dengan cara yang lebih sederhana dan mudah dibaca. Pola desain pembangun mengikuti dua aturan sederhana, yang dijelaskan di bawah.
-
Pisahkan representasi kelas asli dan metode konstruksinya. Pisahkan representasi kelas asli dan konstruktornya.
-
mengembalikan instance kelas pada langkah terakhir Kembalikan instance kelas pada langkah terakhir
Contoh terbaik dari pola desain pembangun adalah SwiftUI, ya, Anda membacanya dengan benar. SwiftUI menggunakan pola desain pembangun untuk sebagian besar kelasnya, misalnya. Teks, Gambar Contoh terbaik pola desain pembangun adalah SwiftUI, ya, Anda membacanya dengan benar. Sebagian besar kelas di SwiftUI menggunakan pola desain pembuat, seperti teks, gambar, dll.
Masalah: Pertanyaan:
Pikirkan tentang kelas, katakanlah Person yang memiliki sepuluh properti atau lebih, gambarkan desain konstruktornya saat Anda perlu membuat turunan dari kelas Person. Konstruktornya akan membutuhkan sepuluh argumen atau lebih, akan sulit untuk mengelola banyak argumen ini sebagai satu fungsi atau konstruktor dan pada akhirnya, Anda akan kehilangan keterbacaan kode. lihat contoh di bawah ini. Pikirkan tentang kelas ini, katakanlah Person yang memiliki sepuluh properti atau lebih, ketika Anda perlu membuat instance kelas Person, bayangkan desain konstruktornya. Konstruktornya memerlukan 10 parameter atau lebih, yang sulit dikelola sebagai fungsi atau konstruktor, dan pada akhirnya, Anda kehilangan keterbacaan kode Anda. Lihat contoh di bawah ini.
WithoutDesignPatternExample1.swift:
class Person {
//personal details
var name: String = ""
var gender: String = ""
var birthDate: String = ""
var birthPlace: String = ""
var height: String = ""
var weight: String = ""
//contact details
var phone: String = ""
var email: String = ""
//address details
var streeAddress: String = ""
var zipCode: String = ""
var city: String = ""
//work details
var companyName: String = ""
var designation: String = ""
var annualIncome: String = ""
//constructor
init(name: String,
gender: String,
birthDate: String,
birthPlace: String,
height: String,
weight: String,
phone: String,
email: String,
streeAddress: String,
zipCode: String,
city: String,
companyName: String,
designation: String,
annualIncome: String) {
self.name = name
self.gender = gender
self.birthDate = birthDate
self.birthPlace = birthPlace
self.height = height
self.weight = weight
self.phone = phone
self.email = email
self.streeAddress = streeAddress
self.zipCode = zipCode
self.height = height
self.city = city
self.companyName = companyName
self.designation = designation
self.annualIncome = annualIncome
}
}
//This is function in Xcode-Playground which executes our test code
func main() {
let hitendra = Person(name: "Hitendra Solanki",
gender: "Male",
birthDate: "2nd Oct 1991",
birthPlace: "Gujarat, India",
height: "5.9 ft",
weight: "85kg",
phone: "+91 90333-71772",
email: "hitendra.developer@gmail.com",
streeAddress: "52nd Godrej Street",
zipCode: "380015",
city: "Ahmedabad",
companyName: "Fortune 500",
designation: "Software architect",
annualIncome: "45,000 USD")
//use of Person object
print("\(hitendra.name) works in \(hitendra.companyName) compay as a \(hitendra.designation).")
}
//call main to execute our test code in Xcode-Playground
main()
/* Console output:
Hitendra Solanki works in Fortune 500 compay as a Software architect.
*/
Coba jalankan contoh di atas di taman bermain, ini akan berjalan dengan sukses dan memberi Anda hasil yang diharapkan. Secara logika itu benar. Coba jalankan contoh di atas di taman bermain, ini akan berjalan dengan sukses dan memberi Anda hasil yang diharapkan. Benar secara logika.
Kita dapat memperbaiki contoh di atas dengan mengatasi poin-poin di bawah ini. Kita dapat memperbaiki contoh di atas dengan mengatasi poin-poin berikut.
-
Kita harus meneruskan nilai dalam urutan yang disebutkan, tidak dapat menyusun ulang urutan parameter untuk meningkatkan keterbacaan. Kita harus meneruskan nilai dalam urutan di atas, urutan parameter tidak dapat disusun ulang untuk meningkatkan keterbacaan.
-
Kita harus meneruskan semua nilai, meskipun kita tidak mengetahui beberapa nilai pada saat pembuatan objek. Kita harus meneruskan semua nilai, meskipun kita tidak mengetahui beberapa nilai saat membuat objek.
Misalnya. Misalkan Anda perlu membuat objek kelas Person, tetapi orang tersebut masih mencari pekerjaan. Ketika orang itu akan bergabung dengan perusahaan mana pun maka hanya kami yang memiliki rincian pekerjaannya. Misalkan Anda perlu membuat objek kelas Person, tetapi objek tersebut masih mencari pekerjaan. Ketika orang itu akan bergabung dengan perusahaan mana pun, maka hanya kami yang memiliki detail pekerjaannya.
Solusi:
Solusi:
-
Buat grup logis dari properti terkait. Buat grup logis dari properti terkait.
-
Buat kelas pembangun terpisah untuk grup properti yang berbeda[membantu dalam normalisasi properti, ini opsional. Membuat kelas generator terpisah untuk grup atribut berbeda [membantu normalisasi atribut, ini opsional.
-
Ambil sebuah instance pada langkah terakhir. Sebuah instance diambil pada langkah terakhir.
Mari kita sederhanakan ini dengan sebuah contoh, Mari kita sederhanakan dengan sebuah contoh,
Kita sudah memiliki kelas bernama Person dalam contoh WithoutDesignPatternExample1.swift, di mana kita memiliki 14 properti. Jika kita memeriksa ke-14 properti dengan cermat, properti tersebut memiliki 4 grup logis. Misalnya, kita sudah memiliki kelas bernama Person tanpa designpatternexample1. Swift, kami memiliki 14 properti. Jika kita memeriksa ke-14 properti dengan cermat, ada 4 kelompok logis dari properti ini.
-
Properti detail pribadi Atribut informasi pribadi
-
Properti rincian kontak Properti informasi kontak
-
Properti rincian alamat Properti detail alamat
-
Properti detail perusahaan Properti detail perusahaan
Pola desain Faceted dan Fluent bersama-sama membantu kita mengatasi dua masalah yang disebutkan di atas. Pola desain Faceted dan Fluent bersama-sama membantu kita mengatasi dua masalah yang disebutkan di atas.
BuilderDesignPattern[Faceted+Fluent]Example1.swift:
//This is function in playground which executes our test code
func main() {
var hitendra = Person() //person with empty details
let personBuilder = PersonBuilder(person: hitendra)
hitendra = personBuilder
.personalInfo
.nameIs("Hitendra Solanki")
.genderIs("Male")
.bornOn("2nd Oct 1991")
.bornAt("Gujarat, India")
.havingHeight("5.9 ft")
.havingWeight("85 kg")
.contacts
.hasPhone("+91 90333-71772")
.hasEmail("hitendra.developer@gmail.com")
.lives
.at("52nd Godrej Street")
.inCity("Ahmedabad")
.withZipCode("380015")
.build()
//use of Person object
print("\(hitendra.name) has contact number \(hitendra.phone) and email \(hitendra.email)")
//later on when we have company details ready for the person
hitendra = personBuilder
.works
.asA("Software architect")
.inCompany("Fortune 500")
.hasAnnualEarning("45,000 USD")
.build()
//use of Person object with update info
print("\(hitendra.name) works in \(hitendra.companyName) compay as a \(hitendra.designation).")
}
//call main to execute our test code
main()
//Person class which only contains the details
class Person {
//personal details
var name: String = ""
var gender: String = ""
var birthDate: String = ""
var birthPlace: String = ""
var height: String = ""
var weight: String = ""
//contact details
var phone: String = ""
var email: String = ""
//address details
var streeAddress: String = ""
var zipCode: String = ""
var city: String = ""
//work details
var companyName: String = ""
var designation: String = ""
var annualIncome: String = ""
//empty constructor
init() { }
}
//PersonBuilder class helps to construct the person class instance
class PersonBuilder {
var person: Person
init(person: Person){
self.person = person
}
//personal details builder switching
var personalInfo: PersonPersonalDetailsBuilder {
return PersonPersonalDetailsBuilder(person: self.person)
}
//contact details builder switching
var contacts: PersonContactDetailsBuilder {
return PersonContactDetailsBuilder(person: self.person)
}
//address details builder switching
var lives: PersonAddressDetailsBuilder {
return PersonAddressDetailsBuilder(person: self.person)
}
//work details builder switching
var works: PersonCompanyDetailsBuilder {
return PersonCompanyDetailsBuilder(person: self.person)
}
func build() -> Person {
return self.person
}
}
//PersonPersonalDetailsBuilder: update personal details
class PersonPersonalDetailsBuilder: PersonBuilder {
func nameIs(_ name: String) -> Self {
self.person.name = name
return self
}
func genderIs(_ gender: String) -> Self {
self.person.gender = gender
return self
}
func bornOn(_ birthDate: String) -> Self {
self.person.birthDate = birthDate
return self
}
func bornAt(_ birthPlace: String) -> Self {
self.person.birthPlace = birthPlace
return self
}
func havingHeight(_ height: String) -> Self {
self.person.height = height
return self
}
func havingWeight(_ weight: String) -> Self {
self.person.weight = weight
return self
}
}
//PersonContactDetailsBuilder: update contact details
class PersonContactDetailsBuilder: PersonBuilder {
func hasPhone(_ phone: String) -> Self {
self.person.phone = phone
return self
}
func hasEmail(_ email: String) -> Self {
self.person.email = email
return self
}
}
//PersonAddressDetailsBuilder: update address details
class PersonAddressDetailsBuilder: PersonBuilder {
func at(_ streeAddress: String) -> Self {
self.person.streeAddress = streeAddress
return self
}
func withZipCode(_ zipCode: String) -> Self {
self.person.zipCode = zipCode
return self
}
func inCity(_ city: String) -> Self {
self.person.city = city
return self
}
}
//PersonCompanyDetailsBuilder: update company details
class PersonCompanyDetailsBuilder: PersonBuilder {
func inCompany(_ companyName: String) -> Self {
self.person.companyName = companyName
return self
}
func asA(_ designation: String) -> Self {
self.person.designation = designation
return self
}
func hasAnnualEarning(_ annualIncome: String) -> Self {
self.person.annualIncome = annualIncome
return self
}
}
/* Console output:
Hitendra Solanki has contact number +91 90333-71772 and email hitendra.developer@gmail.com
Hitendra Solanki works in Fortune 500 compay as a Software architect.
*/
Dalam contoh di atas, kami telah memisahkan tanggung jawab kelas Person di kelas yang berbeda. Kelas person sekarang hanya menyimpan properti data, sementara kami telah membuat beberapa kelas pembangun yang memiliki tanggung jawab untuk membangun/memperbarui grup properti relatif. Dalam contoh di atas, kami membagi tanggung jawab kelas Person ke dalam kelas-kelas yang berbeda. Kelas Person sekarang hanya berisi atribut data, dan kami telah membuat beberapa kelas pembangun yang bertanggung jawab untuk membangun/memperbarui grup atribut terkait.Kami memiliki satu kelas pembuat dasar PersonBuilder dan memiliki empat kelas pembuat turunan lainnya bernama PersonPersonalDetailsBuilder, PersonContactDetailsBuilder, PersonAddressDetailsBuilder, dan PersonCompanyDetailsBuilder. Kami memiliki kelas pembuat dasar PersonBuilder, dan empat kelas pembuat turunan, yaitu PersonPersonalDetailsBuilder, PersonContactDetailsBuilder, PersonAddressDetailsBuilder, dan PersonCompanyDetailsBuilder.
Kelas dasar PersonBuilder membantu kita beralih di antara beberapa pembuat kapan saja sementara empat pembuat lainnya yang berasal dari PersonBuilder memiliki tanggung jawab untuk memperbarui properti relatif. Kelas dasar PersonBuilder membantu kita beralih di antara beberapa pembuat kapan saja, sedangkan empat pembuat lainnya yang berasal dari PersonBuilder bertanggung jawab untuk memperbarui properti terkait.
Dalam contoh di atas, kita dapat melihat dengan jelas bahwa konstruksi objek Person lebih mudah dibaca dibandingkan dengan contoh pertama kita WithoutDesignPatternExample1.swift dan kita juga dapat memperbarui grup properti atau properti apa pun kapan saja dengan cara yang lebih mudah dibaca. Dalam contoh di atas, kita dapat melihat dengan jelas bahwa struktur objek Person jauh lebih mudah dibaca dibandingkan dengan contoh pertama kita.

Dalam contoh di atas, perhatikan bahwa kami mengembalikan instance pembuatnya sendiri setelah memanggil setiap metode pembaruan properti. Yang membantu kita menulis rangkaian beberapa metode dari pembuat yang sama alih-alih menulis beberapa baris secara terpisah. Konsep ini dikenal sebagai pola Lancar. Dalam contoh di atas, perhatikan bahwa setelah memanggil setiap metode pembaruan properti, kami mengembalikan instance generator itu sendiri. Ini membantu kita menulis rangkaian beberapa metode pada generator yang sama alih-alih menulis beberapa baris terpisah. Konsep ini disebut mode koherensi.
Manfaat:
Manfaat:
-
Inisialisasi objek kelas yang memiliki terlalu banyak properti dengan cara yang lebih mudah dibaca. Menginisialisasi objek kelas dengan terlalu banyak properti dengan mudah, agar lebih mudah dibaca.
-
Menganut prinsip tanggung jawab tunggal. Ikuti prinsip tanggung jawab tunggal.
-
Inisialisasi objek atau perbarui properti dalam urutan apa pun sesuai kenyamanan Anda. Inisialisasi objek atau perbarui properti dalam urutan apa pun sesuai kenyamanan Anda.
Bonusnya:
Bonusnya:
Untuk membuat pola pembangun konsisten di seluruh proyek, Anda dapat membuat protokol seperti di bawah ini. Untuk membuat pola generator konsisten di seluruh proyek Anda, Anda dapat membuat protokol seperti berikut.

Teks asli: https://medium.com/flawless-app-stories/design-patterns-by-tutorials-the-power-of-oop-2e871b551cbe
What to read next
Want more posts about Translation?
Posts in the same category are usually the best next step for reading more on this topic.
View same categoryWant to keep following #Translation?
Tags are useful for related tools, specific problems, and similar troubleshooting notes.
View same tagWant to explore another direction?
If you are not sure what to read next, return to the homepage and start from categories, topics, or latest updates.
Back home