Java Geliştiricileri Grails'e Neden Bir Şans Vermeli?
Yayınlanan: 2022-03-11Java, yıllarca süren gelişimle olgunlaşan ve onu en güvenilir platformlardan biri haline getiren bir ekosisteme sahiptir. Yine de, özellikle web uygulamaları gibi şeyler için işi hızlı bir şekilde halletmek için gerekli araçlardan yoksundur. Bu tür sorunlarla ilgili hayal kırıklıklarından kaçınmak için geliştiriciler, genellikle bunun yerine uygulama dillerini ve Ruby with Ruby on Rails, Python ile Django vb. modern web çerçevelerini tercih ederler. Java'dan farklı olarak, bunlar bir web uygulaması oluşturmak için çok daha akıcı bir yol sağlar.
Neyse ki, web uygulamaları oluşturmak isteyen Java geliştiricileri için daha iyi bir yol var ve bu, Grails'i içeriyor. Bu yazıda, Grails with Groovy'nin JVM alanında nasıl uygulanabilir bir alternatif olduğunu göreceğiz. Grails'in Java geliştiricileri olarak bize çekici geldiği ve başkalarını da denemeye teşvik edebileceği bazı örneklere bakacağız.
Hikaye
Çalıştığım bir girişimde, tam olarak bu sorunu yaşadık. Çalışması acı veren bir Spring uygulamamız vardı. Büyüdükçe büyüdükçe, yeniden düzenleme ve işlevsellik eklemenin bizi olması gerekenden çok daha uzun sürdüğünü gördük. Bunu diğer bazı motivasyonlarla birleştirmek, temel uygulamamızı yeniden yazmaya karar vermemize neden oldu. Ayrıca mevcut teknoloji yığınını değiştirmeye veya değiştirmeye de açıktık. Grails, JVM'de çalıştığı ve zaten bildiğimiz teknolojilerin üzerine kurulduğu için uygun bir seçim gibi görünüyordu. Groovy programlama dilini kullanır, ancak aynı zamanda Java ile karıştırmanıza izin verir. Böylece daldık.
Tam gaz ileri
Grails'in gerçekten üstün olduğu bir şey, yeni bir projeye başlamayı kolaylaştırmasıdır. Daha sonra ekleyeceğiniz sınıflar için gerekli olan tüm klasörler ile proje yapısını oluşturan bir komutu çalıştırmak kadar basittir. Model sınıfları, denetleyiciler, hizmetler ve web sayfaları eklemek benzer şekilde minimum düzeyde çaba gerektirir. Dikkat etmeniz gereken tek şey, eşyaları doğru bir şekilde adlandırmak ve yerleştirmektir. Java'nın aksine, olması gerektiği için orada olması gereken neredeyse hiçbir ortak kod yoktur. Bu kısmen, Grails'in temel direklerinden ikisi olan Spring ve Hibernate ile ve ayrıca geleneksel kodlama kavramı kullanılarak mümkün kılınmıştır. Projeyi çalıştırmak için Grails, bir geliştirme sunucusu olarak Apache Tomcat ile birlikte gelir. Tek yapmamız gereken projeyi IDE'mizde çalıştırmak ve sunucu, kodumuz konuşlandırılarak çalıştırılacak. Ayrıca, Hibernate ile Grails'in Object Relational Mapping (GORM) özelliği de bizim için veritabanı oluşturma işini halledecektir. Mevcut bir veritabanını kullanmak için, JDBC bağlantı özelliklerini yapılandırmamız veya bir bellek içi örneği kullanmak için varsayılan olarak bırakmamız gerekir. Grails'li sunucu çalıştığında (bir Spring MVC uygulamasından biraz daha fazlasını alır), kodu değiştirebiliriz ve sıcak dağıtım işlevi, hata ayıklama oturumumuzu en son sürümle donatmaya devam edecektir. Bu şekilde yeniden yüklenemeyen tek sınıf, varlık sınıflarıdır.
Veritabanını doldurmak SQL betikleri kullanılarak yapılabilir, ancak bu sıkıcı olabilir. Tüm Grails projeleri, uygulamamız çalıştırıldığında çalıştırılacak olan bir Bootstrap sınıfı içerir. Bu sınıfta, verileri saklayabilir veya değiştirebilir ve böylece uygulama durumumuzu başlatabiliriz. Bu bizim için çok faydalı oldu, bu yüzden hemen geliştirme sürümünde bazı test senaryolarımız var.
Verileri Manipüle Etme
Grails ile hemen dikkatimizi çeken şeylerden biri, verilerle çalışmanın kolaylığıydı. Veritabanından okuma, tekrar tekrar yapılması gereken bir iştir. Ve birçok kez basittir. Belirli kriterleri karşılayan bir veya daha fazla varlığı getirmek ve ardından bunları toplamak gibi. Bunun için neden dinamik bir bulucu kullanmıyorsunuz? Yöntemlerin çalışma zamanında dinamik olarak oluşturulduğu verileri sorgulamanın bir yoludur. Tek yapmanız gereken bir adlandırma kuralına uymak.
def users = User.findAllByLastNameLikeOrAgeGreaterThan('Doe%', 30)
Yukarıdaki satır, soyadı “Doe” ile başlayan veya yaşı 30'dan büyük olan tüm Kullanıcı nesnelerini getirecektir. Evet, çok karmaşık bir durum değil ama ana fikri anlıyorsunuz.
Bu listeyi ayrıca "failedLogins" özelliği 10'dan büyük olanlar için de filtrelemek istersek ne olur? Peki ya onları oluşturulma tarihlerine göre sıralamak istersek? Peki ya ilk adlarını birleştirmek istersek veya döndürülen kullanıcıların maksimum yaşını bulmak istersek?
users = users.findAll() { it.failedLogins > 10 } users = users.sort { it.dateCreated } def firstNamesString = users.firstName.join(', ') def maximumAge = users.age.max()
Yukarıdaki örnekler basit görünebilir, ancak Grails'in verileri sorgulamak, filtrelemek ve işlemek için ne kadar güçlü olabileceğini gösterirler. Java 8'de, bu durumların bazıları için benzer sonuçlar elde edebilirsiniz, ancak yine de Grails'den daha fazla kod gerektirecektir.
Bazen Farklı Yaratmak İstiyorum
Dinamik bir kurucu veya adlandırılmış argüman kurucusu, çoğumuzun Java'da sahip olmak istediği bir özelliktir. Belirli bir sınıfın hangi kuruculara izin verdiğini tanımlamak güzeldir, ancak çoğu durumda sadece bazı özellikleri ayarlamak ve lanet olası örneği almak istersiniz. Groovy, her varlık için temel olarak bir haritanın zarafetini girdi olarak alan ve özellikleri harita girdileriyle ayarlayan özel bir kurucu ekler.
def Person = new Person(name: 'Batman', age: 57)
Bu yaklaşım, çok daha anlamlı bir koda yol açar ve tüm kurucu ortak kod koduna olan ihtiyacı ortadan kaldırır.
Ve BTW, işte Groovy'nin haritalarının görkemi ve zarafetine dair bazı örnekler:
def emptyMap = [:] def map = [bread:3, milk:5, butter:2] map['bread'] = 4 map.milk = 6
Bu, kodun nasıl kısa ve basit, ancak güçlü olabileceğinin başka bir örneğidir. Satır içi başlatmanın nasıl kullanılabileceğini ve harita değerlerinin nesne özelliklerine benzer bir şekilde nasıl değiştirilebileceğini gösterir. Gerçekten istemediğiniz sürece, temel manipülasyon için geleneksel Java yöntemlerini çağırmanıza gerek yok.
Daha Fazla Güce İhtiyacımız Var!
Tabii ki, her şeyi yapabilecek bir çerçeve yok, ancak boşlukları doldururken, kendi çözümümüzü uygulamaya çalışmadan önce başka nelerin mevcut olabileceğini görmeliyiz. Grails tabanlı işlevsellik cephanemizi genişletmek için Grails Eklentilerini kullanabiliriz. Eklenti yüklemek, her Grails projesinde bulunan BuildConfig
sınıfına başka bir satır ekleyerek yapılır (kod kuralı tekrar devreye girer!).

compile ':spring-security-core:2.0-RC4'
Yukarıdaki satır, uygulamamıza Spring güvenlik çekirdeğini ekler ve bu işlevi dahil etmek için neredeyse hiçbir yapılandırma gerekmez.
Bununla birlikte, size uğraşmamız gereken bir davadan bahsetmeme izin verin. Birkaç veri varlığına yayılan bir arama uygulamamız gerekiyordu. Grails, kullanımı çok kolay olan bir Elasticsearch eklentisine sahiptir. Daha önce de belirtildiği gibi, yalnızca yapılandırma dosyasındaki eklentiye başvurmamız gerekiyor ve gitmeye hazırız. Belirli bir sınıfın varlıklarını aramak istiyorsak, o sınıfa statik bir "aranabilir" özellik eklememiz yeterlidir. Ve istersek, aranmasına izin verilecek mülkleri bile sınırlayabiliriz.
class User { static searchable = { only = name } String name Double salary }
Bu çok küçük bir koddur, ancak kaputun altında, Grails ve Elasticsearch eklentisi tüm kullanıcıları otomatik olarak ada göre indeksleyecek ve ada göre arama yapmamızı sağlayacaktır. Gerçek arama çağrısı da çok kısadır:
User.search("${params.query}")
Eğer istemiyorsak, Lucene indeksine asla dokunmak zorunda kalmayacağız. Her şey bizim için otomatik olarak sihirli bir şekilde yapılacak. Eklentinin arama sonuçlarını görüntülemek için bir API'si bile var - aranan metinde bulunan eşleşmeyi vurgulayabilir. Bu, bir eklentinin, onu kendimiz uygulamamıza gerek kalmadan bizi çok daha verimli hale getirebilecek büyük bir işlevsellik paketini nasıl sağlayabileceğine bir örnektir.
Hala Daha Fazla Güce İhtiyacımız Var
Eklentiler harikadır, ancak bazen tam bir eklentiye ihtiyacımız olmaz, sadece ekstra bir şey isteriz. Mevcut bir Java sınıfında ek bir yönteme sahip olmak istediğiniz ancak bunları genişletmek/geçersiz kılmak istemediğiniz (veya yapamadığınız) en son ne zaman hatırlıyor musunuz? Groovy'de, mevcut sınıflara, hatta yalnızca belirli örneklerine yöntemler ve özellikler ekleyebilirsiniz. Örneğin, java.util.Date
sınıfına, tarihleri tutarlı bir şekilde biçimlendirmek istediğinizde ve sadece statik util sınıfları yazmak veya çeşitli filtreler tanımlamak istemiyorsanız harika olan bir formatting
yöntemi ekleyebilirsiniz.
Date.metaClass.formatDate = { delegate.format("dd.MM.yyyy") }
Bir kullanıcı listesini hesaplanmış bir değere göre sıralamak istiyorsanız ve buna yalnızca bir durumda ihtiyacınız varsa (yani, User sınıfına yeni bir yöntem eklemek çevreyi kirletecektir)? Bu örneklerin her birine bir özellik ekleyebilir ve ardından koleksiyonu bu özelliğe göre sıralayabilir veya filtreleyebilirsiniz:
user.metaClass.computedProp = 312 * 32 * 3
Harika yazarlar, bazı temel Java sınıflarına zaten birçok geliştirme eklediler, bu yüzden bizim yapmamıza gerek yok. Aşağıda bazı örnekler verilmiştir.
Başka bir koleksiyonda bulunan bir koleksiyondaki tüm öğeleri kaldırmak için "eksi" kullanma.
assert [1, 2, 3, 4, 4, 5] - [2, 4] == [1, 3, 5]
java.util.Date
nesnelerini manipüle etmek için pek çok kez kullanışlı olan ek yöntemler, örneğin tarihlerden gün ekleme/çıkarma veya tarihin belirli bir alanını Calendar
dönüştürmeden veya ek kitaplıklar kullanmadan alma/ayarlama gibi.
def yesterdayAllMyTroublesSeemedSoFarAway = new Date() - 1 def myAwesomeAnniversaryYear = myAwesomeDate[Calendar.YEAR] + 1 myAwesomeDate.set(year: myAwesomeAnniversaryYear, second: 0)
Tarih işleme ile gerçekten açıklayıcı olmak istediğinizde, Groovy eklenen TimeCategory
sınıfını kullanabilirsiniz:
use (TimeCategory) { println 1.minute.from.now println 10.hours.ago def someDate = new Date() println someDate - 3.months }
Çekiç ve Çivi
Sonra IDE'ler var. Eclipse tabanlı GGTS ve IntelliJ IDEA, Grails ile çalışmak için ayarlanmıştır. Proje yapısını anlarlar (ve klasörler ve kaynaklar arasında gezinmenize yardımcı olurlar) ve en sık kullanacağınız komutlar için kısayollara sahiptirler (örneğin, denetleyici ekleyin, sayfa ekleyin, proje çalıştırın, vb.). Grails ile komutları yürüteceksiniz (bir projeyi çalıştırmak veya yeni bir eklenti işlevselliği kurmak için) ve IDE'ler tarafından da kapsanan farklı konfigürasyonlara ihtiyacınız olacak. Kod tamamlama, genellikle denetleyicilere ve eylemlere başvuracağınız Grails web şablonu sayfalarında iyi çalışır. Netbeans, TextMate, Emacs ve diğerleri gibi Grails ile kullanılabilecek başka IDE'ler de vardır.
Peki ya Karanlık Taraf?
Hayattaki her şeyde olduğu gibi, Grails'te de uyarılar var. Kaputun altında pek çok sihir yapılıyor ve bu genellikle iyi bir şey olabilir, ancak bazen sonuç beklediğiniz gibi olmaz. Hatalar sadece yazmayı kullanmama (evet, Groovy'de türler isteğe bağlıdır) ve yeterince dikkatli olmama nedeniyle olacaktır. Ve belki de çok geç olana kadar bir hata fark etmeyeceksiniz. Ayrıca, iş arkadaşlarınızı etkilemek için tek satırlık şeyler yazmak çok cezbedicidir. Ve kendinizi. Ancak bu güçlü kod satırları, iş arkadaşlarınız için yeterince açıklayıcı olmayabilir. Hatta birkaç ay içinde kendinize bile. Bu yüzden Grails'in daha geleneksel çerçevelerden bazılarından daha fazla programlama disiplini gerektirdiğini düşünüyorum.
Vakit nakittir
Kodlama, mevcut çerçeveniz gerektirdiği için daha fazla zaman almamalıdır. Özellikle günümüzde giderek artan sayıda yeni girişimle birlikte, gerçekten önemli olan görevlere odaklanmak ve mümkün olduğunca verimli olmak önemlidir. Vakit gerçekten nakittir ve piyasaya çıkma zamanı çok önemlidir. Zaman dolmadan ve rekabetiniz sizi yenmeden önce hızlı hareket edebilmeniz ve çözümü uygulayabilmeniz gerekir.
Ruby on Rails veya Python/Django ile çalışan arkadaşlarım uzun zamandır bana bu teknolojilerin ne kadar havalı olduğunu söylüyorlar. Ve Java'da bir şeyi veritabanında saklayan ve bir web sayfasında görüntüleyen kod yazmanın ne kadar zamanımı aldığını düşünmek gerçekten aptalca geldi. Grails gerçekten de yararlı bir cevap olabilir. Bunu saf Java, Spring MVC ve Hibernate ile yapamazsınız. Yapabilirdiniz. Uygulamanız biraz daha hızlı bile çalışabilir. Ancak Grails ile işi daha hızlı halledeceksiniz.