Büyük bir kod tabanının uzak kısımları arasına veri akışı eklemeyi kolaylaştırabilir miyiz?


10

Büyük sistemlerde değişiklik yaparken, genellikle bir işlevsellik parçasının başka bir parçadan bazı veriler alması gerektiği problemiyle karşı karşıyayım, ancak muhtemelen olay dinleyicileri, ertelenmiş çağrılar, Bu şekilde basit bir değişiklik hızlı bir şekilde balonlanabilir.

Yossi Kreinin'in http://www.yosefk.com/blog/i-want-a-struct-linker.html adresindeki blog yayınından bir alıntı :

Çok geçtiğiniz bir tür veri yapınız var. Yakında, yapı ile ilgili en değerli şey, tuttuğu veriler değil, kıllı bir kontrol akışı boyunca tamamen kullanılabilir olması.

Global değişkenler, kodun uzaktaki koda "bağırmasını" sağlamanın klasik bir yoludur, ancak sorunlu oldukları bilinmektedir. Dinamik olarak kapsamlandırılmış değişkenler daha kısıtlı bir yöntemdir, ancak bunlar da sorunludur.

Bu sorunu çözmeye yönelik herhangi bir programlama dili araştırması var mı? Statik kontrol, kolay birim testi ve diğer güzellikler sunarken, büyük bir kod tabanına beklenmedik veri akışları eklemeyi kolaylaştırabilir miyiz?


Sorunuzu ifade etme şekliniz Sanırım tek bir işlemde veri akışınız var, süreçler arası iletişim yok. Peki standart olay gönderen / dinleyici mekanizmalarıyla çözülemeyen ne tür bir sorun görüyorsunuz?
Doc Brown

Çağdaş bir örnek: sisteminizin derinliklerinde kullanıcıya kısa mesaj gönderen bir kod olduğunu hayal edin. Ayrıca, mesaj metninin kullanıcının saat dilimindeki geçerli saate bağlı olması gerektiği konusunda yeni bir gereksinim edinirsiniz. Calltack şöyle görünür: Kullanıcının saat dilimini bilen bazı kodlar, (... 15 kez tekrarlanır) ileti metnini üreten bir yöntemi çağıran bir yöntemi çağıran bir yöntemi çağırır. Bu, standartlarımın basit bir örneğidir, çünkü yalnızca aşağıya doğru iletişim içerir, ancak yine de önemsiz değişikliğinizi yapmak için 15 yöntemin imzalarını değiştirmeniz gerekir.
Vladimir Slepnev

Sanırım yardımcı olabilecek veri akışını açıkça modellemek ve bileşenleri veri akışından ayırmak. Alman yazılım mühendisi bu konu hakkında çok şey yazıyor, çoğu Almanca. İşte onun İngilizce bir giriş makalesi: geekswithblogs.net/theArchitectsNapkin/archive/2011/03/19/…
Doc Brown

Bence tek bir dahili API yardımcı olabilir. Uygulamanın her yerine erişilebilir ve tüm veri alma mantığını kapsülleyecektir.
superM

Yanıtlar:


1

CDI (Bağımlı Bağımlılık Enjeksiyonu) AKA IoC'den (Kontrolün Tersine Çevirilmesi) bahsediyorsunuz. Java JSF ve Spring Framework bazı örneklerdir. ASP.NET MVC, Unity gibi eklentilere sahiptir. Javascript, birçok modern JS çerçevesinde görülen enjeksiyon davranışına sahip RequireJS gibi kütüphaneleri kullanan yapıları düzenlemeye başlıyor. Bu, yerel ve uzak uygulamaları bağlamak içindir.

Ağlar arasında gevşek bağlantı için şirketler, Web Hizmetlerini SOAP, REST, AJAX veya RPC ile düzenli uzaktan arama yöntemiyle kullanmayı sever. Java'da dağıtılmış hizmetler oluşturmak için JAX-WS veya .NET WCF kullanabilirsiniz. Daha sonra bunları bir servis veriyolunda veya herhangi bir dilden veya platformdan "veri akışı" olarak istemci olarak sıralayabilirsiniz. Ruby, Python, Scala, Java, C #, ... bir şey.

Gevşek bağlantı sorunları bölmenize ve fethetmenize olanak tanır ve hizmetler genellikle veri çekmek için bir veritabanına giriş noktasıdır. Merdivene çıkarken Message Queue adlı canavara sahibiz. Bu yol işletme ve altyapı tipi çerçevelere yol açar.

Projeniz hiçbir ağda ısrar etmiyorsa, tek bir uygulamada yüksek veri akışı için tasarlanmış Scala, Akka, NodeJS vb. Diller vardır. Ayrıca karmaşık projeler için daha önce bahsedilen teknolojilerin bir kısmı veya tamamı ile birlikte çalışırlar. Örneğin, Scala bir veri kaynağından bir çeşit "global veri" çekmek için JAX-RS REST servisleriyle kullanılabilir ve IoC dahili kablolaması için Spring'e sahip olabilir. JBoss, .NET ve MuleESB gibi GUI araçlarında birçok iş yürütme veya iş akışı çerçevesi de vardır. Geliştirme sırasında, Eclipse ve Netbeans hizmetleri görsel bir akış şeması ekranında sürükleyip bırakmanıza izin verir.

Son olarak, Java'nın hala Singleton çekirdekleri var. Çalışma zamanında yöntemlerinizi ayarlamak için proxy veya yansıma çerçeveleri kullanın. Ama dürüst olmak gerekirse, bu 1999.

Bir kullanıcıya saat dilimine göre bir mesaj göndermek için bu kadar çok çağrı yapıyorsanız, bence, muhtemelen kullanıcının gördüğü aynı etkiyi elde etmenin 2 adımlı bir yolu vardır. Ama evet, CDI çerçeveleri varolan diller tarafından, bahsettiğiniz tüm esnek güçleri veren bir ceket gibi giyilir. Programımın bilinçaltı olarak adlandırmayı, kirli işlere sorunsuzca bakmayı seviyorum.


İleti Kuyrukları gereğinden fazla olabilir, ancak iletiler tüm etkinliklerde tetiklenmenin mükemmel yoludur. Java, Mesaj Odaklı Fasulye (MDB) kullanır ve bu da programınızın birbiriyle 'konuşma' göndermesine veya almasına izin vermelidir. Bu şekilde eşzamansız bonus için yapabilirsiniz.
Senor Developer

İşaretçiler için teşekkürler! Bağımlılık enjeksiyonunu ve benzer kalıpları desteklemek için baştan aşağı tasarlanmışsa, bir dilin nasıl görünebileceğini merak ediyor.
Vladimir Slepnev

0

Bunu büyük ölçekte yapmanın en basit yolu aslında bir çeşit veri kapsülleme API'sı kullanmaktır. Bu bir NoSQL deposu olabilir veya kapsüllenmiş bir RDBMS olabilir (veya aslında aynı uygulamada farklı zamanlarda ve yerlerde olabilir - uzun vadeli bir RDBMS işlememenin bir nedeni yoktur. depolama ve kısa süreli durum kontrolünü yöneten bir NoSQL db). Hatta bir dizi singleton nesnesi bile olabilir.

Veri yapılarınız bir şekilde tarafsız bir şekilde, yönetilen bir şekilde kullanılabilir hale getirilebilir. LedgerSMB ile aldığımız yaklaşım budur (ancak esasen saklanan tektonlar için birkaç yarı küresel değişkenle, ancak yine bunlar yönetilir, doğrudan nesneyi saklamayı seçtik çünkü değişkenlerin yönetimini biraz daha kolay hale getirdi ancak sonra bunların hepsi 4).

Tabii ki herhangi bir yaklaşımın ödünleşimi vardır ve bu ödünleşimleri kaldıramazsınız. Anahtar, deneklerin ne olduğuna bakmak (yönetim - performans vs kod temizliği vs potansiyel kodlama tuzakları) ve uygulamanız için en iyi olana dayalı bir karar vermektir.


Cevap için teşekkürler! Bana öyle geliyor ki, programlama dili araştırmaları bu soruna yardımcı olabilir. Örneğin, kod genel bir veritabanından veya saklı tekiltonlardan bazı verileri okursa, hangi verilerin gerekli olduğu konusunda statik / bildirimsel bir garanti olabilir.
Vladimir Slepnev

-1

Kelimeleri kullanırsanız (veya alıntı yaparsanız)

hairy flow of control

sonra kod gerçekten bir karışıklık olduğunu varsayalım. Hemen bırakmalısın. Endişeleri modülerleştirme / ayırma kullanırsanız, "tüylü kontrol akışı" diye bir şey yoktur. Kodunuz basitlikten yoksundur, bu da global değişkenlere başvurduğunuz gerçeği ile kısır değildir :-).


Neden inişli çıkışlı? Alıntı tam olarak benim görüşüm destekleyen giriş eksikti: "(muhtemelen bir" Antipattern "veya bir" Kod Kokusu "olarak sınıflandırılır ve bu nedenle uygun çevrelerde bir adı vardır, ama bilmiyorum, bu yüzden yapacağım isimsiz bırakın) "
user127749

2
Bu gerçekten sorunun cevabı değil, muhtemelen aşağı oyun nedeni
Daniel Gratzer

O zaman şu soruyu yeniden ifade edeyim: Yazılım tasarımının en temel ilkelerinden birini ihlal eden kod karmaşasını ortadan kaldırmak için herhangi bir sihir var mı: KISS (basit, aptalca tutun)? Hile sihir değil, ya çok açık olmayan tüm ayrıntıları bildiği için (şirket uzun vadede öldürecek) ya da kod tabanını yeniden yapılandırdığı için değiştirilemeyen bir programcı. Ne yazık ki, birçok şirket başlangıçta uygun kod tasarımı umurumda değil, hatta sonuçları en azından bir kez yeniden yazmak zorunda, hatta sonuçları birçok kez anlamak zorunda değilsiniz, birçok bile üzerinde defalarca yeniden yazmak ...
user127749
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.