Studi Kasus Aplikasi Lintas Platform: Tugas
TaskyPortable adalah aplikasi daftar tugas yang mudah dilakukan. Dokumen ini membahas bagaimana itu dirancang dan dibangun, mengikuti panduan dokumen Membangun Aplikasi Lintas Platform. Diskusi mencakup area berikut:
Proses Desain
Dianjurkan untuk membuat peta jalan untuk apa yang ingin Anda capai sebelum Anda mulai mengkoding. Ini terutama berlaku untuk pengembangan lintas platform, di mana Anda membangun fungsionalitas yang akan diekspos dengan berbagai cara. Dimulai dengan gagasan yang jelas tentang apa yang Anda bangun menghemat waktu dan upaya nanti dalam siklus pengembangan.
Persyaratan
Langkah pertama dalam merancang aplikasi adalah mengidentifikasi fitur yang diinginkan. Ini bisa menjadi tujuan tingkat tinggi atau kasus penggunaan terperinci. Tasky memiliki persyaratan fungsi yang mudah:
- Menampilkan daftar tugas
- Menambahkan, mengedit, dan menghapus tugas
- Atur status tugas ke 'selesai'
Anda harus mempertimbangkan penggunaan fitur khusus platform. Dapatkah Tasky memanfaatkan geofencing iOS atau Windows Telepon Live Tiles? Bahkan jika Anda tidak menggunakan fitur khusus platform dalam versi pertama, Anda harus merencanakan ke depan untuk memastikan bisnis & lapisan data Anda dapat mengakomodasinya.
Desain Antarmuka Pengguna
Mulailah dengan desain tingkat tinggi yang dapat diimplementasikan di seluruh platform target. Berhati-hatilah untuk mencatat batasan UI platform-specfic. Misalnya, TabBarController
di iOS dapat menampilkan lebih dari lima tombol, sedangkan Windows Telepon setara dapat menampilkan hingga empat tombol.
Gambar aliran layar menggunakan alat pilihan Anda (kertas berfungsi).
Model data
Mengetahui data apa yang perlu disimpan akan membantu menentukan mekanisme persistensi mana yang akan digunakan. Lihat Akses Data Lintas Platform untuk informasi tentang mekanisme penyimpanan yang tersedia dan membantu memutuskan di antara mereka. Untuk proyek ini, kita akan menggunakan SQLite.NET.
Tasky perlu menyimpan tiga properti untuk setiap 'TaskItem':
- Nama – String
- Catatan – String
- Selesai – Boolean
Fungsionalitas Inti
Pertimbangkan API yang perlu dikonsumsi antarmuka pengguna untuk memenuhi persyaratan. Daftar tugas memerlukan fungsi berikut:
- Mencantumkan semua tugas – untuk menampilkan daftar layar utama dari semua tugas yang tersedia
- Mendapatkan satu tugas – saat baris tugas disentuh
- Simpan satu tugas – saat tugas diedit
- Menghapus satu tugas – saat tugas dihapus
- Membuat tugas kosong – saat tugas baru dibuat
Untuk mencapai penggunaan kembali kode, API ini harus diimplementasikan sekali di Pustaka Kelas Portabel.
implementasi
Setelah desain aplikasi disepakati, pertimbangkan bagaimana hal itu mungkin diimplementasikan sebagai aplikasi lintas platform. Ini akan menjadi arsitektur aplikasi. Mengikuti panduan dalam dokumen Membangun Aplikasi Lintas Platform, kode aplikasi harus dipecah menjadi bagian-bagian berikut:
- Kode Umum – proyek umum yang berisi kode yang dapat digunakan kembali untuk menyimpan data tugas; mengekspos kelas Model dan API untuk mengelola penyimpanan dan pemuatan data.
- Kode khusus platform – proyek khusus platform yang mengimplementasikan UI asli untuk setiap sistem operasi, menggunakan kode umum sebagai 'back end'.
Kedua bagian ini dijelaskan di bagian berikut.
Kode Umum (PCL)
Tasky Portable menggunakan strategi Pustaka Kelas Portabel untuk berbagi kode umum. Lihat dokumen Opsi Kode Berbagi untuk deskripsi opsi berbagi kode.
Semua kode umum, termasuk lapisan akses data, kode database, dan kontrak, ditempatkan dalam proyek pustaka.
Proyek PCL lengkap diilustrasikan di bawah ini. Semua kode di pustaka portabel kompatibel dengan setiap platform yang ditargetkan. Saat disebarkan, setiap aplikasi asli akan mereferensikan pustaka tersebut.
Diagram kelas di bawah ini menunjukkan kelas yang dikelompokkan menurut lapisan. Kelas SQLiteConnection
ini adalah kode boilerplate dari paket Sqlite-NET. Kelas lainnya adalah kode kustom untuk Tasky. Kelas TaskItemManager
dan TaskItem
mewakili API yang diekspos ke aplikasi khusus platform.
Menggunakan namespace untuk memisahkan lapisan membantu mengelola referensi di antara setiap lapisan. Proyek khusus platform hanya perlu menyertakan using
pernyataan untuk Lapisan Bisnis. Lapisan Akses Data dan Lapisan Data harus dienkapsulasi oleh API yang diekspos oleh TaskItemManager
di Lapisan Bisnis.
Referensi
Pustaka kelas portabel harus dapat digunakan di beberapa platform, masing-masing dengan berbagai tingkat dukungan untuk platform dan fitur kerangka kerja. Karena itu, ada batasan paket dan pustaka kerangka kerja mana yang dapat digunakan. Misalnya, Xamarin.iOS tidak mendukung kata kunci c# dynamic
, sehingga pustaka kelas portabel tidak dapat menggunakan paket apa pun yang bergantung pada kode dinamis, meskipun kode tersebut akan berfungsi di Android. Visual Studio untuk Mac akan mencegah Anda menambahkan paket dan referensi yang tidak kompatibel, tetapi Anda harus mengingat batasan untuk menghindari kejutan di kemudian hari.
Catatan: Anda akan melihat bahwa pustaka kerangka kerja referensi proyek yang belum Anda gunakan. Referensi ini disertakan sebagai bagian dari templat proyek Xamarin. Saat aplikasi dikompilasi, proses penautan akan menghapus kode yang tidak direferensikan, jadi meskipun System.Xml
telah direferensikan, aplikasi tersebut tidak akan disertakan dalam aplikasi akhir karena kami tidak menggunakan fungsi Xml apa pun.
Lapisan Data (DL)
Lapisan Data berisi kode yang melakukan penyimpanan fisik data – baik ke database, file datar, atau mekanisme lainnya. Lapisan data Tasky terdiri dari dua bagian: pustaka SQLite-NET dan kode kustom yang ditambahkan untuk menyambungkannya.
Tasky mengandalkan paket NuGet Sqlite-net (diterbitkan oleh Frank Krueger) untuk menyematkan kode SQLite-NET yang menyediakan antarmuka database Object-Relational Mapping (ORM). Kelas TaskItemDatabase
mewarisi dari SQLiteConnection
dan menambahkan metode Buat, Baca, Perbarui, Hapus (CRUD) yang diperlukan untuk membaca dan menulis data ke SQLite. Ini adalah implementasi boilerplate sederhana dari metode CRUD generik yang dapat digunakan kembali dalam proyek lain.
TaskItemDatabase
adalah singleton, memastikan bahwa semua akses terjadi terhadap instans yang sama. Kunci digunakan untuk mencegah akses bersamaan dari beberapa utas.
SQLite di Windows Telepon
Meskipun iOS dan Android keduanya dikirim dengan SQLite sebagai bagian dari sistem operasi, Windows Telepon tidak menyertakan mesin database yang kompatibel. Untuk berbagi kode di ketiga platform, SQLite versi asli ponsel Windows diperlukan. Lihat Bekerja dengan Database Lokal untuk informasi selengkapnya tentang menyiapkan proyek Windows Telepon anda untuk Sqlite.
Menggunakan Antarmuka untuk Menggeneralisasi Akses Data
Lapisan Data mengambil dependensi BL.Contracts.IBusinessIdentity
sehingga dapat menerapkan metode akses data abstrak yang memerlukan kunci primer. Setiap kelas Lapisan Bisnis yang mengimplementasikan antarmuka kemudian dapat dipertahankan di Lapisan Data.
Antarmuka hanya menentukan properti bilangan bulat untuk bertindak sebagai kunci utama:
public interface IBusinessEntity {
int ID { get; set; }
}
Kelas dasar mengimplementasikan antarmuka dan menambahkan atribut SQLite-NET untuk menandainya sebagai kunci primer yang bertambah secara otomatis. Kelas apa pun di Lapisan Bisnis yang mengimplementasikan kelas dasar ini kemudian dapat dipertahankan di Lapisan Data:
public abstract class BusinessEntityBase : IBusinessEntity {
public BusinessEntityBase () {}
[PrimaryKey, AutoIncrement]
public int ID { get; set; }
}
Contoh metode generik di Lapisan Data yang menggunakan antarmuka adalah metode ini GetItem<T>
:
public T GetItem<T> (int id) where T : BL.Contracts.IBusinessEntity, new ()
{
lock (locker) {
return Table<T>().FirstOrDefault(x => x.ID == id);
}
}
Penguncian untuk mencegah Akses Bersamaan
Kunci diimplementasikan dalam TaskItemDatabase
kelas untuk mencegah akses bersamaan ke database. Ini untuk memastikan akses bersamaan dari utas yang berbeda diserialisasikan (jika tidak, komponen UI mungkin mencoba membaca database pada saat yang sama utas latar belakang memperbaruinya). Contoh bagaimana kunci diimplementasikan ditunjukkan di sini:
static object locker = new object ();
public IEnumerable<T> GetItems<T> () where T : BL.Contracts.IBusinessEntity, new ()
{
lock (locker) {
return (from i in Table<T> () select i).ToList ();
}
}
public T GetItem<T> (int id) where T : BL.Contracts.IBusinessEntity, new ()
{
lock (locker) {
return Table<T>().FirstOrDefault(x => x.ID == id);
}
}
Sebagian besar kode Lapisan Data dapat digunakan kembali di proyek lain. Satu-satunya kode khusus aplikasi dalam lapisan adalah CreateTable<TaskItem>
panggilan di TaskItemDatabase
konstruktor.
Lapisan Akses Data (DAL)
Kelas ini TaskItemRepository
merangkum mekanisme penyimpanan data dengan API dengan jenis kuat yang memungkinkan TaskItem
objek dibuat, dihapus, diambil, dan diperbarui.
Menggunakan Kompilasi Bersyarah
Kelas menggunakan kompilasi kondisional untuk mengatur lokasi file - ini adalah contoh penerapan Platform Divergence. Properti yang mengembalikan jalur dikompilasi ke kode yang berbeda di setiap platform. Direktif kompilator khusus platform dan kode ditunjukkan di sini:
public static string DatabaseFilePath {
get {
var sqliteFilename = "TaskDB.db3";
#if SILVERLIGHT
// Windows Phone expects a local path, not absolute
var path = sqliteFilename;
#else
#if __ANDROID__
// Just use whatever directory SpecialFolder.Personal returns
string libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); ;
#else
// we need to put in /Library/ on iOS5.1+ to meet Apple's iCloud terms
// (they don't want non-user-generated data in Documents)
string documentsPath = Environment.GetFolderPath (Environment.SpecialFolder.Personal); // Documents folder
string libraryPath = Path.Combine (documentsPath, "..", "Library"); // Library folder
#endif
var path = Path.Combine (libraryPath, sqliteFilename);
#endif
return path;
}
}
Bergantung pada platform, outputnya adalah "<app path>/Library/TaskDB.db3" untuk iOS, "<app path>/Documents/TaskDB.db3" untuk Android atau hanya "TaskDB.db3" untuk Windows Telepon.
Lapisan Bisnis (BL)
Lapisan Bisnis mengimplementasikan kelas Model dan Fasad untuk mengelolanya.
Dalam Tasky, Model adalah TaskItem
kelas dan TaskItemManager
mengimplementasikan pola Fasad untuk menyediakan API untuk mengelola TaskItems
.
Fasad
TaskItemManager
membungkus DAL.TaskItemRepository
untuk menyediakan metode Dapatkan, Simpan, dan Hapus yang akan dirujuk oleh Lapisan Aplikasi dan UI.
Aturan dan logika bisnis akan ditempatkan di sini jika diperlukan - misalnya aturan validasi apa pun yang harus dipenuhi sebelum objek disimpan.
API untuk Kode Khusus Platform
Setelah kode umum ditulis, antarmuka pengguna harus dibangun untuk mengumpulkan dan menampilkan data yang diekspos olehnya. Kelas mengimplementasikan TaskItemManager
pola Fasad untuk menyediakan API sederhana agar kode aplikasi dapat diakses.
Kode yang ditulis dalam setiap proyek khusus platform umumnya akan digabungkan erat dengan SDK asli perangkat tersebut, dan hanya mengakses kode umum menggunakan API yang ditentukan oleh TaskItemManager
. Ini termasuk metode dan kelas bisnis yang dieksposnya, seperti TaskItem
.
Gambar tidak dibagikan di seluruh platform tetapi ditambahkan secara independen ke setiap proyek. Ini penting karena setiap platform menangani gambar secara berbeda, menggunakan nama file, direktori, dan resolusi yang berbeda.
Bagian yang tersisa membahas detail implementasi khusus platform dari Antarmuka Pengguna Tugas.
Aplikasi iOS
Hanya ada beberapa kelas yang diperlukan untuk menerapkan aplikasi iOS Tasky menggunakan proyek PCL umum untuk menyimpan dan mengambil data. Proyek iOS Xamarin.iOS lengkap ditunjukkan di bawah ini:
Kelas ditampilkan dalam diagram ini, dikelompokkan ke dalam lapisan.
Referensi
Aplikasi iOS mereferensikan pustaka SDK khusus platform – misalnya. Xamarin.iOS dan MonoTouch.Dialog-1.
Ini juga harus mereferensikan TaskyPortableLibrary
proyek PCL.
Daftar referensi diperlihatkan di sini:
Lapisan Aplikasi dan Lapisan Antarmuka Pengguna diimplementasikan dalam proyek ini menggunakan referensi ini.
Lapisan Aplikasi (AL)
Lapisan Aplikasi berisi kelas khusus platform yang diperlukan untuk 'mengikat' objek yang diekspos oleh PCL ke UI. Aplikasi khusus iOS memiliki dua kelas untuk membantu menampilkan tugas:
- EditingSource – Kelas ini digunakan untuk mengikat daftar tugas ke antarmuka pengguna. Karena
MonoTouch.Dialog
digunakan untuk daftar Tugas, kita perlu mengimplementasikan pembantuUITableView
ini untuk mengaktifkan fungsionalitas usap-ke-hapus di . Swipe-to-delete umum di iOS, tetapi bukan Android atau Windows Telepon, jadi proyek khusus iOS adalah satu-satunya yang mengimplementasikannya. - TaskDialog – Kelas ini digunakan untuk mengikat satu tugas ke UI. Ini menggunakan API Refleksi untuk 'membungkus
MonoTouch.Dialog
'TaskItem
objek dengan kelas yang berisi atribut yang benar untuk memungkinkan layar input diformat dengan benar.
Kelas TaskDialog
menggunakan MonoTouch.Dialog
atribut untuk membuat layar berdasarkan properti kelas. Kelasnya terlihat seperti ini:
public class TaskDialog {
public TaskDialog (TaskItem task)
{
Name = task.Name;
Notes = task.Notes;
Done = task.Done;
}
[Entry("task name")]
public string Name { get; set; }
[Entry("other task info")]
public string Notes { get; set; }
[Entry("Done")]
public bool Done { get; set; }
[Section ("")]
[OnTap ("SaveTask")] // method in HomeScreen
[Alignment (UITextAlignment.Center)]
public string Save;
[Section ("")]
[OnTap ("DeleteTask")] // method in HomeScreen
[Alignment (UITextAlignment.Center)]
public string Delete;
}
OnTap
Perhatikan bahwa atribut memerlukan nama metode - metode ini harus ada di kelas tempat MonoTouch.Dialog.BindingContext
dibuat (dalam hal ini, kelas yang HomeScreen
dibahas di bagian berikutnya).
Lapisan Antarmuka Pengguna (UI)
Lapisan Antarmuka Pengguna terdiri dari kelas-kelas berikut:
- AppDelegate – Berisi panggilan ke Appearance API untuk menata font dan warna yang digunakan dalam aplikasi. Tasky adalah aplikasi sederhana sehingga tidak ada tugas inisialisasi lain yang berjalan di
FinishedLaunching
. - Layar – subkelas
UIViewController
yang menentukan setiap layar dan perilakunya. Layar mengikat UI dengan kelas Lapisan Aplikasi dan API umum (TaskItemManager
). Dalam contoh ini layar dibuat dalam kode, tetapi dapat dirancang menggunakan Penyusun Antarmuka Xcode atau perancang papan cerita. - Gambar – Elemen visual adalah bagian penting dari setiap aplikasi. Tasky memiliki gambar layar splash dan ikon, yang untuk iOS harus disediakan dalam resolusi reguler dan Retina.
Tampilan beranda
Layar Beranda adalah MonoTouch.Dialog
layar yang menampilkan daftar tugas dari database SQLite. Ini mewarisi dari DialogViewController
dan mengimplementasikan kode untuk mengatur Root
ke berisi kumpulan TaskItem
objek untuk ditampilkan.
Dua metode utama yang terkait dengan menampilkan dan berinteraksi dengan daftar tugas adalah:
- PopulateTable – Menggunakan metode Lapisan
TaskManager.GetTasks
Bisnis untuk mengambil kumpulanTaskItem
objek yang akan ditampilkan. - Dipilih – Saat baris disentuh, menampilkan tugas di layar baru.
Layar Detail Tugas
Detail Tugas adalah layar input yang memungkinkan tugas diedit atau dihapus.
Tasky menggunakan MonoTouch.Dialog
API Refleksi untuk menampilkan layar, sehingga tidak UIViewController
ada implementasi. Sebagai gantinya HomeScreen
, kelas membuat instans DialogViewController
dan menampilkan menggunakan TaskDialog
kelas dari Lapisan Aplikasi.
Cuplikan layar ini memperlihatkan layar kosong yang menunjukkan atribut yang mengatur Entry
teks marka air di bidang Nama dan Catatan :
Fungsionalitas layar Detail Tugas (seperti menyimpan atau menghapus tugas) harus diimplementasikan di HomeScreen
kelas, karena di sinilah MonoTouch.Dialog.BindingContext
dibuat. Metode berikut HomeScreen
mendukung layar Detail Tugas:
- ShowTaskDetails – Membuat
MonoTouch.Dialog.BindingContext
untuk merender layar. Ini membuat layar input menggunakan pantulan untuk mengambil nama dan jenis properti dariTaskDialog
kelas. Informasi tambahan, seperti teks marka air untuk kotak input, diimplementasikan dengan atribut pada properti. - SaveTask – Metode ini dirujuk di
TaskDialog
kelas melaluiOnTap
atribut . Ini dipanggil ketika Simpan ditekan, dan menggunakan untuk mengambil data yangMonoTouch.Dialog.BindingContext
dimasukkan pengguna sebelum menyimpan perubahan menggunakanTaskItemManager
. - DeleteTask – Metode ini dirujuk di
TaskDialog
kelas melaluiOnTap
atribut . Ini menggunakanTaskItemManager
untuk menghapus data menggunakan kunci primer (properti ID).
Aplikasi Android
Proyek Xamarin.Android lengkap digambilkan di bawah ini:
Diagram kelas, dengan kelas yang dikelompokkan menurut lapisan:
Referensi
Proyek aplikasi Android harus mereferensikan perakitan Xamarin.Android khusus platform untuk mengakses kelas dari Android SDK.
Ini juga harus mereferensikan proyek PCL (misalnya. TaskyPortableLibrary) untuk mengakses data umum dan kode lapisan bisnis.
Lapisan Aplikasi (AL)
Mirip dengan versi iOS yang kita lihat sebelumnya, Lapisan Aplikasi dalam versi Android berisi kelas khusus platform yang diperlukan untuk 'mengikat' objek yang diekspos oleh Core ke UI.
TaskListAdapter – untuk menampilkan Daftar<T> objek yang perlu kita terapkan adaptor untuk menampilkan objek kustom dalam ListView
. Adaptor mengontrol tata letak mana yang digunakan untuk setiap item dalam daftar - dalam hal ini kode menggunakan tata letak SimpleListItemChecked
bawaan Android .
Antarmuka Pengguna (UI)
Lapisan Antarmuka Pengguna aplikasi Android adalah kombinasi kode dan markup XML.
- Sumber Daya/Tata Letak – tata letak layar dan desain sel baris yang diimplementasikan sebagai file AXML. AXML dapat ditulis dengan tangan, atau ditata secara visual menggunakan Xamarin UI Designer untuk Android.
- Sumber Daya/Dapat Digambar – gambar (ikon) dan tombol kustom.
- Layar – Subkelas aktivitas yang menentukan setiap layar dan perilakunya. Mengikat bersama UI dengan kelas Lapisan Aplikasi dan API umum (
TaskItemManager
).
Tampilan beranda
Layar Beranda terdiri dari subkelas HomeScreen
Aktivitas dan HomeScreen.axml
file yang menentukan tata letak (posisi tombol dan daftar tugas). Layar terlihat seperti ini:
Kode Layar Beranda mendefinisikan handler untuk mengklik tombol dan mengklik item dalam daftar, serta mengisi daftar dalam OnResume
metode (sehingga mencerminkan perubahan yang dibuat di Layar Detail Tugas). Data dimuat menggunakan Lapisan TaskItemManager
Bisnis dan TaskListAdapter
dari Lapisan Aplikasi.
Layar Detail Tugas
Layar Detail Tugas juga terdiri dari Activity
subkelas dan file tata letak AXML. Tata letak menentukan lokasi kontrol input dan kelas C# menentukan perilaku untuk memuat dan menyimpan TaskItem
objek.
Semua referensi ke pustaka PCL melalui TaskItemManager
kelas .
Aplikasi Windows Telepon
Proyek Windows Telepon lengkap:
Diagram di bawah ini menyajikan kelas yang dikelompokkan ke dalam lapisan:
Referensi
Proyek khusus platform harus mereferensikan pustaka khusus platform yang diperlukan (seperti Microsoft.Phone
dan System.Windows
) untuk membuat aplikasi Windows Telepon yang valid.
Ini juga harus mereferensikan proyek PCL (misalnya) TaskyPortableLibrary
untuk menggunakan TaskItem
kelas dan database.
Lapisan Aplikasi (AL)
Sekali lagi, seperti halnya versi iOS dan Android, lapisan aplikasi terdiri dari elemen non-visual yang membantu mengikat data ke antarmuka pengguna.
ViewModels
ViewModels membungkus data dari PCL ( TaskItemManager
) dan menyajikannya dengan cara yang dapat dikonsumsi oleh pengikatan data Silverlight/XAML. Ini adalah contoh perilaku khusus platform (seperti yang dibahas dalam dokumen Aplikasi Lintas Platform).
Antarmuka Pengguna (UI)
XAML memiliki kemampuan pengikatan data unik yang dapat dideklarasikan dalam markup dan mengurangi jumlah kode yang diperlukan untuk menampilkan objek:
- Pages – File XAML dan codebehind menentukan antarmuka pengguna dan mereferensikan ViewModels dan proyek PCL untuk menampilkan dan mengumpulkan data.
- Gambar – Layar splash, gambar latar belakang, dan ikon adalah bagian utama dari antarmuka pengguna.
MainPage
Kelas MainPage menggunakan TaskListViewModel
untuk menampilkan data menggunakan fitur pengikatan data XAML. Halaman DataContext
diatur ke model tampilan, yang diisi secara asinkron. {Binding}
Sintaks dalam XAML menentukan bagaimana data ditampilkan.
TaskDetailsPage
Setiap tugas ditampilkan dengan mengikat TaskViewModel
ke XAML yang ditentukan dalam TaskDetailsPage.xaml. Data tugas diambil melalui TaskItemManager
di Lapisan Bisnis.
Hasil
Aplikasi yang dihasilkan terlihat seperti ini di setiap platform:
iOS
Aplikasi ini menggunakan desain antarmuka pengguna standar iOS, seperti tombol 'tambahkan' yang diposisikan di bilah navigasi dan menggunakan ikon plus bawaan (+). Ini juga menggunakan perilaku tombol 'kembali' default UINavigationController
dan mendukung 'swipe-to-delete' dalam tabel.
Android
Aplikasi Android menggunakan kontrol bawaan termasuk tata letak bawaan untuk baris yang memerlukan 'centang' yang ditampilkan. Perilaku kembali perangkat keras/sistem didukung selain tombol kembali di layar.
Windows Phone
Aplikasi Windows Telepon menggunakan tata letak standar, mengisi bilah aplikasi di bagian bawah layar, bukan bilah navigasi di bagian atas.
Ringkasan
Dokumen ini telah memberikan penjelasan terperinci tentang bagaimana prinsip desain aplikasi berlapis telah diterapkan ke aplikasi sederhana untuk memfasilitasi penggunaan kembali kode di tiga platform seluler: iOS, Android, dan Windows Telepon.
Ini telah menjelaskan proses yang digunakan untuk merancang lapisan aplikasi dan mendiskusikan kode & fungsionalitas apa yang telah diterapkan di setiap lapisan.
Kode dapat diunduh dari github.