Singularity Code | Android Codebase
This readme comes with another languages :
Fitur utama masih dalam pengembangan dan testing seperti :
Follow project ini untuk mendapatkan update notifikasi.
Sebelumnya saya ingin mengucapkan terimakasih dan apresiasi untuk para kontributor yang sangat luar biasa Kontributor.
Anda dapat menggunakan codebase ini sebagai basis proyek anda dan memodifikasinya sesuai kebutuhan proyek anda. Saya membuat codebase ini, dengan harapan codebase ini bisa membantu siapa saja untuk memulai proyek mereka, terutama proyek berskala besar. Saya berterimakasih kepada siapa saja yang menggunakan codebase ini sebagai basis proyek mereka, dikarenakan dengan menggunakan codebase ini, anda turut berkontribusi membantu saya dalam menguji codebase ini. Saya harap dengan lebih banyak orang yang menggunakan codebase ini, akan bisa memberikan input dan masukan atau saran untuk membantu saya mengambangkan codebase ini. Untuk membuat codebase ini menjadi lebih baik dan robust. Saya juga akan sangat merasa senang untuk menerima saran, ide, maupun kontribusi dari anda sekalian untuk proyek ini.
Untuk mengukur sesuatu, kita memerlukan sebuah base line dan alat ukur, begitu juga untuk sebuah arsitektur software. Baseline tersebut adalah Alur Dependensi dan Alur Kerja, sementara alat ukurnya adalah Prinsib-prinsib pembuatan Software. Seberapa robust sebuath software dapat diukur dari seberapa banyak Prinsib-prinsib pembuatan Software yang diaplikasikan ke dalamnya. Selain dari pada itu adalah preferensi.
Disini kita akan "Back to Basic" dengan berfokus sepenuhnya pada Alur Dependensi dan Alur Kerja.
Saya memiliki prinsib sederhana; "Jika sulit berarti salah". Jadi kita akan membuatnya sedikit lebih mudah dengan menghadirkan sebuah module baru pada gradle project ,yaitu : Provider dan Igniter.
Ide utama dari proyek ini adalah:
Projek arsitektur mencakup keseluruhan arsitektur dari gradle project kita. Tidak segala hal bisa kita lakukan dengan gradle project akan tetapi Pengecualian adalah hal yang buruk jika kita tidak membatasinya. Jadi kita akan membatasi pengecualian tersebut hanya 2 hal.
Circular dependensi terjadi dikarenakan kita mengizinkan "Horizontal Dependency". Jadi kita tidak akan mengijinkan adanya Horizontal dependensi dalam design architecture ini.
Sebagai mana namanya, Provider bertugas untuk memprovide module berdasarkan kontrak module pada Provider. Sebagai contoh, module tersebut bisa sebuah API, Aktivitas, Widget dan lain sebagainya.
graph LR
A[Module 1] -- payload --> B((Provider)) -- payload --> C[Module 2]
Setiap module dapat berinteraksi dengan module lain melalui kontrak yang sudah dideklarasikan pada Provider Module. Tentu saja module tersebut sebelumnya harus diregistrasikan kedalam Igniter Module.
graph LR
A[Module 1] --> B((Provider))
C[Module 2] --> B
D[Module 3] --> B
B --> E{{Core}}
Seluruh module (yang masuk dalam kategori runtime module) hanya depend ke 1 Module, yakni Provider Module. Sementara Provider Module depend ke Core Module. Dalam arsitektur ini Core Module adalah sebuah pengecualian, dikarenakan Core Module memiliki sangat banyak komponent dan kebanyakan berukuran sangat kecil. Oleh Karena itu, akan jauh lebih mudah jika semua module yang membutuhkan core "Straight Depend" ke Core Module, dan semua module tetap harus mengakses Core Module melalui Provider.
Sebagaimana namanya, Igniter adalah sebuah module yang bertugas untuk menjadi sumbu api. Igniter perlu depend ke semua module, mengikatnya bersama-sama dan meng-injeksikannya ke dalam Application Class.
Application perlu diprovide oleh Igniter. Dan Igniter perlu menghubungkan seluruh Module ke satu sumbu api dalam Application class.
Anda bisa melihat overview arsitektur pada file arsitektur-overview.pdf
Aplikasi front-end hanya terdiri dari 2 hal yakni UI dan Data.
UI adalah module level tinggi, penuh dengan side-effect, lifecycle, configuration changes dan lain sebagainya. Module ini memang cukup rumit, oleh karena itu, prinsib SOLID dan Dependency injection akan sangat membantu kita. Tidak ada hal yang istimewa yang perlu saya sampaikan, akan tetapi ada satu hal:
THINK STATELESS
Buat segalanya stateless jika memungkinkan. Jangan membuat apapun yang memiliki internal state.
Note: Sekalipun UI penuh dengan side effect, kita tidak boleh hanya memakluminya. Melainkan kita harus sebisa mungkin menghilangkannya. Dalam pemrograman android imperativ, saya biasanya hanya mengijinkan side effect terjadi di Controller (Fragment atau Activity class).
Disini bagian menariknya. Data layer tidak memerlukan side-effect, tidak perlu memperdulikan lifecycle dan configuration changes (rotasi, dark mode, dll). Module ini sangat sederhana, jadi kita akan membuatnya sederhana.
Dalam contoh dalam project ini. Data module tidak perlu mematuhi SOLID principle. Akan tetapi kita akan memaksimalkan Functional Pattern sebisa mungkin. Saya masih menemukan beberapa kesulitan dalam hal support teknologi, dan dokumentasi, akan tetapi prinsib ini sangatlah sederhana sehingga kita bisa mengabaikannya untuk sementara ini.
Untuk profesional programmer mungkin akan merasa bahwa ini adalah hal yang tabu untuk di lakukan. Akan tetapi saya melakukan ini dengan tujuan experimental, yang artinya saya tidak membatasi implementasi yang akan user lakukan.
Domain layer sengaja dihapuskan untuk memaksimalkan pendekatan Pure Function pada data layer.
- Immutable Argument.
- Fungsi harus selalu return result bukan reference (tidak relevan dengan kotlin / java tapi baik untuk diketahui).
- Input yang sama harus mengasilkan output yang sama.
- Tidak memiliki side effect.
- Tidak memiliki state.
- Fungsi hanya bertugas untuk merubah sebuah input menjadi sebuah output baru. Contohnya merubah Integer menjadi String, atau merubah Payload menjadi Data atau memberikan Error / Exception / Either.Left jika proses tidak berhasil.
Saya akan sangat senang untuk menerima kontribusi dari siappun, dan saya mebuka proyek ini untuk kontribusi. Akan tetapi untuk sekarang saya masih belum sempat menyiapkan prosedur kontribusi. Oleh karena itu, jika anda berminat untuk melakukan kontribusi, anda dapat menghubungi saya secara langsung. Anda dapat menemukan saya pada section author di bawah.
Anda dapat melihat perkembangan proyek ini disini.
Saya steve, programmer for fun. Anda dapat menemukan saya pada akun berikut: