Bisakah kita membuatnya lebih mudah untuk menambahkan aliran data antara bagian yang jauh dari basis kode besar?

10

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?

Vladimir Slepnev
sumber
Cara Anda menyusun pertanyaan Anda, saya kira Anda memiliki aliran data dalam satu proses dalam pikiran, tidak ada komunikasi antarproses. Jadi masalah apa yang Anda lihat yang tidak dapat diselesaikan dengan mekanisme pengirim / pendengar acara standar?
Doc Brown
Contoh yang dibuat-buat: bayangkan bahwa jauh di dalam sistem Anda ada beberapa kode yang mengirim pesan teks kepada pengguna. Dan Anda mendapatkan persyaratan baru bahwa teks pesan harus bergantung pada waktu saat ini di zona waktu pengguna. Callstack terlihat seperti ini: beberapa kode yang mengetahui zona waktu pengguna, memanggil metode yang memanggil metode yang (... ulangi 15 kali) memanggil metode yang menghasilkan teks pesan. Ini adalah contoh sederhana menurut standar saya, karena hanya melibatkan komunikasi ke bawah, tetapi Anda masih harus mengubah tanda tangan dari 15 metode untuk membuat perubahan sepele Anda.
Vladimir Slepnev
Yah, saya kira apa yang bisa membantu adalah memodelkan aliran data secara eksplisit, dan memisahkan komponen dari aliran data. Insinyur perangkat lunak Jerman banyak menulis tentang topik ini, sebagian besar artikel dalam bahasa Jerman. Ini adalah artikel entri dalam bahasa Inggrisnya
Doc Brown
Saya pikir API internal tunggal dapat membantu. Itu akan dapat diakses di seluruh aplikasi dan akan merangkum semua logika pengambilan data.
superM

Jawaban:

1

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.

Pengembang Senor
sumber
Antrian Pesan mungkin berlebihan tetapi olahpesan adalah cara sempurna untuk membuat acara dipecat di seluruh papan. Java menggunakan Message Driven Beans (MDB) dan yang seharusnya memungkinkan program Anda untuk mengirim atau menerima 'percakapan' satu sama lain. Anda dapat melakukannya dengan cara ini untuk bonus asinkron.
Pengembang Senor
Terima kasih untuk petunjuknya! Itu pasti membuat saya bertanya-tanya bagaimana sebuah bahasa bisa terlihat jika dirancang dari bawah ke atas untuk mendukung injeksi ketergantungan dan pola serupa.
Vladimir Slepnev
0

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.

Chris Travers
sumber
Terima kasih atas jawabannya! Tampaknya bagi saya bahwa penelitian bahasa pemrograman dapat membantu mengatasi masalah ini. Misalnya, jika kode membaca beberapa data dari basis data global atau dari lajang simpanan, mungkin ada jaminan statis / deklaratif tentang data mana yang diperlukan.
Vladimir Slepnev
-1

Jika Anda menggunakan (atau mengutip) kata-kata itu

hairy flow of control

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 :-).

pengguna127749
sumber
Mengapa downvote? Kutipan itu tidak berisi pengantar yang persis mendukung pandangan saya: "(mungkin diklasifikasikan sebagai" Antipattern "atau" Kode Bau "dan karena itu memiliki nama di lingkaran yang sesuai, tapi saya tidak akan tahu, jadi saya akan biarkan tanpa nama) "
user127749
2
Ini sebenarnya bukan jawaban untuk pertanyaan itu, itu mungkin alasan untuk downvote
Daniel Gratzer
Lalu izinkan saya ulangi pertanyaannya: apakah ada trik sulap untuk membatalkan kekacauan kode yang melanggar salah satu prinsip paling dasar dari desain perangkat lunak: KISS (tetap sederhana, bodoh)? Triknya bukan sihir, itu adalah seorang programmer yang tidak bisa diganti karena dia tahu semua detail yang tidak begitu jelas (yang akan membunuh perusahaan dalam jangka panjang), atau untuk merestrukturisasi basis kode. Sayangnya, banyak perusahaan pada awalnya tidak peduli dengan desain kode yang tepat atau bahkan tidak memahami konsekuensinya, kemudian harus menulis ulang kode mereka setidaknya sekali, banyak bahkan menulis ulang berkali-kali lipat ...
user127749