Apakah mungkin untuk menerapkan pola model-view-controller di Java untuk Android?
Atau sudah dilaksanakan melalui Kegiatan? Atau ada cara yang lebih baik untuk menerapkan pola MVC untuk Android?
Apakah mungkin untuk menerapkan pola model-view-controller di Java untuk Android?
Atau sudah dilaksanakan melalui Kegiatan? Atau ada cara yang lebih baik untuk menerapkan pola MVC untuk Android?
Jawaban:
Di Android Anda tidak memiliki MVC, tetapi Anda memiliki yang berikut:
Tidak ada pola MVC yang unik secara universal. MVC adalah konsep daripada kerangka kerja pemrograman yang solid. Anda dapat mengimplementasikan MVC Anda sendiri di platform apa pun. Selama Anda tetap pada ide dasar berikut, Anda menerapkan MVC:
Pikirkan juga seperti ini: Ketika Anda memprogram model Anda, model tersebut tidak perlu khawatir tentang rendering (atau kode spesifik platform). Model akan mengatakan kepada pandangan, saya tidak peduli apakah rendering Anda adalah Android atau iOS atau Windows Phone, ini yang saya butuhkan untuk Anda render. Tampilan hanya akan menangani kode rendering khusus platform.
Ini sangat berguna ketika Anda menggunakan Mono untuk berbagi model untuk mengembangkan aplikasi lintas platform.
Tindakan, pandangan, dan aktivitas pada Android adalah cara yang paling baik untuk bekerja dengan UI Android dan merupakan implementasi dari pola model-view-viewmodel (MVVM) , yang secara struktural serupa (dalam keluarga yang sama dengan) model-view –Kontrol.
Sejauh pengetahuan saya, tidak ada cara untuk keluar dari model ini. Ini mungkin dapat dilakukan, tetapi Anda mungkin akan kehilangan semua manfaat yang dimiliki model yang ada dan harus menulis ulang layer UI Anda sendiri untuk membuatnya bekerja.
Setelah beberapa pencarian, jawaban paling masuk akal adalah sebagai berikut:
MVC sudah diterapkan di Android sebagai:
Button
diturunkan android.view.View
.(Ini omong-omong menyiratkan tidak ada logika domain aplikasi dalam aktivitas.)
Hal yang paling masuk akal bagi pengembang kecil adalah mengikuti pola ini dan tidak mencoba melakukan apa yang Google putuskan untuk tidak lakukan.
Catatan: Aktivitas kadang-kadang dimulai kembali, jadi tidak ada tempat untuk data model (cara termudah untuk menyebabkan restart adalah dengan menghilangkan android:configChanges="keyboardHidden|orientation"
dari XML dan menghidupkan perangkat Anda).
EDIT
Kita mungkin berbicara tentang MVC , tetapi akan dikatakan FMVC , Framework - Model - View - Controller . The Kerangka (OS Android) membebankan gagasan tentang komponen siklus hidup dan peristiwa terkait, dan dalam prakteknya Pengendali ( Activity
/ Service
/ BroadcastReceiver
) adalah pertama-tama bertanggung jawab untuk mengatasi ini Kerangka -imposed peristiwa (seperti onCreate () ). Haruskah input pengguna diproses secara terpisah? Meskipun harus, Anda tidak dapat memisahkannya, acara input pengguna juga berasal dari Android.
Lagi pula, semakin sedikit kode yang tidak spesifik untuk Android yang Anda masukkan ke Activity
/ Service
/ Anda BroadcastReceiver
, semakin baik.
Button
mengetahui tentang Pengendali ? Tampaknya lebih logis bahwa Views hanya tahu tentang menampilkan sesuatu. Dan dengan mempertimbangkan bahwa Model hanya tahu tentang sifat data, inilah sebabnya Pengendali diperlukan: sesuatu harus tahu baik tentang Model dan Tampilan .
Service
s datang di bawah payung controller juga
Tidak ada pola MVC tunggal yang bisa Anda patuhi. MVC hanya menyatakan kurang lebih bahwa Anda tidak boleh bergaul dengan data dan melihat, sehingga misalnya pandangan bertanggung jawab untuk memegang data atau kelas yang memproses data secara langsung mempengaruhi tampilan.
Namun demikian, cara Android menangani kelas dan sumber daya, Anda terkadang dipaksa untuk mengikuti pola MVC. Yang lebih rumit menurut saya adalah aktivitas yang kadang-kadang bertanggung jawab untuk tampilan, tetapi tetap bertindak sebagai pengontrol pada saat yang sama.
Jika Anda mendefinisikan tampilan dan tata letak dalam file XML, muat sumber daya Anda dari folder res, dan jika Anda menghindari lebih atau kurang untuk membaur hal-hal ini dalam kode Anda, maka Anda tetap mengikuti pola MVC.
Anda dapat mengimplementasikan MVC di Android, tetapi itu tidak "didukung asli" dan membutuhkan upaya.
Yang mengatakan, saya pribadi cenderung ke arah MVP sebagai pola arsitektur yang jauh lebih bersih untuk pengembangan Android. Dan dengan mengatakan MVP saya maksudkan ini:
Saya juga memposting jawaban yang lebih rinci di sini .
Setelah bermain dengan berbagai pendekatan untuk implementasi MVC / MVP di Android, saya datang dengan pola arsitektur yang masuk akal, yang saya jelaskan dalam posting ini: MVP dan Pola Arsitektur MVC di Android .
Sumber daya terbaik yang saya temukan untuk mengimplementasikan MVC di Android adalah posting ini :
Saya mengikuti desain yang sama untuk salah satu proyek saya, dan itu berhasil dengan baik. Saya seorang pemula di Android, jadi saya tidak bisa mengatakan bahwa ini adalah solusi terbaik.
Saya membuat satu modifikasi: Saya membuat model dan pengontrol untuk setiap aktivitas di kelas aplikasi sehingga ini tidak dibuat kembali ketika mode landscape-portrait berubah.
Saya setuju dengan JDPeckham, dan saya percaya bahwa XML saja tidak cukup untuk mengimplementasikan bagian UI aplikasi.
Namun, jika Anda menganggap Aktivitas sebagai bagian dari tampilan maka penerapan MVC cukup mudah. Anda dapat mengganti Aplikasi (seperti yang dikembalikan oleh getApplication () di Aktivitas) dan di sinilah Anda dapat membuat pengontrol yang bertahan selama masa aplikasi Anda.
(Atau Anda dapat menggunakan pola tunggal seperti yang disarankan oleh dokumentasi Aplikasi)
MVC- Arsitektur di Android Lebih Baik Ikuti MVP saja daripada MVC di android. Namun tetap menurut jawaban pertanyaan ini bisa menjadi solusi
Deskripsi dan Pedoman
Controller -
Activity can play the role.
Use an application class to write the
global methods and define, and avoid
static variables in the controller label
Model -
Entity like - user, Product, and Customer class.
View -
XML layout files.
ViewModel -
Class with like CartItem and owner
models with multiple class properties
Service -
DataService- All the tables which have logic
to get the data to bind the models - UserTable,
CustomerTable
NetworkService - Service logic binds the
logic with network call - Login Service
Helpers -
StringHelper, ValidationHelper static
methods for helping format and validation code.
SharedView - fragmets or shared views from the code
can be separated here
AppConstant -
Use the Values folder XML files
for constant app level
CATATAN 1:
Sekarang, inilah keajaiban yang bisa Anda lakukan. Setelah Anda mengklasifikasikan potongan kode, tulis kelas antarmuka dasar seperti, IEntity dan IService. Nyatakan metode umum. Sekarang buat kelas abstrak BaseService dan mendeklarasikan set metode Anda sendiri dan memiliki pemisahan kode.
CATATAN 2: Jika aktivitas Anda menghadirkan banyak model daripada menulis kode / logika dalam aktivitas, lebih baik membagi pandangan menjadi beberapa bagian. Maka itu lebih baik. Jadi di masa depan jika ada model lain yang diperlukan untuk muncul di tampilan, tambahkan satu fragmen lagi.
CATATAN 3: Pemisahan kode sangat penting. Setiap komponen dalam arsitektur harus independen tidak memiliki logika tergantung Jika kebetulan jika Anda memiliki sesuatu yang bergantung pada logika, tulis kelas logika pemetaan di antaranya. Ini akan membantu Anda di masa depan.
Pembuatan Android UI menggunakan tata letak, sumber daya, aktivitas, dan maksud adalah implementasi dari pola MVC. Silakan lihat tautan berikut untuk lebih lanjut tentang ini - http://www.cs.otago.ac.nz/cosc346/labs/COSC346-lab2.2up.pdf
Pola MVC Android (jenis) diimplementasikan dengan kelas Adaptornya . Mereka mengganti controller dengan "adaptor." Deskripsi untuk status adaptor:
Objek Adapter bertindak sebagai jembatan antara AdapterView dan data yang mendasari untuk tampilan itu.
Saya hanya melihat ini untuk aplikasi Android yang membaca dari database, jadi saya belum tahu seberapa baik kerjanya. Namun, sepertinya sedikit seperti arsitektur Model-View-Delegate Qt, yang mereka klaim merupakan langkah dari pola MVC tradisional. Setidaknya pada PC, pola Qt bekerja cukup baik.
Meskipun pos ini tampaknya sudah tua, saya ingin menambahkan dua berikut ini untuk menginformasikan tentang perkembangan terbaru di bidang ini untuk Android:
android-binding - Menyediakan kerangka kerja yang memungkinkan pengikatan widget tampilan android ke model data. Ini membantu untuk menerapkan pola MVC atau MVVM di aplikasi android.
roboguice - RoboGuice mengeluarkan dugaan pembangunan. Suntikkan View, Resource, System Service, atau objek lain apa pun, dan biarkan RoboGuice mengurus detailnya.
Deskripsi:
Pola MVC pada dasarnya adalah ini:
Fitur penting dari MVC: Kita dapat memodifikasi Model atau Tampilan atau Pengontrol masih tidak memengaruhi yang lain
Saya pikir penjelasan sederhana yang paling berguna ada di sini: http://www.cs.otago.ac.nz/cosc346/labs/COSC346-lab2.2up.pdf
Dari semua yang saya lihat dan baca di sini, menerapkan semua hal ini membuatnya lebih sulit dan tidak cocok dengan bagian-bagian lain dari android.
Memiliki aktivitas mengimplementasikan pendengar lain sudah merupakan cara standar Android. Cara yang paling tidak berbahaya adalah dengan menambahkan Java Observer seperti yang dijelaskan oleh slide dan kelompokkan onClick dan jenis tindakan lainnya ke dalam fungsi yang masih ada dalam Activity.
Cara Android adalah bahwa Activity melakukan keduanya. Melawannya tidak benar-benar membuat memperluas atau melakukan pengkodean di masa depan lebih mudah.
Saya setuju dengan posting ke-2 . Ini semacam sudah diterapkan, hanya saja tidak seperti orang terbiasa. Apakah itu di file yang sama atau tidak, sudah ada pemisahan. Tidak perlu membuat pemisahan ekstra untuk membuatnya cocok dengan bahasa dan OS lain.
Mengejutkan melihat tidak ada tulisan di sini yang menjawab pertanyaan itu. Mereka terlalu umum, tidak jelas, salah atau tidak membahas implementasi di android.
Di MVC, layer View hanya tahu cara menampilkan antarmuka pengguna (UI). Jika ada data yang diperlukan untuk ini, ia mendapatkannya dari lapisan Model . Tetapi View TIDAK langsung meminta model untuk menemukan data, ia melakukannya melalui Controller . Jadi Pengendali memanggil Model untuk memberikan data yang diperlukan untuk Tampilan . Setelah data siap, Controller menginformasikan View bahwa data siap untuk diperoleh dari Model . Sekarang View bisa mendapatkan data dari Model .
Alur ini dapat diringkas sebagai berikut:
Perlu dicatat bahwa View dapat mengetahui tentang ketersediaan data dalam Model baik melalui Pengendali - juga dikenal sebagai MVC Pasif - atau dengan mengamati data dalam Model dengan mendaftarkan yang dapat diamati ke dalamnya, yaitu MVC Aktif .
Pada bagian implementasi, salah satu hal pertama yang terlintas dalam pikiran adalah komponen Android apa yang harus digunakan untuk View ? Activity
atau Fragment
?
Jawabannya adalah tidak masalah dan keduanya bisa digunakan. The View harus dapat menyajikan user interface (UI) pada perangkat dan merespon interaksi pengguna dengan UI. Keduanya Activity
dan Fragment
menyediakan metode yang diperlukan untuk ini.
Pada contoh aplikasi yang digunakan dalam artikel ini saya telah menggunakan Activity
untuk View lapisan, tetapi Fragment
juga dapat digunakan.
Aplikasi sampel lengkap dapat ditemukan di cabang 'mvc' dari repo GitHub saya di sini .
Saya juga telah berurusan dengan pro dan kontra dari arsitektur MVC di android melalui contoh di sini .
Bagi mereka yang tertarik, saya telah memulai serangkaian artikel tentang arsitektur aplikasi android di sini di mana saya membandingkan berbagai arsitektur, yaitu MVC, MVP, MVVM, untuk pengembangan aplikasi android melalui aplikasi kerja yang lengkap.
Bosan dengan bencana MVx di Android Saya baru-baru ini membuat perpustakaan kecil yang menyediakan aliran data searah dan mirip dengan konsep MVC: https://github.com/zserge/anvil
Pada dasarnya, Anda memiliki komponen (aktivitas, fragmen, dan grup tampilan). Di dalam Anda menentukan struktur dan gaya lapisan tampilan. Anda juga menentukan bagaimana data harus terikat pada tampilan. Akhirnya, Anda dapat mengikat pendengar di tempat yang sama.
Kemudian, setelah data Anda diubah - metode global "render ()" akan dipanggil, dan pandangan Anda akan diperbarui secara cerdas dengan data terbaru.
Berikut adalah contoh komponen yang memiliki segalanya di dalamnya untuk kekompakan kode (tentu saja Model dan Pengontrol dapat dengan mudah dipisahkan). Di sini "count" adalah model, metode view () adalah view, dan "v -> count ++" adalah controller yang mendengarkan tombol klik dan memperbarui model.
public MyView extends RenderableView {
public MyView(Context c) {
super(c);
}
private int count = 0;
public void view() {
frameLayout(() -> { // Define your view hierarchy
size(FILL, WRAP);
button(() -> {
textColor(Color.RED); // Define view style
text("Clicked " + count); // Bind data
onClick(v -> count++); // Bind listeners
});
});
}
Dengan model dan pengontrol yang terpisah akan terlihat seperti:
button(() -> {
textColor(Color.RED);
text("Clicked " + mModel.getClickCount());
onClick(mController::onButtonClicked);
});
Di sini, di setiap tombol klik nomor akan meningkat, kemudian "render ()" akan dipanggil, dan teks tombol akan diperbarui.
Sintaksnya menjadi lebih menyenangkan jika Anda menggunakan Kotlin: http://zserge.com/blog/anvil-kotlin.html . Juga, ada sintaksis alternatif untuk Jawa tanpa lambdas.
Perpustakaan itu sendiri sangat ringan, tidak memiliki dependensi, tidak menggunakan refleksi, dll.
(Penafian: Saya penulis perpustakaan ini)
Menurut penjelasan yang dijelaskan tim Xamarin (di MVC iOS "Saya tahu itu tampak aneh, tapi tunggu sebentar"):
Saya bisa mengatakan ini:
Model pada Android hanyalah objek parcelable. Tampilannya adalah tata letak XML, dan pengontrolnya adalah (aktivitas + fragmennya).
* Ini hanya pendapat saya, bukan dari sumber atau buku apa pun.
Tidak ada arsitektur MVC yang diimplementasikan, tetapi satu set perpustakaan / contoh ada untuk mengimplementasikan arsitektur MVP (model-view-presenter).
Silakan periksa tautan ini:
Google menambahkan contoh MVP arsitektur Android:
Saya telah melihat bahwa banyak orang mengatakan MVC sudah diterapkan di Android, tetapi itu tidak benar. Android tidak mengikuti MVC secara default.
Karena saya tidak Google akan pernah memaksakan pembatasan implementasi MVC seperti iPhone, tetapi terserah pengembang yang berpola atau teknik yang mereka inginkan dalam proyek mereka, Dalam aplikasi kecil atau sederhana penggunaan MVC tidak diperlukan, tetapi sebagai aplikasi tumbuh dan semakin rumit dan membutuhkan modifikasi kodenya di tahun-tahun kemudian, maka muncul kebutuhan pola MVC di Android.
Ini memberikan cara mudah untuk memodifikasi kode dan juga membantu dalam pengurangan masalah. Jika Anda ingin menerapkan MVC di Android, ikuti tautan di bawah ini dan nikmati penerapan MVC di proyek Anda.
http://www.therealjoshua.com/2011/11/android-architecture-part-1-intro/
Tetapi saat ini saya pikir MVP bersama dengan Android Architectural Pattern adalah salah satu pilihan pengembang terbaik yang harus digunakan untuk aplikasi android yang bersih dan kuat.
Ketika kami menerapkan MVC, MVVM , atau 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.
Dalam pemahaman saya, cara Android menangani pola MVC adalah seperti:
Anda memiliki Kegiatan, yang berfungsi sebagai pengontrol. Anda memiliki kelas yang tanggung jawabnya untuk mendapatkan data - model, dan kemudian Anda memiliki kelas Tampilan yang merupakan tampilan.
Ketika berbicara tentang tampilan, kebanyakan orang berpikir hanya untuk bagian visualnya yang didefinisikan dalam xml. Jangan lupa bahwa View juga memiliki bagian program dengan konstruktor, metode, dan lain-lain, yang didefinisikan dalam kelas java.