Saya sedang mengerjakan tutorial Ray Wenderlich dan memperhatikan bahwa penulis menggunakan ekstensi kelas untuk menahan panggilan balik delegasi daripada meminta mereka ditangani di dalam kelas itu sendiri yaitu:
delegasikan panggilan balik di dalam ekstensi kelas:
extension LogsViewController : UIPopoverPresentationControllerDelegate {
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
...
}
}
sebagai lawan memilikinya terkandung di dalam kelas:
delegasikan panggilan balik di dalam kelas:
class LogsViewController : UITableViewController, UIPopoverPresentationControllerDelegate {
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
...
}
}
Saya menemukan ini aneh dan menarik pada saat bersamaan. Dia memiliki file yang didedikasikan hanya untuk ekstensi pada kelas LogsViewController bernama "LogsViewControllerExtension.swift" dan memiliki ekstensi yang berbeda untuk setiap protokol delegasi: UITableViewDataSource, UISplitViewDelegate, dll yaitu:
beberapa ekstensi kelas masing-masing dengan panggilan balik delegasi di dalam file sendiri:
extension LogsViewController: UISplitViewControllerDelegate {
... callbacks
}
extension LogsViewController : UIPopoverPresentationControllerDelegate {
... callbacks
}
Mengapa?
Apa manfaatnya melakukan ini? Saya bisa melihat di mana itu mungkin sedikit lebih mudah dibaca untuk memisahkan ini tetapi pada saat yang sama itu adalah tingkat tipuan. Apakah ada prinsip-prinsip OO yang mendukung atau menentang melakukan ini?
sumber
Jawaban:
Saya tidak tahu mengapa Anda mengatakan itu menambah tingkat tipuan. Mungkin Anda memaksudkan sesuatu yang berbeda dengan itu daripada makna tradisional, karena tidak ada tipuan ekstra yang dibuat dengan melakukan ini. Tetapi mengapa melakukannya?
Saya melakukannya karena lebih modular. Semua kode yang diperlukan oleh antarmuka dikelompokkan dalam satu tempat (kecuali properti aktual). Jika saya kemudian memilih untuk membuat kelas terpisah untuk mengimplementasikan protokol itu (dan dengan demikian memperkenalkan tingkat tipuan yang sebenarnya,) semua yang saya butuhkan lakukan adalah mengubah ekstensi menjadi kelas itu sendiri (melewati properti yang dibutuhkan melalui fungsi init,) dan membuat properti pada ViewController untuk membuat instance objek menjadi.
Saya juga memasukkan fungsi pribadi yang hanya digunakan oleh fungsi protokol itu ke dalam ekstensi. Sejauh ini saya belum membuat file yang benar-benar terpisah untuk ekstensi, tetapi hal itu membuatnya jelas bahwa fungsi-fungsi pribadi hanya untuk protokol itu.
Dan bagaimanapun juga, orang sering mengeluh tentang pengontrol tampilan gemuk dan memutus pengontrol tampilan dengan cara ini membantu membuatnya lebih teratur, bahkan jika itu tidak benar-benar membuat pengontrol tampilan lebih tipis.
sumber
Seperti yang Daniel katakan mengenai tipuan, tidak ada levelnya.
Saya menyetujuinya dan saya ingin menambahkan fitur Protokol Perpanjangan yang sangat kuat yang saya ketahui baru-baru ini.
Katakanlah Anda memiliki protokol
didCopyText
misalnya. Anda akan menerapkannya sebagai:Dalam Swift, properti dan metode tidak diimplementasikan dalam deklarasi Protokol, Anda ingin menulis implementasi di setiap kelas sesuai dengan
didCopyText
, dengan jumlah kelas tambahan sesuai dengan protokol ini dengan implementasi yang sama, itu akan berakhir dengan hanya berantakan kode berulang. Di situlah Perpanjangan Protokol berguna.Dengan penerapan properti & metode protokol. Sekarang, setiap kelas yang sesuai dengan protokol ini, akan menggunakan implementasi yang sama.
sumber
Katakanlah kelas Anda mendukung tiga protokol, dan karena itu Anda harus menambahkan tiga set fungsi. Satu-satunya tujuan fungsi-fungsi ini adalah untuk mendukung protokol, sehingga Anda memerlukan beberapa dokumentasi.
Namun, jika Anda menambahkan ekstensi untuk setiap protokol, dan di setiap ekstensi Anda menerapkan persis fungsi yang diperlukan untuk satu protokol itu, yang membuat kode Anda jauh lebih mudah dibaca.
Saya kemungkinan besar tidak akan memasukkannya ke file terpisah kecuali ekstensi ini benar-benar besar.
sumber