Java ve diğer dillere erişimde en iyi uygulama ve anti-desen
Her geliştiricinin (Java) er ya da geç karşılaşması gereken bir konu kayıttır. Küçük örnek programlarla, programlama dilinin öğrenilmesi veya kodun hızlı hata ayıklığını System.out.println Yeterli olabilir, bu yazılımın üretim işleyişi için açık bir hareket değildir. Bu noktada, bir uygulamanın çıktısı, uygulamayı kontrol etmek, izlemek ve analiz etmek için kullanılabilmesi için belirli kalite özelliklerini karşılamalıdır. Bu nedenle, resim ve arıların bir zenginliği vardır ve geliştiriciler için hangi stratejinin doğru olduğuna karar vermek genellikle kolay değildir.

Hendrik Advers (@hendrikebbers), JCP uzman grubunun bir üyesi olan Java'nın şampiyonu ve farklı Javaone rock yıldızı hoparlörleri aldı. Kendi açık unsurları şirketi ile Hendrik şu anda Hedera Hashgraph'ı tasarlamaya ve hizmetlerini halka açık hale getirmeye yardımcı oluyor. Hendrik aynı zamanda Juug Dortmund ve Cyberland tarafından ve tüm dünyada Java teması hakkında dersler ve seminerler düzenliyor. “Mastering JavaFx 8 Controls” adlı kitabı 2014 yılında Oracle Press tarafından yayınlandı. Hendrik, TSC Emptopenjdk ve Eclipse WG benimseyenlerin bir üyesidir.
Bu nedenle, kayıt konusunda en iyi uygulamalardan bir dizi katkı yazmaya karar verdim. Bu makalede, kaydın genel temelleri ile başlıyorum. Yakın gelecekte, sadece Java ekosistemindeki çeşitli kayıt resimlerine genel bir bakış vermekle kalmayacak, aynı zamanda harika yazılım mimarilerini kaydetme konusunu nasıl incelemeniz gerektiğine dair bir vizyon sunacak. Kayıt temaları paketi, “merkezi kayıt” vizyonu ve kaydın daha iyi korunmasına ve analizine izin veren modern araçlar ile tamamlanmıştır.
Kaptanı gemiye koyun, 2022 civarında bir gün yıldız saati
Bazıları başlıkla tahmin edebileceği gibi, kaydın gerçekten temel belgeleri hakkında kısaca konuşmak istiyorum. Çünkü terim aslında denizcilik günlüğü ile ilgilidir. ONboard Günlüğü genellikle bir denizci sırasında meydana gelen olayları yazmaya hizmet etmelidir. Ve tam olarak bir uygulamaya erişim ile yaptığımız şey budur: Uygulama süresince haber yazıyoruz. Bunlar teknik olarak bir kayıt dosyasında yazılmışsa veya yalnızca konsolda yayılmışsa dışarıda bırakabiliriz. Bununla birlikte, tüm bu haberlerin, olayın belirlenmesi için meta veriler içermesi önemlidir.
Tıpkı denizde olduğu gibi, bir uygulamaya erişim kullanmanız için çeşitli mükemmel nedenler vardır. İyi bir kayıt kaydındaki hikayeye dayanarak, bazı etkinliklerin neden etkinleştirildiğini anlayabilirsiniz. Bu, bir uygulama süresi boyunca hataların nasıl oluştuğunu fark etmeyi özellikle yararlı hale getirir. Ancak kayıt sadece bu sorunlarda yararlı olabilir. Genel olarak, yazılımın kullanımı ve süreci hakkında kayıttan bilgi bulmanın mümkün olduğu söylenebilir. Bu, gelecekteki eklemeler için yazılımın geçmişinden öğrenmenizi sağlar. Örneğin, kayıtta tüm kullanıcıların % 97'sinin uzun bir kullanımdan sonra yalnızca yazılımımızın “Like” düğmesine bastığını görebiliyorsanız, yazılıma eklenmesi gerekip gerekmediğini değerlendirebilirsiniz.
Bir başvurunun kaydedilmesinden bahsedilen avantajları türetmek için, uygulamaya önemli ölçüde entegre edilmelidir. Bunu gerçekleştirmek için, kayıt sırasında en iyi genel uygulamalara ve registry karşıtı modellere bir göz atalım.
Ne zaman ve nasıl kaydetmeliyim?
Uygulamamızda kaydı nasıl kullanmamız gerektiğini daha iyi anlamak için, bir logger aracılığıyla ideal olarak neyin yayınlanması gerektiğini tam olarak düşünmek mantıklıdır. Burada her zaman kaydedilmesi gereken üç farklı kategori görüyorum:
- Uygulama içindeki önemli olaylar (örneğin, döngüsel bir çalışmanın başlatılması veya yürütülmesi),
- Dışarıdan gelen bilgiler (örneğin, kalıntı bir arayüz aracılığıyla verilerin içe aktarılması),
- Uygulamanın istenen veya yanlış davranışı (örneğin bir dosyanın kusurlu okunması).
08:34:23 User mutates id field with new value 'J'
08:34:23 User mutates id field with new value 'JA'
08:34:23 User mutates id field with new value 'JAV'
08:34:23 User mutates id field with new value 'JAVA'
Bu öğelerle bir kayıt dosyasından önemli bilgileri çıkarmanın ne kadar zor olacağını hayal edebilirsiniz.
Durum, çok fazla bilgi içeren kayıt mesajları ile benzerdir. Bir kullanıcının doğum günü olduğunu bilsek bile, bu bilgileri kayıt mesajlarımızda memnuniyetle karşılamamalıyız:
08:34:23 User 'Max' with birthday '01/01/1970'
mutates id field with new value 'JAVA'
Mesajdaki kullanıcı adı, bu mesajı diğer kayıtlara göre getirmek için takip eden bir analiz için kesinlikle ilginç olsa da, doğum tarihi oldukça can sıkıcıdır ve okumayı sadece insan gözü için daha karmaşık hale getirir.
Kayıt mesajları oluştururken her zaman aklınızda olması gereken önemli bir üçüncü nokta veri hassasiyetidir. Önceki ilişkilerde kayıtta bir kimliğin değiştirilmesini her zaman görmüş olsak da, aşağıdaki mesaj asla bir kayıt dosyasında görünmemelidir:
08:34:23 User 'Max' mutates password with new value '12#Agj!j7
Bu durumda, kayıt uygulamada gerçek bir güvenlik boşluğu olacaktır. Kullanıcının parolası gibi bu hassas veriler kayıt mesajlarında asla görünmez olmamalıdır.
Önceki sonuçlara dayanarak, aşağıdaki kayıt mesajları hassas ve iyi görünmektedir:
08:34:23 User 'Max' mutates id field with new value 'JAVA'
08:34:23 User 'Max' mutates password
Bu önerilere ek olarak, her zaman bir uygulamanın kaynak kodunun, kaynak kodunun artık okumak ve anlamak için makul olmadığı kayıt çağrıları ile o kadar dolu olmadığına bakmalısınız. Bir Java programının aşağıdaki alıntısı, kayıt çağrılarıyla abartıyorsa ne olacağını gösterir:
LOG.log("We start the transaction");
manager.beginTransaction();
LOG.log("DB query will be executed");
LOG.log("DB query: select * from users");
long start = now();
users = manager.query("select * from users");
LOG.log("DB query executed");
LOG.log("DB query executed in " + (now() - start) + " ms");
LOG.log("Found " + users.size() + " entities");
manager.endTransaction();
LOG.log("Transaction done");
Kod ve kesin işlevi burada neredeyse hiç görülebilir. Kayıt çağrısı yoksa, bunu tek bir görünümde yapabiliriz:
manager.beginTransaction();
users = manager.query("select * from users");
manager.endTransaction();
Şimdi, elbette, tüm kaydı dışarıda bırakmamalısınız ve belki de bu tam olarak kayıtta çok fazla bilgi görmek istediğiniz bir yer. Bu durumda, kayıt çağrılarını yapı ve uygulamaya entegre etmek gerekir. İlk örnekte gördüğümüz tüm bilgiler de doğrudan içinde olabilir. beginTransaction-,, query– VE endTransaction-Yöntemler kaydedilir. Böylece şirket mantığı kayıt çağrılarından temizlenir ve yine de tüm bilgileri alırız.
Çeşitli nedenlerden dolayı, kaydı doğrudan API'da barındırmak mümkün değilse, karmaşıklığı lambdas veya yeniden kullanılabilir yöntemlerin kaydına göre “gizlemek” de mümkündür. Aşağıdaki örnek, bir işlem içinde bir sorgu gerçekleştiren ve kayıt mesajları olarak talep edilen tüm bilgileri iletmeye devam eden genel bir işlevi göstermektedir.
final Function<String, T> queryInTransaction = query -> {
LOG.log("We start the transaction");
manager.beginTransaction();
LOG.log("DB query: " + query);
long start = now();
T result = manager.query(query);
LOG.log("DB query found " + result.size() + " entities in "
+ (now() - start) + " ms");
manager.endTransaction();
LOG.log("Transaction done");
return result;
}
Sonuç olarak, şirket mantığında maksimum kayıt ile görüşlerimizi okunaklı bir biçimde çağırabiliriz:
LOG.log("Loading all users from database");
users = queryInTransaction("select * from users");
Zaten kayıt resimleriyle çalışan herkes, önceki örneklerde önemli ve merkezi bir unsur olarak kesinlikle eksik. Sonunda buna daha yakından bakmak istiyoruz. Farklı kaydedici her zaman aynı seviyeleri tanımlamasa bile, herkes aynı işlevselliğe sahiptir: tek boyutlu bir ölçekte, seviye mesajın tüm mesajlar bağlamında ne kadar önemli olduğunu doğrular.

La Scala kayıt seviyelerini gösterir.
Fotoğrafta gösterildiği gibi, kaydımızda üç farklı seviye kullanabileceğimizi varsayalım (not: Belirli Kayıt Çerçevesine bağlı olarak başkaları da vardır). Seviyede ERROR Seviyemiz varken uygulamanın tüm yanlış davranışlarını kaydetmek istiyoruz INFO İşlem ve uygulamanın durumu hakkında genel bilgiler için kullanın. İle DEBUG-Yalnızca istisnai durumlarda önemli olan ayrıntılı bilgileri kaydettik. Kayıtta farklı seviyeleri kullanan Java kaynak kodu aşağıdaki gibi görünebilir:
try {
LOG.info("Loading all users from database");
users = query("select * from users");
LOG.debug("Found " + users.size() + " users in db");
} catch (Exception e) {
LOG.error("Error while loading all users");
}
Uygulamayı yürütürken, logger seviyesi artık yapılandırılabilir ve dolayısıyla hangi mesajların gerçekten sicile inmesi gerektiğini filtreleyebilir. Kural olarak, mesaj DEBUG-Evalat ve portallar yalnızca hataların veya benzeri senaryoların analizi için kaydında. Avantajı, daha fazla bilgi edinmek için uygulamanın uygulanmasının uygulanmasının değiştirilmesinin gerekli olmamasıdır. Yalnızca yapılandırma ayarlanmalı ve bu, kullanılan kayıt çerçevesine bağlı olarak yürütme aşamasında dinamik olarak da gerçekleşebilir. Ek olarak, bu filtreleme bir test veya üretken sistemde farklı bilgileri kaydetmek için de kullanılabilir.
Son kayıt konsepti
Bu blog yazısında gösterilen genel kurallara dayanarak, bir başvurunun kaydedilmesi veya sistemin tam bir manzarası için tanımlar geliştirmek zaten mümkündür. Kayıt kurallarının oluşturulması sırasında sorulması gereken önemli sorular diğer şeylerin yanı sıra:
- Kayıt dosyasını kim okuyacak?
- Kayıtlardan ne denemek / çıkarmak istiyorsunuz?
- Kayıtlardan ne çıkarmak istiyorsunuz?
- Farklı ortamlarda (test / üretim) kayıtta farklılıklar olmalı mı?
(RME)