Bir uygulamanın bölümleri farklı dillerde yazıldığında veri yapılarının çoğaltılması nasıl önlenir?


12

Örnek olarak, Java'da bir uygulama yazdığınızı varsayalım .

Uygulamanız Python ile yazılmış bir API sunucusuyla iletişim kurar .

Python sunucusu bir SQL veritabanı ile iletişim kurar .

Uygulamanız için JavaScript ile yazılmış bir web siteniz de var .

4 farklı dilde, temel olarak aynı veri yapılarını 4 farklı kez tekrarlamak kolaydır.

Örneğin, bir Usertür şöyle görünebilir (sözde kod):

type User {
  integer id;
  string name;
  timestamp birthday;
}

Projenin her bölümü için bir çeşit temsile ihtiyaç duyulur User. Java ve Python bölümlerinin iki farklı classbildirime ihtiyacı olacaktır . Veritabanı bir Usertablo bildirimi gerektirir. Ve ön uç sitenin de bir temsil etmesi gerekir User.

Bu tür 4 farklı kez tekrarlandığında, Tekrarlama-Kendin Yap ilkesi gerçekten kesilir . Ayrıca, Usertür değiştirilirse, bu değişikliklerin projenin her farklı bölümünde tekrarlanması gerektiği problemi vardır .

Google'ın protobuf kütüphanesinin bu soruna özel bir sözdizimi kullanarak bir veri yapısı yazdığınızı ve daha sonra kütüphane için farklı programlama dillerinde bir yapı bildirimi oluşturduğunu biliyorum. Ancak bu, yine de türleriniz için doğrulama mantığını tekrarlamak zorunda kalmamanızla ilgili değildir.

Bu konuda herhangi bir öneri veya kitap / blog yayını bağlantısı olan var mı?


Bu, birçok insanın tüm gelişimlerini JavaScript'e taşımasının bir nedenidir. İstemci (web, mobil cihazlar için iyonik, masaüstü için elektron), sunucu (düğüm), veritabanı (MongoDB) üzerinde çalışır.
Paul

3
Arka ve ön uç aynı dili kullanıyorsa aynı veri yapıları paylaşılabilir. Farklı kod tabanları kullanıyorsa kendinizi tekrarlamamanız. Farklı dev platformlarından xml şemalarından veya Json dizelerinden sınıflar oluşturmak için araç kullanın.
Jon Raynor

5
Repeating this type 4 different times really breaks the Don't-Repeat-Yourself principle. Hayır değil. Farklı işler yapan 4 farklı sisteminiz var. DRY'yi çok ileri götürüyorsunuz. Deneyimlerime göre, yapmak istediğiniz yeniden kullanılabilirlik türü kötülüğün tohumu, çünkü sıkı bağlantıyı tanıtın. Bu User, 4 farklı dilde 4 kez tekrarlanandan daha kötü . Dağıtılmış ortamlarda bağlantı bir sorundur. KURU değil.
Laiv

Bir cevap için zamanınız yok: İhtiyaçlarınıza bağlı olarak doğrulama kurallarını, örneğin OWL kullanarak formüle etmeye çalışabilirsiniz (bu yüzden bir ontoloji oluşturun). Doğrulama kuralları daha sonra gerekli noktalarda kullanılabilen "veri" haline gelir. Kuralların değiştirilmesi daha sonra tek bir merkezi yerde yapılabilir.
Daniel Jour

Yanıtlar:


12

Yapmazsınız. Ya da gerçekten, yapmamalısın.

Uygulamayı, sunucunuzu ve web sitenizi ayrı bağlamlar olarak düşünüyorsanız, yinelenen yapılar olması mantıklıdır. İyi bir şey olabilmesinin nedenleri:

  • Yapılar benzerdir, ancak aynı değildir. Yapının% 90'ı tüm bağlamlarda aynı olsa bile. Bu size büyük baş ağrısı verecek% 10'dur.
  • Desenler ve uygulamalar farklı olabilir. Farklı diller ve çerçeveler kullanıldığında, bunların hepsinde aynı uygulamaya sahip olmak çok zorlaşır
  • Paylaşılan yapılar, yönetilmesi gereken bir bağımlılık haline gelir. Bir bağımlılıkta paylaşılmış olmak kalkınmayı büyük ölçüde karmaşıklaştırır, çünkü bir bağlamda büyük değişiklik başka bir bağlamda uçsuz bucaksızdır. Bu paylaşılan bağımlılığın gelişimini koordine etmek için çok çaba gerekiyor
  • Farklı bağlamların farklı dağıtımları vardır. Tüm bağlamlarda aynı veri yapılarını ve aynı doğrulama kodunu paylaşmayı başarsanız bile, bir bağlamın yeni sürümü diğerlerinde eski sürümdeyken dağıtılabilir, bu nedenle sürümlerde senkronizasyonun senkronize edilmediği durumlar hala ele alınmak

DRY ilkesi şaşırtıcı olsa da, veri yapılarını bağlamlar veya katmanlar arasında paylaşmanın çözdüğünden daha fazla sorun yarattığını düşünüyorum. Özellikle proje farklı insanların farklı bağlamlarda çalışmasına yetecek kadar büyürse.


5

@Euphoric, kodunuzu kopyalamamak için birkaç iyi neden listelediğini düşünüyorum. Ancak, bunu yapmanız gerekirse kod oluşturma kullanmanızı tavsiye ederim.

Verilerin standart biçimini bulun

Bunu etkili bir şekilde yapabilmek için öncelikle verilerin kanonik formunun ne olduğunu keşfetmelisiniz. SQL şemanız mı yoksa Java programınızdaki sınıflarınız mı?

Diğer formları ondan türet (otomatik olarak)

Bundan sonra, tüm diğer formları kanonik olandan üretmenin bir yolunu tasarlayın. Örneğin, kanonik formunuzun SQL şeması olduğunu varsayarsak, bundan kolayca JavaScript, Java ve Python kodu oluşturabilirsiniz (SQL kolayca ayrıştırılır ve kanonik kaynak için iyi bir adaydır).

Farklılıkları karşılamak

Oluşturulan kodun bölümlerini "dokunmayın" olarak işaretlemek kolay olmalıdır - bu şekilde tüm farklı temsiller arasında gerekli farklılıkları (örneğin: JS ön ucunuz ve Java arka ucunuz için yazdığınız özel kod) barındırırsınız. rejenerasyonlar boyunca korunması gerekir.
Git'ten bir örnek alın; Eğer bir dosya zaten bazı metni içeren mesajı işlemek girmesine izin için bir editör açar, ama olduğunda # -------- >8 --------bilmek işaretleyici senin içerik uçları ve burada onun otomatik olarak oluşturulan metin başlar.

Yine de, eğer yapabilirseniz - böyle bir kopyadan kaçının. Kodunuzun çoğu otomatik olarak oluşturulmuş olsa bile bir PITA'dır.


Bu cevap, "işte bazı en iyi uygulamalar" yerine bir hikaye zamanıdır - tarif ettiğim şey, sizinle aynı sorunu yaşadığımda ve aynı verilerin sistemin farklı bölümlerinde temsil edilmesine ihtiyaç duyduğumda tam olarak yaptığım şeydi (veya daha ziyade iki farklı sistemde).

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.