Ketika membuat perubahan pada sistem besar, saya sering menghadapi masalah yang memerlukan beberapa fungsionalitas untuk mendapatkan beberapa data dari bagian lain, tetapi mereka berada di bagian yang berbeda dari pohon panggilan yang dalam dan bercabang, mungkin mengalir melalui pendengar acara, panggilan yang ditangguhkan, dll. Dengan cara ini, perubahan sederhana dapat terjadi dengan cepat.
Kutipan terkait dari posting blog Yossi Kreinin di http://www.yosefk.com/blog/i-want-a-struct-linker.html :
Anda memiliki semacam struktur data yang sering Anda bagikan. Segera, hal yang paling berharga tentang struktur bukanlah data yang disimpannya, tetapi fakta bahwa itu tersedia sepanjang jalan melalui beberapa aliran kontrol berbulu.
Variabel global adalah salah satu cara klasik untuk membiarkan kode "berteriak" ke kode yang jauh, tetapi mereka diketahui bermasalah. Variabel yang dicakup secara dinamis adalah cara yang lebih terbatas, tetapi mereka juga bermasalah.
Apakah ada penelitian bahasa pemrograman yang ditujukan untuk memecahkan masalah ini? Bisakah kita membuatnya lebih mudah untuk menambahkan aliran data yang tidak terduga ke basis kode besar, sementara masih memiliki pemeriksaan statis, pengujian unit mudah dan barang lainnya?
sumber
Jawaban:
Anda merujuk ke CDI (Context Dependency Injection) AKA IoC (Inversion of Control). Java JSF dan Spring Framework adalah beberapa contohnya. ASP.NET MVC memiliki plugin seperti Unity. Javascript mulai memiliki struktur yang terorganisir menggunakan perpustakaan seperti RequireJS, yang memiliki perilaku injeksi yang terlihat dalam banyak kerangka kerja JS modern. Itu untuk memasang aplikasi lokal dan jarak jauh.
Untuk sambungan longgar di seluruh jaringan, perusahaan suka menggunakan Layanan Web dengan SOAP, REST, AJAX, atau metode panggilan jarak jauh biasa dengan RPC. Di Jawa Anda bisa menggunakan JAX-WS atau .NET WCF untuk membangun layanan terdistribusi. Kemudian Anda berbaris di bus layanan atau "aliran data" dari bahasa atau platform apa pun sebagai klien. Ruby, Python, Scala, Java, C #, ... apa saja.
Kopling longgar memungkinkan Anda untuk membagi dan menaklukkan masalah, dan layanan seringkali merupakan titik masuk ke database untuk menarik data. Meningkatkan tangga kita memiliki binatang yang disebut Antrian Pesan. Jalan itu mengarah ke kerangka kerja jenis perusahaan dan infrastruktur.
Jika proyek Anda bersikeras tidak ada jaringan, ada beberapa bahasa seperti Scala, Akka, NodeJS dll. Yang dirancang untuk aliran data yang tinggi dalam satu aplikasi. Mereka juga bekerja dengan beberapa atau semua teknologi yang disebutkan sebelumnya untuk proyek yang kompleks. Misalnya, Scala dapat digunakan dengan layanan JAX-RS REST untuk menarik semacam "data global" dari sumber data, dan memiliki Spring untuk kabel internal IoC. Ada juga banyak kerangka kerja eksekusi atau alur kerja di alat JBoss, .NET, dan GUI seperti MuleESB. Dalam perkembangannya, Eclipse dan Netbeans memungkinkan Anda menarik dan melepas layanan di layar bagan alur visual.
Akhirnya, Jawa masih memiliki kacang Singleton. Untuk menyesuaikan metode Anda saat run-time, gunakan kerangka kerja proxy atau refleksi. Tapi jujur, begitulah tahun 1999.
Jika Anda melakukan banyak panggilan untuk mengirim pesan kepada pengguna berdasarkan zona waktu mereka, menurut saya, mungkin ada 2 langkah cara untuk mencapai efek yang sama dengan yang dilihat pengguna. Tapi ya, kerangka CDI dikenakan oleh bahasa yang ada seperti mantel yang memberi mereka semua kekuatan fleksibel yang Anda sebutkan. Saya suka menyebutnya bawah sadar program saya, mengurus pekerjaan kotor dengan mulus.
sumber
Cara paling sederhana untuk melakukan ini dalam skala besar sebenarnya adalah dengan menggunakan semacam API enkapsulasi data. Ini bisa menjadi toko NoSQL atau bisa juga RDBMS yang dienkapsulasi (atau bisa juga di waktu dan tempat yang berbeda dalam aplikasi yang sama - tidak ada alasan mengapa Anda tidak bisa memiliki RDBMS yang menangani jangka panjang penyimpanan dan dB NoSQL yang menangani kontrol jangka pendek). Bahkan bisa berupa serangkaian objek tunggal.
Struktur data Anda kemudian dapat dibuat tersedia di semacam ruang netral, dengan cara yang agak terkelola. Ini adalah pendekatan yang kami ambil dengan LedgerSMB (tetapi dengan beberapa variabel semi-global untuk apa yang pada dasarnya disimpan lajang, tetapi sekali lagi ini dikelola, kami memilih langsung menyembunyikan objek karena itu membuat pengelolaan variabel sedikit lebih mudah tetapi kemudian ada semuanya 4).
Tentu saja pendekatan apa pun memiliki pengorbanan dan Anda tidak dapat menyiasati pengorbanan tersebut. Kuncinya adalah untuk melihat apa kompromi itu (manajemen vs kinerja vs kebersihan kode jebakan potensial) dan membuat keputusan berdasarkan apa yang terbaik untuk aplikasi Anda.
sumber
Jika Anda menggunakan (atau mengutip) kata-kata itu
maka saya berasumsi bahwa kode Anda benar-benar berantakan. Anda harus segera menjatuhkannya. Jika Anda menggunakan modularisasi / pemisahan masalah, tidak ada yang namanya "aliran kontrol berbulu". Kode Anda tidak memiliki kesederhanaan yang juga dapat disangkal oleh fakta bahwa Anda merujuk ke variabel global :-).
sumber