Nesne yönelimi özellikle önemlidir, çünkü bu tür senaryolar ortaya çıkar ve karmaşıklığı kapsamanıza izin veren soyutlamaları makul bir şekilde tasarlamanız için araçlar sağlar.
Buradaki asıl soru şu, bu karmaşıklığı nereye ekliyorsunuz?
Bir dakika geriye çekilip burada bahsettiğim 'karmaşıklık' ile konuşmama izin verin. Sorununuz (anladığım kadarıyla; yanlışsam beni düzelt), verilerle tamamlamanız gereken görevler için etkili bir şekilde kullanılabilir bir model olmayan bir kalıcılık modelidir. Bu etkili ve diğer görevler için kullanılabilir, ancak olabilir sizin görevleri.
Peki, araçlarımız için iyi bir model sunmayan verilerimiz olduğunda ne yaparız?
Çevirmek. Yapabileceğiniz tek şey bu . Bu çeviri, yukarıda bahsettiğim 'karmaşıklık'. Şimdi modeli çevireceğimizi kabul ettiğimize göre, birkaç faktöre karar vermeliyiz.
Her iki yönü de çevirmemiz gerekiyor mu? Her iki yön de şu şekilde tercüme edilecek mi:
(Tbl A, Tbl B) -> Obj X (okuma)
Obj X -> (Tbl A, Tbl B) (yazma)
veya ekleme / güncelleme / silme etkinlikleri Obj X olarak veri okuyacak şekilde farklı bir nesne türünü temsil ediyor, ancak veriler Obj Y'den ekleniyor / güncelleniyor mu? Bu iki yoldan hangisine gitmek istediğiniz veya güncelleme / ekleme / silme mümkün değilse çeviriyi nereye koymak istediğinizde önemli faktörlerdir .
Nerede çeviri yapıyorsun?
Bu cevapta yaptığım ilk ifadeye geri dönersek; OO kapsülü karmaşıklığı ve geri verir ne burada atıfta sen, ama sen gerektiğini sadece bu gerçektir gerekir Eğer tüm kod içine sızan ve seep gelmez bunu sağlamak istiyorsanız o karmaşıklığı saklanması. Aynı zamanda, mükemmel bir soyutlamaya sahip olamayacağınızı tanımak önemlidir, bu yüzden çok etkili ve kullanılabilir bir taneye sahip olmaktan daha az endişe edin.
Yine şimdi; senin sorunun: Bu karmaşıklığı nereye koyarsın? Seçimleriniz var.
Bunu yapabilecek içinde saklı prosedürleri kullanarak veritabanı. Bunun ORM'lerle çok iyi oynamamasının dezavantajı vardır, ancak bu her zaman doğru değildir. Saklı yordamlar, performans da dahil olmak üzere bazı faydalar sağlar. Ancak saklı yordamlar çok fazla bakım gerektirebilir, ancak özel senaryoyu analiz etmek ve bakımın diğer seçeneklerden daha fazla veya daha az olup olmayacağını söylemek size kalmıştır. Kişisel olarak saklı prosedürler konusunda çok yetenekliyim ve bu nedenle mevcut yetenek gerçeği yükü azaltır; Ne dayalı kararlar değerini hafife asla yok biliyorum. Bazen en uygun çözüm doğru çözümden daha uygun olabilir, çünkü siz veya ekibiniz bunu en iyi çözümden daha iyi nasıl oluşturacağınızı ve koruyacağınızı bilirsiniz.
Başka bir veritabanı içi seçenek de görünümlerdir. Veritabanı sunucunuza bağlı olarak, bunlar son derece optimal veya alt optimal olabilir veya hiç etkili olmayabilir, dezavantajlardan biri, veritabanınızda hangi indeksleme seçeneklerinin mevcut olduğuna bağlı olarak sorgu süreleri olabilir. Hiçbir zaman veri değişikliği (ekleme / güncelleme / silme) yapmanız gerekmiyorsa, görünümler daha da iyi bir seçim haline gelir.
Veritabanının ötesine geçerek depo desenini kullanmak için eski bir bekleme moduna sahipsiniz. Bu çok etkili olabilen zamanla test edilmiş bir yaklaşımdır. Dezavantajlar kazan plakasını içerir, ancak iyi faktörlü depolar bunun bir miktarını önleyebilir ve bunlar talihsiz miktarlarda kazan plakasıyla sonuçlansa bile, havuzun iyi bir API sunmanın yanı sıra anlaşılması ve bakımı kolay basit bir kod olma eğilimindedir. /soyutlama. Ayrıca depolar, veritabanı içi seçeneklerle kaybettiğiniz birim test edilebilirlikleri için iyi olabilir.
Orada otomatik-haritacı gibi bir ORM kullanmayı akla getirebilecek araçlar vardır, burada veritabanı modeli arasında orm'dan kullanılabilir modellere çeviri yapabilirler, ancak bu araçların bazıları sihir gibi davranmayı sürdürmek / anlamak için zor olabilir; iyi anlaşıldıklarında daha az bakım yükü ile sonuçlanan minimum ek yük kodu oluştururlar.
Daha sonra veritabanından daha da ileriye adım atıyorsunuz , yani çevrilmemiş kalıcılık modeli ile başa çıkacak daha fazla miktarda kod olacak ve bu gerçekten tatsız olacak. Bu senaryolarda, çeviri katmanını şimdi yaptığınız gibi göründüğü kullanıcı arayüzünüze yerleştirmekten bahsediyorsunuz. Bu genellikle çok kötü bir fikirdir ve zamanla çok çürür.
Şimdi çılgın konuşmaya başlayalım .
Bu Object
, var olan her şeyden önce soyutlama değildir. Uzun yıllar boyunca bilgisayar biliminin incelendiği ve hatta daha önce matematik çalışmalarından elde edilen bir soyutlama derinliği olmuştur. Yaratıcı olmaya başlayacaksak, üzerinde çalışılmış olan bilinen soyutlamalar hakkında konuşmaya başlayalım.
Aktör modeli var.Bu ilginç bir yaklaşımdır, çünkü yaptığınız tek şey, tüm çalışmaları etkili bir şekilde bu diğer koda delege eden diğer koda mesaj göndermek olduğunu ve bu da tüm kodunuzdan karmaşıklığı kapsüllemede çok etkili olduğunu söylüyor. Bu, bir oyuncuya "Y'ye gönderilen Obj X'e ihtiyacım var" yazan bir mesaj gönderdiğiniz ve Y konumunda Obj X'i işleyen bir yanıt bekleyen bir kabınız olduğu sürece işe yarayabilir. Hatta talimat veren bir mesaj bile gönderebilirsiniz. "Obj X'e ve Y, Z hesaplamasına ihtiyacım var" ve sonra beklemenize bile gerek yok; çeviri, bu ileti geçişinin diğer tarafında gerçekleşir ve sonucunun okunmasına gerek duymuyorsanız devam edebilirsiniz. Bu, aktör modelinin amaçlarınız için hafifçe kötüye kullanılması olabilir, ancak hepsi bağlıdır;
Diğer bir kapsülleme sınırı süreç sınırlarıdır. Bunlar karmaşıklığı çok etkili bir şekilde ayırmak için kullanılabilir. Çeviri kodunu, SOAP, REST kullanarak veya gerçekten kendi protokolünüzü (önerilmiyor) kullanarak iletişimin basit HTTP olduğu bir web hizmeti olarak oluşturabilirsiniz. STOMP tamamen kötü bir yeni protokol değildir. Veya hangi protokolü seçerseniz kullanarak çok hızlı bir şekilde iletişim kurmak için sistem yerel bir halka açık bellek borusu ile normal bir daemon servisi kullanın. Bunun aslında bazı iyi faydaları var:
- Daha eski ve daha yeni sürüm desteği için çeviri yapan birden çok işleminiz olabilir ve aynı zamanda bir V2 nesnesini tanıtmak için çeviri hizmetini güncellemenize ve daha sonra ayrı bir noktada yeni nesneyle çalışacak şekilde tüketim kodunu güncellemenize olanak tanır. modeli.
- Süreci performans için bir çekirdeğe sabitlemek gibi ilginç şeyler yapabilirsiniz, aynı zamanda bu yaklaşıma bu verilere dokunmak için güvenlik ayrıcalıklarıyla çalışan tek işlem yaparak bir miktar güvenlik güvenliği elde edersiniz.
- Uzun bir süre için soyutlamanızın minimum sızıntısını garanti eden sabit kalacak süreç sınırları hakkında konuşurken çok güçlü bir sınır elde edersiniz, çünkü çeviri alanına kod yazmak, çeviri alanının dışında çağrılmayacağı için işlem kapsamını paylaşmayacak, sözleşme ile sabit bir kullanım senaryoları seti sağlayacaktır.
- Eşzamansız / engellemeyen güncellemeler için daha basit özellik.
Dezavantajları, genel olarak gerekenden daha fazla bakımdır, performansı ve bakımı etkileyen iletişim yükü.
Karmaşıklığı kapsüllemek için bu karmaşıklığın sisteminizde daha garip ve meraklı yerlere yerleştirilmesine izin verebilecek çok çeşitli yollar vardır. Üst düzey fonksiyonların formlarını kullanarak (genellikle strateji deseni veya nesne desenlerinin çeşitli diğer formları kullanılarak sahte zamanlar), çok ilginç şeyler yapabilirsiniz.
Bu doğru, bir monad hakkında konuşmaya başlayalım. Bu çeviri katmanını, gerekli bağımsız çevirileri yapan küçük özel işlevlerden çok bağımsız bir şekilde oluşturabilirsiniz, ancak tüm bu çeviri işlevlerini görünmeyecek şekilde gizleyin, böylece dış koda erişilemezler. Bu, onlara çok fazla dış kod etkilemeden kolayca değişmelerine izin veren güvenlerini azaltma avantajına sahiptir. Daha sonra, güzel OO model türü nesnelerden herhangi birinde çalışan daha üst düzey işlevleri (anonim işlevler, lambda işlevleri, strateji nesneleri, ancak bunları yapılandırmanız gerekir) kabul eden bir sınıf oluşturursunuz. Daha sonra, bu işlevleri kabul eden temel kodun uygun çeviri yöntemlerini kullanarak gerçek yürütmeyi yapmasına izin vermiş olursunuz.
Bu, tüm çevirinin tüm kodunuzdan yalnızca sınırın diğer tarafında bulunmadığı bir sınır oluşturur ; yalnızca bu tarafta , kodunuzun geri kalanının, söz konusu sınırın giriş noktasının dışında herhangi bir şey bilmemesine izin vermek için kullanılır .
Tamam, evet bu gerçekten çılgınca konuşuyor, ama kim bilir; sadece deli olabilirsiniz (ciddi olarak,% 88'in altında bir delilik derecesi olan monadları üstlenmeyin, gerçek yaralanma riski vardır).