Pola Arsitektur apa yang digunakan pada Android? [Tutup]

268

Saya sedang melakukan penelitian kecil pada platform seluler dan saya ingin tahu pola desain mana yang digunakan di Android?

misalnya di iOS Model-view-controller sangat banyak digunakan bersama dengan delegasi dan pola lainnya.

Pola apa dan di mana khususnya yang digunakan Android?

EDIT

Saya tidak meminta pola desain yang digunakan jauh di dalam kernel, Dalvik dan sebagainya, tetapi tentang pola-pola yang akan ditemui pengembang aplikasi saat mengembangkan aplikasi.

Burjua
sumber
2
Mengingat platform Android menggabungkan kernel Linux, itu terlalu besar perangkat lunak untuk menjawab pertanyaan ini selain 'semua pola yang disebutkan sejauh ini, dan mungkin beberapa yang baru jika Anda melihat dengan cukup hati-hati'
Pete Kirkham
5
@Pete, Ok, mungkin Anda benar, tetapi pada saat yang sama saya tidak akan begitu dalam seperti kernel, saya tertarik pada permukaan aplikasi, misalnya di iOS UIViewControllerdiimplementasikan menggunakan MVC ( UIViewControlleradalah controller dan akarnya UIViewadalah tampilan) , UIApplicationmenggunakan delegasi yang memiliki Delegasi Aplikasi sebagai delegasi dan sebagainya ...
Burjua
4
Saya pikir Anda harus benar-benar mempelajari Android dari bawah ke atas dan tidak mencoba "port" pengetahuan Anda dari iOS ke Android. Ada banyak buku bagus di luar sana. Apress membuat banyak. Jika Anda memahami siklus hidup aplikasi dan layanan di Android, Anda harus bisa mendapatkan cara untuk menghapus aplikasi dengan benar.
blindstuff
Ini mungkin membantu: stackoverflow.com/a/49694378
Ali Nem

Jawaban:

324

Saya mencoba menggunakan model-view-controller (MVC) dan pola arsitektur model-view-presenter untuk melakukan pengembangan android. Temuan saya adalah model-view-controller berfungsi dengan baik, tetapi ada beberapa "masalah". Semuanya bermuara pada bagaimana Anda memahami Activitykelas Android . Apakah itu pengontrol, atau hanya tampilan?

Kelas yang sebenarnya Activitytidak memperpanjang Viewkelas Android , tetapi, bagaimanapun, menangani menampilkan jendela kepada pengguna dan juga menangani peristiwa-peristiwa jendela itu (onCreate, onPause, dll.).

Ini berarti, bahwa ketika Anda menggunakan pola MVC, controller Anda sebenarnya akan menjadi pseudo view-controller. Karena menangani menampilkan jendela kepada pengguna, dengan komponen tampilan tambahan yang telah Anda tambahkan ke dalamnya dengan setContentView, dan juga menangani acara untuk setidaknya berbagai aktivitas siklus aktivitas.

Dalam MVC, controller seharusnya menjadi titik masuk utama. Yang agak bisa diperdebatkan jika hal ini terjadi ketika menerapkannya pada pengembangan Android, karena aktivitas ini adalah titik masuk alami sebagian besar aplikasi.

Karena itu, saya pribadi menemukan bahwa model model-view-presenter sangat cocok untuk pengembangan Android. Karena peran pandangan dalam pola ini adalah:

  • Berfungsi sebagai titik masuk
  • Komponen rendering
  • Routing acara pengguna ke presenter

Ini memungkinkan Anda untuk menerapkan model seperti:

Lihat - ini berisi komponen UI Anda, dan menangani acara untuk mereka.

Presenter - ini akan menangani komunikasi antara model Anda dan tampilan Anda, melihatnya sebagai pintu gerbang ke model Anda. Artinya, jika Anda memiliki model domain kompleks yang mewakili, Tuhan tahu apa, dan tampilan Anda hanya memerlukan sebagian kecil dari model ini, pekerjaan presenter adalah untuk menanyakan model dan kemudian memperbarui tampilan. Misalnya, jika Anda memiliki model yang berisi paragraf teks, judul, dan jumlah kata. Namun dalam tampilan yang diberikan, Anda hanya perlu menampilkan informasi utama dalam tampilan. Kemudian presenter akan membaca data yang dibutuhkan dari model, dan memperbarui tampilan yang sesuai.

Model - ini pada dasarnya harus menjadi model domain lengkap Anda. Semoga ini akan membantu membuat model domain Anda lebih "ketat" juga, karena Anda tidak akan memerlukan metode khusus untuk menangani kasus seperti yang disebutkan di atas.

Dengan memisahkan model dari tampilan bersama-sama (melalui penggunaan presenter), itu juga menjadi jauh lebih intuitif untuk menguji model Anda. Anda dapat memiliki tes unit untuk model domain Anda, dan tes unit untuk presenter Anda.

Cobalah. Saya pribadi merasa ini sangat cocok untuk pengembangan Android.

JustDanyul
sumber
14
Jawaban bagus! Namun saya punya pertanyaan: 1. Aktivitas = Lihat, apakah saya sudah benar? 2. Apakah Anda akan menerapkan presenter sebagai kelas publiknya sendiri, atau sebagai kelas inti dari Kegiatan? Atau sebuah fragmen (juga kelas batin)? 3. Apakah maksud Anda kelas transfer harus digunakan sebagai pengganti kelas model aktual dalam Aktivitas (tampilan)?
manmal
14
1. Ya, saya menggunakannya sebagai tampilan dalam pola MVP. 2. secara pribadi, saya membagi mereka ke dalam kelas publik individu, tetapi ini adalah masalah selera saya kira :) 3. Saya menjelaskan ini dengan sangat buruk, kalimat "meneruskan kelas yang dibutuhkan" menyesatkan. Yang saya maksudkan adalah presenter duduk di antara tampilan dan model, membaca model dan kemudian memperbarui tampilan. Saya akan memperbarui jawaban saya menjadi sedikit lebih jelas :)
JustDanyul
terima kasih telah meluangkan waktu, saya mengerti sekarang :)
manmal
11
Saya sebenarnya sangat suka pengembangan Android karena sangat dipisahkan. Bagaimana saya menggunakan MVC: Menggunakan Aktivitas murni untuk pengguna IO, dan menggunakan layanan lokal untuk semua pemrosesan Anda. Ketika layanan ingin menunjukkan sesuatu - menyiarkannya ke aktivitas Anda! Aku benar-benar benci ketika dev lain terlalu banyak memproses dalam kegiatan.
Seseorang di suatu tempat
8
@ Seseorang di suatu tempat mengapa tidak memiliki kelas yang menangani hal ini di utas terpisah / AsyncTasks, mengapa layanan?
Bocah
87

Perbarui November 2018

Setelah bekerja dan membuat blog tentang MVC dan MVP di Android selama beberapa tahun (lihat bagian jawaban di bawah), saya memutuskan untuk menangkap pengetahuan dan pemahaman saya dalam bentuk yang lebih komprehensif dan mudah dicerna.

Jadi, saya merilis kursus video lengkap tentang arsitektur aplikasi Android. Jadi, jika Anda tertarik untuk menguasai pola arsitektur paling maju dalam pengembangan Android, lihat kursus komprehensif ini di sini .

Jawaban ini telah diperbarui agar tetap relevan pada November 2016


Sepertinya Anda mencari pola arsitektur daripada pola desain .

Pola desain bertujuan untuk menggambarkan "trik" umum yang mungkin diterapkan oleh programmer untuk menangani serangkaian tugas perangkat lunak berulang. Sebagai contoh: Dalam OOP, ketika ada kebutuhan untuk objek untuk memberi tahu satu set objek lain tentang beberapa peristiwa, pola desain pengamat dapat digunakan.

Karena aplikasi Android (dan sebagian besar AOSP) ditulis dalam Java, yang berorientasi objek, saya pikir Anda akan kesulitan mencari pola desain OOP tunggal yang TIDAK digunakan pada Android.

Pola arsitektur , di sisi lain, tidak menangani tugas perangkat lunak tertentu - mereka bertujuan untuk menyediakan template untuk organisasi perangkat lunak berdasarkan kasus penggunaan komponen perangkat lunak yang bersangkutan.

Kedengarannya agak rumit, tapi saya harap contoh akan menjelaskan: Jika beberapa aplikasi akan digunakan untuk mengambil data dari server jauh dan menyajikannya kepada pengguna secara terstruktur, maka MVC mungkin merupakan kandidat yang baik untuk dipertimbangkan. Perhatikan bahwa saya tidak mengatakan apa-apa tentang tugas perangkat lunak dan aliran program aplikasi - Saya baru saja menggambarkannya dari sudut pandang pengguna, dan seorang kandidat untuk pola arsitektur muncul.

Karena Anda menyebutkan MVC dalam pertanyaan Anda, saya rasa pola arsitektur adalah yang Anda cari.

Masukkan deskripsi gambar di sini


Secara historis, tidak ada pedoman resmi oleh Google tentang arsitektur aplikasi, yang (di antara alasan lainnya) menyebabkan kekacauan total dalam kode sumber aplikasi Android. Bahkan, bahkan hari ini sebagian besar aplikasi yang saya lihat masih tidak mengikuti praktik terbaik OOP dan tidak menunjukkan organisasi kode yang jelas secara logis.

Tapi hari ini situasinya berbeda - Google baru-baru ini merilis perpustakaan Data Binding , yang sepenuhnya terintegrasi dengan Android Studio, dan, bahkan, meluncurkan seperangkat cetak biru arsitektur untuk aplikasi Android .

Dua tahun lalu sangat sulit untuk menemukan informasi tentang MVC atau MVP di Android. Saat ini, MVC, MVP, dan MVVM telah menjadi "kata-kata seru" di komunitas Android, dan kami dikelilingi oleh banyak ahli yang terus-menerus berusaha meyakinkan kami bahwa MVx lebih baik daripada MVy. Menurut pendapat saya, membahas apakah MVx lebih baik daripada MVy sama sekali tidak ada artinya karena istilah itu sendiri sangat ambigu - lihat saja jawaban untuk pertanyaan ini , dan Anda akan menyadari bahwa orang yang berbeda dapat mengaitkan singkatan ini dengan konstruksi yang sama sekali berbeda.

Karena fakta bahwa pencarian pola arsitektur terbaik untuk Android telah resmi dimulai, saya pikir kita akan melihat beberapa ide lagi terungkap. Pada titik ini, benar-benar mustahil untuk memprediksi pola (atau pola) mana yang akan menjadi standar industri di masa depan - kita perlu menunggu dan melihat (saya kira itu masalah satu atau dua tahun).

Namun, ada satu prediksi yang dapat saya buat dengan tingkat kepercayaan yang tinggi: Penggunaan perpustakaan Binding Data tidak akan menjadi standar industri. Saya yakin untuk mengatakan bahwa karena perpustakaan Data Binding (dalam implementasinya saat ini) memberikan keuntungan produktivitas jangka pendek dan semacam pedoman arsitektur, tetapi itu akan membuat kode tidak dapat dipertahankan dalam jangka panjang. Setelah efek jangka panjang dari perpustakaan ini akan muncul - itu akan ditinggalkan.


Sekarang, meskipun kami memiliki semacam pedoman dan alat resmi hari ini, saya, secara pribadi, tidak berpikir bahwa pedoman dan alat ini adalah pilihan terbaik yang tersedia (dan mereka jelas bukan satu-satunya). Dalam aplikasi saya, saya menggunakan implementasi arsitektur MVC saya sendiri. Ini sederhana, bersih, dapat dibaca dan diuji, dan tidak memerlukan perpustakaan tambahan.

MVC ini tidak hanya berbeda secara kosmetik dari yang lain - ini didasarkan pada teori bahwa Aktivitas di Android bukan Elemen UI , yang memiliki implikasi luar biasa pada organisasi kode.

Jadi, jika Anda mencari pola arsitektur yang baik untuk aplikasi Android yang mengikuti prinsip SOLID , Anda dapat menemukan deskripsi satu di posting saya tentang pola arsitektur MVC dan MVP di Android .

Vasiliy
sumber
2
Dilakukan dengan baik untuk menyediakan sumber daya seperti itu! Terima kasih!
Aleksandar
1
Tautan yang sangat berguna!
Semaphor
Saya suka kursus videomu! Terima kasih
Viktor Apoyan
79

masukkan deskripsi gambar di sini

Ketika saya mencapai posting ini sangat membantu saya untuk memahami pola dengan contoh jadi saya harus membuat tabel di bawah ini untuk melihat dengan jelas pola desain & contoh mereka di Kerangka Android

Saya harap Anda akan merasa terbantu.

Peter Walter
sumber
4
Harap edit posting Anda dan perlihatkan konten yang sebenarnya sebagai teks alih-alih tangkapan layar. Orang lain tidak dapat menyalin dan menempel dari gambar Anda atau membantu Anda memperbaiki kesalahan ketik Anda. Lihat di sini untuk detailnya. Terima kasih.
Pang
1
Terima kasih atas jawaban ini Saya sangat bingung antara pola arsitektur dan pola desain, saya masih punya satu pertanyaan apa itu oo-desain dan pengembangan !? @Peter Walter
Rucha Bhatt Joshi
Saya memilih jawaban ini karena walaupun pertanyaan dari @ Burjua menyebutkan pola desain dengan merujuk pada arsitektur tetapi mereka tidak sama. Saya menganggap jawaban ini sangat informatif dan melengkapi pertanyaan awal
Xaren
Bus acara menggunakan pola desain penerbit dan pelanggan
Devrath
48

Ada berbagai pola yang digunakan dalam kerangka kerja Android seperti:

  • Penerima siaran menggunakan pola Observer
  • Doa layanan yang jauh menggunakan pola Proxy
  • Lihat dan lihat grup menggunakan pola Komposit
  • Kerangka kerja media menggunakan pola Facade
yash
sumber
5
bisa tolong bagikan tautan (referensi)
shanraisshan
tolong bagikan referensi sehingga saya dapat menemukan lebih banyak tentang itu. Terima kasih
Syed Hamza Hassan
27

Berikut ini adalah artikel yang bagus tentang Pola Desain Umum untuk Android :

Pola penciptaan:

  • Builder (mis. AlertDialog.Builder )
  • Injeksi Ketergantungan (mis. Belati 2 )
  • Singleton

Pola struktural:

  • Adaptor (misalnya, RecyclerView.Adapter )
  • Fasad (mis. Retrofit )

Pola perilaku:

  • Command (mis. EventBus )
  • Pengamat (misalnya RxAndroid )
  • Pengontrol Tampilan Model
  • Model View ViewModel ( mirip dengan pola MVC di atas )
Ineta
sumber
1
Poin-poin penting dari artikel itu akan menyenangkan.
Maxim G
Sementara ini secara teoritis dapat menjawab pertanyaan, akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi.
Bhargav Rao
Bus acara menggunakan pola desain penerbit dan pelanggan
Devrath
16

Kelas Android berikut menggunakan Pola Desain

1) View Holder menggunakan Pola Desain Singleton

2) Intent menggunakan Pola Desain Pabrik

3) Adaptor menggunakan Pola Desain Adaptor

4) Penerima Siaran menggunakan Pola Desain Pengamat

5) Lihat menggunakan Pola Desain Komposit

6) Media FrameWork menggunakan Pola Desain Façade

Yakub Abraham
sumber
11

Dalam kasus Notifikasi , NotificationCompat.Builderpenggunaan Pola Builder

Suka,

mBuilder = new NotificationCompat.Builder(this)
                    .setSmallIcon(R.drawable.ic_stat_notification)
                    .setContentTitle(getString(R.string.notification))
                    .setContentText(getString(R.string.ping))
                    .setDefaults(Notification.DEFAULT_ALL);
Jeff T.
sumber
3
Ini sebenarnya adalah pola Builder.
Piovezan
@Piovezan saya salah. Terima kasih telah mengoreksi saya. Saya pikir ini adalah versi sederhana dari Pola Penghias.
Jeff T.
6

Android juga menggunakan pola desain ViewHolder.

Ini digunakan untuk meningkatkan kinerja ListView saat menggulirnya.

Pola desain ViewHolder memungkinkan Anda untuk mengakses setiap tampilan item daftar tanpa perlu mencari, menghemat siklus prosesor yang berharga. Secara khusus, ia menghindari panggilan yang sering dari findViewById () selama scroll ListView, dan itu akan membuatnya lebih lancar.

amarnathpatel
sumber
5

Semua pola ini, MVC, MVVM , MVP, dan Model Presentasi , dapat diterapkan ke aplikasi Android, tetapi tanpa kerangka kerja pihak ketiga, tidaklah mudah untuk mendapatkan struktur yang terorganisir dengan baik dan kode bersih.

MVVM berasal dari PresentationModel. Ketika kami menerapkan MVC, MVVM , dan Model Presentasi ke aplikasi Android, yang benar-benar kami inginkan adalah memiliki proyek terstruktur yang jelas dan yang lebih penting lebih mudah untuk unit test.

Saat ini, tanpa kerangka kerja pihak ketiga, Anda biasanya memiliki banyak kode (seperti addXXListener (), findViewById (), dll.), Yang tidak menambah nilai bisnis apa pun. Terlebih lagi, Anda harus menjalankan tes unit Android alih-alih tes JUnit normal, yang membutuhkan waktu lama untuk dijalankan dan membuat tes unit agak tidak praktis.

Untuk alasan ini, beberapa tahun yang lalu kami memulai proyek sumber terbuka, RoboBinding - Kerangka kerja Model Presentasi yang mengikat data untuk platform Android. RoboBinding membantu Anda menulis kode UI yang lebih mudah dibaca, diuji, dan dirawat. RoboBinding menghapus kebutuhan kode yang tidak perlu seperti addXXListener atau lebih , dan menggeser logika UI ke Model Presentasi, yang merupakan POJO dan dapat diuji melalui tes JUnit normal . RoboBinding sendiri hadir dengan lebih dari 300 tes JUnit untuk memastikan kualitasnya.

Cheng
sumber
1

Di Android, pola "prosesor antrian kerja" biasanya digunakan untuk membongkar tugas dari utas utama aplikasi.

Contoh: Desain kelas IntentService.

IntentService menerima Intents, meluncurkan utas pekerja, dan menghentikan layanan sebagaimana mestinya. Semua permintaan ditangani pada utas pekerja tunggal.

amarnathpatel
sumber
0

Binder menggunakan "Pola Pengamat" untuk pemberitahuan Penerima Kematian.

Vinodh
sumber