Saya sudah banyak membaca tentang pola tunggal dan bagaimana itu "buruk" karena membuat kelas-kelas menggunakannya sulit untuk diuji sehingga harus dihindari. Saya telah membaca beberapa artikel yang menjelaskan bagaimana singleton dapat diganti dengan suntikan ketergantungan, tetapi tampaknya tidak perlu bagi saya.
Inilah masalah saya sedikit lebih detail. Saya sedang membangun aplikasi seluler menggunakan React Native dan saya ingin membuat klien REST yang akan berkomunikasi dengan server, mendapatkan data, memposting data, dan menangani login (menyimpan token login dan mengirimkannya dengan setiap permintaan setelah login).
Rencana awal saya adalah membuat objek tunggal (RESTClient) yang akan digunakan aplikasi saya pada awalnya untuk masuk dan kemudian membuat permintaan mengirim kredensial jika diperlukan. Pendekatan DI tampaknya sangat rumit bagi saya (mungkin karena saya tidak pernah menggunakan DI sebelumnya) tetapi saya menggunakan proyek ini untuk belajar sebanyak mungkin sehingga saya ingin melakukan yang terbaik di sini. Setiap saran dan komentar sangat dihargai.
Sunting: Saya sekarang sadar saya telah menjawab pertanyaan saya dengan buruk. Saya ingin beberapa panduan tentang cara menghindari pola tunggal di RN dan haruskah saya melakukannya. Untungnya Samuel memberi saya jawaban yang saya inginkan. Masalah saya adalah saya ingin menghindari pola tunggal dan menggunakan DI, tetapi tampaknya sangat rumit untuk mengimplementasikannya dalam React Native. Saya melakukan riset lebih lanjut dan mengimplementasikannya menggunakan sistem konteks Reacts.
Bagi siapa pun yang tertarik, inilah cara saya melakukannya. Seperti saya katakan, saya menggunakan konteks di RN yang merupakan sesuatu seperti alat peraga tetapi itu disebarkan ke setiap komponen.
Di komponen root saya memberikan dependensi yang diperlukan seperti ini:
export default class Root extends Component {
getChildContext() {
restClient: new MyRestClient();
}
render() {...}
}
Root.childContextTypes = {restClient: PropTypes.object};
Sekarang restClient tersedia di semua komponen di bawah Root. Saya dapat mengaksesnya seperti ini.
export default class Child extends Component {
useRestClient() {
this.context.restClient.getData(...);
}
render() {...}
}
Child.contextTypes = {restClient: PropTypes.object}
Ini secara efektif memindahkan pembuatan objek dari logika dan memisahkan implementasi klien REST dari komponen saya.