AÖF Soru Bankası

İnternet Tabanlı ProgramlamaÜnite 8 Özeti

Ruby ve Ruby On Rails

WTK290U-İNTERNET TABANLI PROGRAMLAMA

Ünite 8: Ruby ve Ruby On Rails

Giriş

Ruby, Japon bilgisayar bilimcisi Yukihiro “Matz” Matsumoto tarafından geliştirilmiş bir programlama dilidir. Basitlik ve verimlilik dengesi üzerine inşa edilmiş olan tamamen nesne yönelimli bir dildir. Ruby yüksek okunabilirliğe sahip olması, esnek kod yazmaya imkân tanıması, kolaylıkla genişletilebilmesi, platform bağımsız olması gibi pek çok nedenden ötürü günümüzün popüler dilleri arasında yer almaktadır. Ruby Matz tarafından adapte edilmiş olan İnsan Faktörü Prensibi, Asgari Sürpriz Prensibi, Özgürlük ve Rahatlık Prensibi ve Maksimum Eğlence Prensibi gibi pek çok felsefi temel üzerine inşa edilmiştir. Ruby’nin tüm felsefi temelleri, merkezine insanı yani programcıyı oturtmuş olan prensiplere dayanmaktadır. Dilin tüm yapı taşları programcının daha hızlı ve üretken olması, kendini özgür ve rahat hissetmesi, sürprizlerle karşılaşmaması ve program yazarken eğlenceden uzak kalmaması gibi insani ilkeler üzerine kurulmuştur. Diğer pek çok dilin aksine makine yerine insanı temel alan bir yaklaşım sergiliyor olması Ruby’nin başarısının arkasındaki asıl nedendir.

Ruby dilinin temel özellikleri:

• Tamamen nesne yönelimli bir dildir. • Çok sayıda programlama paradigmasını destekler. • Yorumlanan bir dildir. • Platform bağımsız bir dildir. • Dinamik ve güçlü tiplemeli bir dildir.

Ruby Dili Söz Dizimi ve Bileşenleri

Ruby dili, noktalı virgül ve gereksiz parantezler gibi söz dizimi öğelerinin kullanımının isteğe bırakılması, boşlukların görmezden gelinmesi sayesinde istenilen noktadan kod yazmaya başlanabilmesi ve uzun ifadelerin kolayca birden fazla satıra bölünebilmesi, neredeyse İngilizce metin yazar gibi kod yazmaya ve okumaya imkan tanıması sayesinde oldukça esnek bir söz dizimine sahiptir. Tüm programlama dillerinde yer alan basit ve birleşik veri yapılarına kendine has sözlük (hash), aralık (range), bloklar gibi farklı yapıları da ekleyerek dilin kullanışlılığını ve zenginliğini arttırmaktadır. Döngü oluşturma, akış kontrolü sağlama ve nesne yönelimli programlama öğeleri açısından bakıldığında da diğer birçok dile oranla oldukça zengin bir yapıdadır.

Ruby’de değişkenler isimlendirilirken bazı kurallara dikkat etmemiz gerekmektedir. Değişken isimleri her zaman küçük harf (sabitler için büyük harf) veya _(alt tire) karakteri ile başlamalıdır. Sonrasında harf, alt tire veya rakam kullanılabilir. Değişken isimleri basılamayan karakterleri (boşluk, sekme karakterleri gibi.) içeremez. Değişken isimleri anahtar kelimeler olamaz. Değişkenler geçerli oldukları kapsama göre türlere ayrılabilir.

• Yerel Değişkenler: Sadece tanımlandıkları blok içerisinde kullanılabilirler. • Global Değişkenler: Tüm program içerisinde kullanılabilir durumda olan değişkenlerdir. Bu

değişkenlerin isimlendirilmesine $ karakteri ile başlanır. • Örnek Değişkenleri: Nesnelere ait özellikleri saklamak için kullanılır. Değişken ismi @ karakteri ile başlamalıdır. • Sınıf Değişkenleri: Bir sınıf içerisinde veya bu sınıftan oluşturulan tüm nesneler tarafından erişilebilir olan değişkenlerdir. • Sabitler: Yerel değişkenler gibidirler ancak değerleri değiştirilmeye çalışıldığında bir uyarı alınmasına neden olurlar. Değeri program boyunca değişmeyecek olan veriler için kullanılmalıdırlar. İsimleri büyük harf ile başlamalıdır.

Ruby dilinde kullanılan veri türlerini basit veri türleri (sayılar, metinler, semboller ve mantıksal) ve birleşik veri türleri (diziler ve sözlükler) olarak ikiye ayrılır.

Ruby on Rails Çatısı

Ruby on Rails, Ruby dili ile geliştirilmiş bir web uygulama geliştirme çatısıdır (framework). Rails felsefesi ya da daha çok bilinen ismiyle Rails yolu iki ana prensibi benimsemektedir:

• Kendi Kendini Tekrarlama: DRY(Don’t Repeat Yourself) olarak bilinen bu prensip; her bilgi parçasının bir sistem içerisinde tek, kesin ve güvenilir bir ifadesinin olması gerektiğini savunmaktadır. Aynı bilginin tekrar tekrar yazılmıyor olması kodumuzun daha yönetilebilir, esnek ve az hatalı hale gelmesini sağlayacaktır. • Konfigürasyon Üzerine Kabuller: Rails, bir web uygulamasında gerekli olan pek çok şeyi yapmak için kullanılabilecek en iyi yolun hangisi olduğuna ilişkin fikirlere sahiptir ve bunu varsayılan olarak sunmaktadır. Bu sayede programcılar, sonsuz konfigürasyon ayarlamaları ile uğraşmak yerine; ya hiç ya da çok az değişikliğe ihtiyaç duyacaklardır.

Rails, MVC adı verilen, Model-Görünüm (View)- Kontrolör (Controller) yazılım mimarisi desenini kullanmaktadır. MVC’nin ardındaki ana düşünce; yazılımın kullanıcıya hitap eden bölümü yani kullanıcı arayüzü ile arka plandaki işlemlerin birbirinden ayrı bölümler olarak ele alınmasına dayanmaktadır. Bu amaçla sistemi üç ana rol başlığı altında geliştirmeyi öngörmektedir:

• Model: Uygulamaya özel verilerin ve uygulamanın iş mantığına uygun biçimde bu veriler arasındaki ilişkilerin, erişim ve düzenleme kurallarının bulunduğu bölümdür. Diğer bir deyişle uygulamamızın kullandığı tüm verilerin yaşadığı yer burasıdır. Model, bu verilerin kullanıcıya ne şekilde sunulacağı ile ilgilenmez. • View (Görünüm): Uygulamanın kullanıcılarına sunulacak olan arayüz elemanlarını içeren yani kullanıcıların gördüğü tek bölümdür. Kullanılan


verilerin nereden geldiği ile ilgili bir bilgisi yoktur. • Controller (Kontrolör): Kullanıcıdan gelen isteklerle ilgili işlemleri gerçekleştirmek üzere gerekli görevleri yerine getiren bölümdür. Uygulamayı kullanan kişi ne zaman bir istekte bulunacak olsa, bu isteği ele alacak olan bölüm burasıdır. İsteğe uygun olarak gerekli yanıtı (genellikle uygun verilerle birlikte bir görünüm oluşturarak), istemciye ulaştırmakla yükümlüdür.

Çok sayıda bileşenin bir araya gelmesiyle oluşan Rails’in temel olarak çalışma prensibi şu adımlarla açıklanabilir:

1. Bir istemcinin uygulamamız ile iletişime geçmesi sırasında gerçekleşecek olan ilk adım, sunucudan bir HTTP isteğinde bulunulmasıdır. Bir HTTP isteği kaynağın URL adresi, istek metodu ve başlık bilgilerinden oluşur. 2. İsteği alan sunucu, onu Action Dispatch bileşenine iletir. Bu bileşen, istenilen kaynağa ilişkin URL adresi ile uygulamanın rota tablosunda yer alan kayıtları karşılaştırır. Eşleşme bulması durumunda bu rotaya karşılık olarak belirtilmiş olan kontrolöre ilişkin eylemi çalıştırır ve (varsa) parametreleri de gönderir. Böylece kontrol Action Controller bileşenine geçer. 3. Eylemin çalıştırılması sırasında veri tabanı ile etkileşim gerekliyse; Action Controller bileşeni, Active Record bileşeni ile etkileşime geçer ve bu bilesen veri tabanındaki gerekli işlemleri gerçekleştirir. 4. Action Controller daha sonra kontrolü Action View bileşenine devrederek görünümlerin oluşturulmasını sağlar. Oluşturulan görünümler tekrar Action Controller bileşenine iletilir. 5. İletişimin son adımı da HTTP yanıtının oluşturularak, istemciye gönderilmesi olacaktır. Bu adımda; Action Controller, Action View’dan gelen çıktıyı (HTML, XML, JSON gibi) mesajın gövdesine ekleyerek, diğer bilgilerle (baslık bilgileri, durum kodu) beraber web sunucusuna gönderir. Web sunucusu da tüm bunları tarayıcıya gönderir ve süreç tamamlanır.

Ruby on Rails ile Uygulama Geliştirme

Ruby on Rails uygulamasında yer alan dizin ve dosyalar şunlardır:

• app/: Bir geliştiricinin üzerinde en çok çalışacağı yer burasıdır. Uygulamamızda kullanacağımız modeller, görünümler, kontrolörler ve postacılar gibi yapılara ilişkin hemen hemen her şey bu klasör içerisinde uygun alt klasörlere yazılacaktır. • bin/: Bu klasör çalıştırılabilir dosyaları barındırmaktadır. İçerisinde bundle, rails, spring ve rake gibi dosyaları barındırmaktadır. Örneğin biraz evvel çalıştırdığımız bin/rails komutuna ilişkin dosya burada yer almaktadır.

• config/: Uygulamamıza ilişkin yapılandırma bilgilerinin yer aldığı klasördür. Örneğin uygulamamızda kullanacağımız veri tabanı ile ilgili ayarlar ve erişim bilgileri, URL isteklerinin yönlendirileceği rotalar, yerelleştirme ayarları gibi tüm yapılandırma bilgilerini bu klasör içerisinde saklarız. • db/: Veri tabanı ile ilgili şema, aktarımlar, çekirdek veriler gibi dosyalar bu klasörde yer alır. • Gemfile Gemfile.lock: Uygulamamızda kullandığımız paketlere ait isim, versiyon gibi bilgilerin yer aldığı dosyalardır. Yeni bir paket kullanacağımızda veya kullandığımız bir paketi kaldırmak/güncellemek istediğimizde Gemfile dosyası üzerinde değişiklik yaparız. • lib/: Modeller, görünümler ve kontrolörlere doğrudan ait olmayan uygulamaya özel ve paket haline getirilmemiş kütüphane kodları, rake görevleri vb. dosyaları barındırır. Daha çok uzman kullanıcılar tarafından kullanılan bir dizindir. • log/: Uygulamaya ait günlük dosyalarının bulunduğu dizindir. Uygulamanın çalışması sırasında meydana gelen tüm olaylar bu dosyalara kaydedilmektedir. • public/: Uygulamamızın dış dünyaya acık olan yegâne dizinidir. İçerisinde statik dosyalar bulunmaktadır. • test/: Uygulamamıza ait testlerin bulunduğu klasördür. Uygulamamızın, daha önceden belirlenmiş beklentilere uygun olarak çalışıp çalışmadığını test etmemizi sağlar. • tmp/: Önemsiz ve geçici dosyalar bu dizinde yer almaktadır. • vendor/: Tipik bir rails uygulamasında kullanılan paketlere ait üçüncü parti yazılım kodlarının bulunduğu dizindir.

Rails yönlendiricisi ile birlikte kullanabileceğimiz HTTP metotları GET, POST, PUT, PATCH ve DELETE olmak üzere beş adettir. GET metodu ile yapılan istekler sunucudaki bir kaynağı elde etmek için kullanılırken, POST metodu sonucunda sunucuda yeni bir kaynak oluşturulması hedeflenmektedir. Sunucudaki bir kaynağın güncellemesi amacıyla kullanılabilecek olan PUT ve PATCH metotlarından ilki kaynağın tamamıyla güncellenmesi durumunda kullanılırken, patch metodu kaynağın kısmen güncellenmesinin istenildiğini gösterir. DELETE metodu ile yapılan istekler ise sunucudaki bir kaynağın silinmesini hedef almaktadır.

ERB, farklı dosya türleri içerisine Ruby kodlarını gömmemizi sağlayan bir şablon oluşturma sistemidir. Örneğin index.html.erb dosyası sayfayı talep eden ziyaretçiye gönderilmeden önce içerisindeki Ruby kodları çalıştırılacak ve asıl index.html dosyası oluşturulacaktır. Erb etiketleri her zaman <% karakterleri ile sonlandırılır. Bu karakterler arasına yazılacak kodlar Ruby yorumlayıcısı tarafından değerlendirilecektir, ancak herhangi bir çıktı


oluşturmayacaklardır. Eğer hem kodların değerlendirilip, hem de çıktı olarak dosyaya eklenmesini istiyorsak kodu gömmeye <%= karakterleri ile başlamak gerekir.

Ruby dilinin teknik özelliklerinden bazılarını, bir uygulamanın geliştirilmesi konusunda yetersiz olabilme potansiyeli açısından incelendiğinde göze en çok çarpan onun yorumlanan bir dil olmasıdır. Yorumlanan diller, derlenen dillere oranla daha esnek olduklarından bir miktar performans kaybının yaşanmasına sebep olabilirler. Bu özelliği nedeniyle işletim sistemi, derleyici yazılımları ve çok yüksek trafikli uygulamalar yazmak için çok kullanışlı değildir. Bunun dışında Ruby ile hemen hemen her tür uygulama geliştirmek mümkündür.

Bu ünitenin sorularını uygulamada çözŞıklar, doğru cevaplar ve süreli sınav modu AÖF Soru Bankası uygulamasında