Desain untuk kerangka kerja aplikasi yang akan memungkinkan setiap implementasi untuk menyesuaikan bagian-bagian UI

9

Saya bertugas merancang kerangka kerja aplikasi yang akan memungkinkan setiap implementasi untuk menyesuaikan bagian-bagian antarmuka pengguna. Salah satu contohnya adalah implementasinya (sebut saja klien mulai sekarang) dapat mendefinisikan sel tampilan koleksi untuk dikembalikan ke layar tertentu. Kerangka kerja ini hanya bertanggung jawab untuk menjual benda-benda yang tepat untuk membuat membangun Aplikasi lebih mudah karena kita akan membangun beberapa contoh yang mirip.

Pendekatan saya saat ini terhadap kerangka kerja ini adalah merancang Pengendali Koordinasi yang bertanggung jawab untuk semua acara presentasi dan pemberhentian di seluruh Aplikasi. Pengendali Koordinasi default mengeluarkan semua pengontrol tampilan default di dalam kerangka kerja yang semuanya melakukan tugas yang relevan tanpa harus menyediakan UI yang dikonfigurasi. Sebagai contoh: satu controller akan menampilkan tampilan koleksi dengan sel-sel template dan tidak ada yang istimewa. Manfaat dari desain ini adalah menghilangkan kopling antara pengontrol dan juga memungkinkan klien untuk mengesampingkan koordinator default dan mengembalikan pengontrol tampilan yang sama sekali baru untuk tugas tertentu.

Masalah yang saya alami adalah bagaimana saya harus merancang kerangka kerja ini untuk memungkinkan klien menambahkan UI kustom mereka sendiri ke dalam Aplikasi.

Pendekatan Satu

Membuat kerangka kerja memerlukan pabrik tampilan dan biarkan pabrik tampilan ini bertanggung jawab untuk mengeluarkan semua tampilan yang relevan. Dengan demikian, dalam App Delegate kita dapat memastikan bahwa klien membuat CollectionViewCellFactory misalnya dan antarmuka mendefinisikan semua sel yang diperlukan oleh setiap kelas yang sesuai untuk memasok. Saya mewarisi basis kode dengan desain ini dan menjauh darinya karena terlalu abstrak dan dapat disesuaikan. Itu datang dengan banyak pabrik untuk setiap aspek App dan ini menambahkan hari ke waktu pengaturan setiap App.

Pendekatan Dua

Setiap pengontrol tampilan menentukan kait subkelas atau API pengaturan yang akan memungkinkan untuk kelas UI khusus ini untuk didefinisikan pada waktu berjalan (Mirip dengan bagaimana UISplitViewController memungkinkan penelepon mengatur pengontrol menggunakan properti viewControllers). Untuk melakukan ini, setiap klien hanya akan subkelas Pengendali Koordinasi dasar dan dalam setiap presentasi pengontrol; atur nilai yang sesuai ke controller sehingga mencapai UI yang diinginkan. Sesuatu seperti

viewController.registerReusableCellsBlock = ^(UICollectionView *collectionView){
   //perform custom registration
}

viewController.cellDequeueBlock = ^UICollectionViewCell<SomeProtocol> *(UICollectionView *collectionView,NSIndexPath *indexPath){
   //dequeue custom cells
}

Saat ini, saya memisahkan sumber data untuk dilihat menjadi objek terpisah untuk mempromosikan penggunaan kembali dan mencegah mengasapi ViewController. Ini membuat subkelas pengontrol tampilan untuk memasok antarmuka sel sedikit lebih sulit tetapi tidak mustahil.

Pendekatan 3

Mungkin ide yang buruk untuk mencoba merancang kerangka kerja dan mengantisipasi penggunaannya. Mungkin opsi terbaik adalah untuk memungkinkan subkelas dengan kontrol maksimum, bahkan jika biaya setup relatif tinggi. Kemudian, setelah saya membangunnya untuk beberapa klien, saya mungkin memperhatikan pola yang muncul dan mulai optimisasi di sepanjang rute.

Saya mengerti bagaimana saya bisa membuatnya dapat disesuaikan secara internal ke dalam kerangka kerja, yang saya perjuangkan adalah bagaimana cara terbaik mendefinisikan antarmuka yang mendefinisikan titik-titik kustomisasi potensial dari kerangka kerja oleh klien.

TL; DR

Bagian paling rumit dari antarmuka berkaitan dengan Collection View yang bersarang di dalam Collection View Cells. Ini memungkinkan paging horizontal dan pengguliran vertikal sel. Ini dicapai dengan memiliki satu sumber data yang mengelola sel horizontal dan mengonfigurasi tampilan koleksi setiap sel dengan sumber data baru.

Bagaimana seseorang mendesain antarmuka yang memungkinkan semua sel ini dapat dikustomisasi?

Daniel G
sumber
Pendekatan 1 memberikan fleksibilitas, pendekatan 2 paling sedikit tetapi membutuhkan sedikit usaha dari pengguna Anda. Jadi apa yang kamu mau?
Trilarion
@Trilarion jujur ​​saya berharap untuk pengalaman senior. Kekhawatiran terbesar saya adalah tidak dapat mengantisipasi dengan tepat berapa banyak kontrol yang perlu saya berikan mengenai penyesuaian
Daniel G
4
Anda tidak dapat memprediksi kustomisasi. Menentukan kerangka kerja tujuan umum sulit. Paling-paling Anda dapat memberikan beberapa kode umum yang tidak membatasi pengembang lain dengan cara apa pun. Saya akan menghindari solusi yang memerlukan pewarisan, dan fokus pada komponen yang dapat diperluas dengan cara lain. Jaga kontribusi Anda sendiri sesederhana mungkin.
Frank Hileman

Jawaban:

1

Ini adalah pertanyaan lama tetapi layak yang tidak pernah mendapatkan jawaban yang layak, yang, menurut pengalaman saya, sebagai tanggapan terhadap

How would one design an interface that allows all these cells to be customizable?

adalah- jangan lakukan itu.

Membatasi pilihan yang bisa dibuat klien dalam penyesuaian - baik di UI atau di tempat lain - hampir selalu lebih baik untuk vendor - karena itu menyederhanakan solusi dan mengurangi beban dukungan - dan juga untuk klien - karena dengan demikian mereka paling mampu meningkatkan keahlian vendor untuk mencapai sweet spot dari ruang solusi, tanpa membuang waktu mereka sendiri menciptakan kembali roda.

Jika mereka membutuhkan solusi yang berbeda, mereka akan memberi tahu Anda. Jika mereka bersikeras melakukan kustomisasi, mereka membutuhkan solusi yang berbeda dan belum mengetahuinya.

Jonah Benton
sumber