Scala Eğitimi: Scala Programlama Dili Örneği ve Kodu

Scala Eğitim Özeti

Bu scala eğitimi, scala'nın tüm yönlerini ve konularını kapsar. Scala nedir, scala kurulum süreci, Scala programları, Scala Fonksiyonları, Tembel değerlendirme, Tip arayüzü, sınıflar ve nesneler, Kalıtım, Soyutlamalar, gibi tüm temel bilgileri sıfırdan öğreneceksiniz. Java ve ölçek farklılıkları vb.

Skala nedir?

Scala uygulamaların ölçeklenebilirliğini artırmak için hem işlevsel hem de nesne yönelimli programlamayı birleştiren statik olarak yazılmış bir programlama dilidir. Scala öncelikle JVM platformunda çalışır ve Scala-Native kullanarak yerel platformlar için yazılım yazmak için de kullanılabilir. JavaSenaryo ScalaJ'ler aracılığıyla çalışma zamanları.

Scala, birden fazla platform için Yazılım yazmak için kullanılan Ölçeklenebilir bir Dildir. Bu nedenle “Scala” adını almıştır. Bu dil sorunların çözümüne yöneliktir. Java aynı zamanda daha özlüdür. Başlangıçta Martin Odersky tarafından tasarlanmış olup 2003 yılında yayınlanmıştır.

Neden Scala öğrenmelisiniz?

Scala Programlama Dilini öğrenmenin başlıca nedenleri şunlardır:

  • Scala, nesne yönelimli programcılar için öğrenmesi kolaydır, Java geliştiriciler. Son yıllarda popüler dillerden biri haline geliyor.
  • Scala, kullanıcılara birinci sınıf işlevler sunar
  • Scala çalıştırılabilir JVMBöylece diğer dillerle birlikte çalışabilirliğin önünü açmış oluyoruz.
  • Eş zamanlı, dağıtılmış ve esnek mesaj odaklı uygulamalar için tasarlanmıştır. Bu on yılın en zorlu dillerinden biridir.
  • Kısa ve güçlü bir dildir ve kullanıcılarının talebine göre hızla büyüyebilir.
  • Nesne yönelimlidir ve geliştiricilere istedikleri şekilde kodlama yapma konusunda çok fazla esneklik sağlayan birçok işlevsel programlama özelliğine sahiptir.
  • Scala birçok Ördek Türü sunuyor
  • Eğer geliyorsanız daha az standart var Java
  • Scala'da yazılan Lift and Play çerçeveleri büyüme eğrisindedir.

Scala nasıl kurulur

Scala programlarını yazmaya başlamak için bilgisayarınızda kurulu olması gerekir. Bunu yapmak için sitelerini ziyaret etmeniz gerekecek https://www.scala-lang.org/download/ Scala'nın en son sürümünü indirmek için.

Bağlantıyı takip ederek, makinelerimize Scala'yı kurmak için seçebileceğimiz iki seçeneğe yönlendiriliyoruz. Bu Scala eğitimi için, IntelliJ IDEA.

Scala nasıl kurulur

İndirme bağlantısını ziyaret ettiğinizde IntelliJ IDE'nin iki sürümünü bulacaksınız.

Bu Scala eğitimi için ücretsiz olan ve Scala programları yazmak için ihtiyacınız olan her şeyi içeren Community Edition'ı indireceğiz.

Scala nasıl kurulur

) 1 Adım Topluluk Sürümü'nü seçin
Sayfada Topluluk Sürümü açılır menüsüne tıklayın.

Bize JDK uygulamasını içeren JBR ile birlikte IntelliJ IDE'yi indirme seçeneği sunuyor (Java Geliştirme Kiti) Scala'nın kodu derlemesi ve çalıştırması için gereken OpenJDK.

Scala nasıl kurulur

) 2 Adım Kurulumu çalıştırın
IntelliJ'i indirdikten sonra kurulum sihirbazını çalıştırmak için üzerine çift tıklayın ve diyaloğu takip edin.

Scala nasıl kurulur

) 3 Adım Bir konum seçin
IDE'nin kurulacağı konumu seçin.

Scala nasıl kurulur

Eğer JDK'lı olanı indirmediyseniz, yine de onay kutusunu seçerek indirmeyi kontrol edebileceğimiz bir istem alıyoruz.

Scala nasıl kurulur

) 4 Adım İleri'ye tıklayın
Diğer varsayılanları olduğu gibi bırakın ve ileri seçeneğine tıklayın.

Scala nasıl kurulur

) 5 Adım Başlangıç ​​simgesine tıklayın
Kurulum tamamlandıktan sonra normal bir uygulama gibi başlangıç ​​menüsündeki başlangıç ​​simgesine tıklayarak IntelliJ IDE'yi çalıştırın.

Scala nasıl kurulur

Scala eklentisini IntelliJ'e eklemek için hala ek bir adım atmanız gerekiyor; bunu ekranın sağ alt kısmında bulunan yapılandırma menüsündeki açılır menüye tıklayarak ve eklenti seçeneğini seçerek yapabilirsiniz.

Scala nasıl kurulur

Scala nasıl kurulur

Marketplace sekmesinde, Scala araması, eklentiyi Diller etiketi altında ilk sonuç olarak sunacaktır.

) 6 Adım Eklenti kur
Eklentiyi indirmeye başlatacak olan yükle'yi tıklayın.

Scala nasıl kurulur

) 7 Adım IDE'yi yeniden başlatın
İndirme işlemi tamamlandıktan sonra, yüklü eklentinin çalışmaya başlayabilmesi için IDE'yi yeniden başlatmanız istenecektir.

Scala nasıl kurulur

Yeniden başlattıktan sonra kendinizi daha önce IDE'yi çalıştırdığımız zamanki sayfada bulacaksınız, ancak bu sefer Scala eklentisini zaten yükledik.

Scala Merhaba Dünya Programı

) 1 Adım Bizi projemizin kullanacağı dil türünü seçebileceğimiz bir sayfaya yönlendirecek Proje Oluştur seçeneğini seçin.

Scala Merhaba Dünya Programı

) 2 Adım Scala onay kutusunu seçerek Scala'yı seçin ve İleri'ye tıklayın.

Scala Merhaba Dünya Programı

) 3 Adım Proje dosyamızı kaydetmek için bir konum seçin ve projemize bir ad verin.

Scala Merhaba Dünya Programı

Dizin mevcut değilse IntelliJ, klasörü oluşturmak için bizden izin istememizi isteyecektir. Kabul edin ve bitir'i tıklayın. Şu anda herhangi bir Scala kodu olmayan Scala projenize yönlendirileceksiniz.

Bazı dizinlerin yüklenmesi biraz zaman alacaktır, bu nedenle IDE'nizin altında bir ilerleme çubuğu varken hemen herhangi bir şey yapamıyorsanız endişelenmeyin, bu sadece IDE'nizin Scala'yı çalıştırmak için gerekli bazı dosyaları yüklediği anlamına gelir ve IDE otomatik tamamlama konusunda yardım.

) 4 Adım Daha sonra IDE'nin solundaki projeler sekmesine tıklayıp genişleteceğiz ve projemizin içeriğini görebileceğiz.

Scala Merhaba Dünya Programı

Şu anda proje boştur ve yalnızca IDE tarafından oluşturulan bir .idea klasörü ve hello-world.iml dosyasını içerir. İlgilendiğimiz nokta src klasörüdür. Src projemizin kaynak kodunu sakladığımız yerdir. İlk Scala dosyamızı oluşturacağımız yer burasıdır.

) 5 Adım Yeni bir Scala dosyası oluşturmak üzere bir menü açmak için src'ye sağ tıklayın.

Yeni bir Scala dosyası oluşturun

Daha sonra dosya için bir ad oluşturacağız, bu Scala eğitiminde merhaba kullanacağız ve ardından açılır menüden Scala dosyasının içeriği olarak neyi koyacağımızı seçeceğiz. “Nesne”yi seçin

Scala Merhaba Dünya Programı

Bunu yaptığımızda, kodumuzu çalıştırmak için kullanacağımız Singleton nesnesini içeren bir Scala dosyamız olacak.

Scala Merhaba Dünya Programı

Artık Hello nesnesi içeren bir Scala dosyanız var. Oluşturduğunuz nesneyi App anahtar sözcüğünü kullanarak genişleterek ilk programınızı yazacaksınız.

Nesnemizi App ile genişletmek, derleyiciye programınızı başlattığında hangi kodu çalıştıracağını söyler. Uygulamayı genişlettikten hemen sonra sol tarafta, programınızı artık çalıştırabileceğinizi gösteren yeşil bir ok belirir.

Scala Merhaba Dünya Programı

Scala Merhaba Dünya Programı

Hello nesnesinin içine, içindeki metni konsola yazdırmak için kullanılan bir println() işlevi yazıyoruz. Yeşil oka tıklayarak kodumuzu çalıştıracağız.

Oka tıklamak bize Çalıştır seçeneğini sunar, merhaba, tıkladıktan sonra kodumuz derlenmeye başlayacak ve birkaç saniye sonra IntelliJ IDE'de yerleşik olan konsoldan programımızın sonuçlarının yazdırıldığını göreceğiz.

Scala Merhaba Dünya Programı

Ve işte başlıyoruz, Scala'yı başarıyla kurduk ve ilk programımızı çalıştırdık.

Scala ile yapabilecekleriniz

  • ScalaJS ile ön uç web geliştirme
  • Mobil geliştirme, her ikisi de Android Geliştirme ve IOS – Scala Native ile
  • HTTP4S, Akka-Http, Play Framework gibi sunucu tarafı kitaplıkları
  • Nesnelerin interneti kullanan
  • Oyun geliştirme
  • NLP – Bir dizi kütüphaneyi kullanan Doğal Dil İşleme ScalaNLP
  • Fonksiyonel Programlama ve Nesneye Dayalı Programlama gibi ileri programlama tekniklerinin test edilmesi
  • Erlang'dan ilham alan JVM için aktörler kütüphanesini kullanarak yüksek düzeyde eşzamanlı iletişim uygulaması oluşturun
  • Olasılıksal programlama yapan Figaro ve Apache gibi kütüphaneleri kullanarak makine öğrenimi için kullanın Spark o

Anonim İşlevler

Scala dilinin aynı zamanda Scala adı verilen anonim işlevleri vardır. işlev değişmezleri. Scala'nın işlevsel bir dil olması çoğu zaman geliştiricilerin büyük sorunları birçok küçük göreve ayırması ve bu sorunları çözmek için birçok işlev oluşturması anlamına gelir. Fonksiyon oluşturmayı kolaylaştırmak için Scala, şu fonksiyonları içerir: isimsiz örneklenmiş. Aşağıdaki Scala örneğinde gösterildiği gibi bunları doğrudan 'def' değişkenlerine veya tanımlarına atayabiliriz:

val multiplyByTwo = (n:Int) => n * 2
def multiplyByThree = (n:Int) => n *3

Daha sonra, aşağıdaki parametreleri onlara ileterek işlevleri kullandığımız normal yolu kullanabiliriz.

multiplyByTwo(3)

//6

multiplyByThree(4)

//12

Temiz ve kısa bir koda sahip olmak istediğimizde bu yöntemler kullanışlıdır. Büyük olmayan ve bünyesinde çok fazla kod gerektirmeyen yöntemleri tanımlarken anonim fonksiyonları kullanabiliriz. Çok basittirler ve yaratmak için bir törene ihtiyaç duymazlar.

Bu yöntemler argüman içeren işlevlerle sınırlı değildir ve herhangi bir argüman almayan yöntemleri başlatmak için kullanılabilir.

val sayHello = ()=>{ println("hello") }

Bu anonim işlevlerin çoğu, kodumuzun yerinde hızlı bir işlev oluşturmamız gereken diğer bölümlerinde kullanılır.

Bu işlevlere aynı zamanda şu adlarla da değinilmesinin bir başka nedeni de satır içi işlevler. Anonim işlevlerin kullanılması, bir koleksiyon üzerinde hızlı eylemler gerçekleştirmek için koleksiyon kitaplığında yaygın olarak kullanılan yaygın bir kalıptır.

Örneğin, yalnızca anonim işlevde tanımladığımız kriterleri karşılayan öğelerden oluşan başka bir koleksiyon oluşturmak için satır içi işlevi/anonim işlevi alan filtre yöntemimiz var.

val myList = List(1,2,3,4,5,6,7)

val myEvenList = myList.filter((n: Int) => n % 2 == 0)
//List(2,4,6)

val myOddList = myList.filter((n:Int) => n % 2 != 0)
//List(1,3,5,7)

Burada anonim fonksiyonlar olarak sahip olduğumuz yöntemler listeden aldığımız değerin tek ve çift olup olmadığını kontrol eden ve öğeyi döndüren yöntemlerdir.

//the one checking that the value is even
(n: Int) => n % 2 == 0

//the one checking that the value is odd
(n:Int) => n % 2 != 0

Scala'da, anonim işlevimizin parametresinin adlandırılmadığı durumlarda joker karakterler kullanmak da mümkündür. Örneğin

var timesTwo = (_:Int)*2

timesTwo(5)
//10

Bu senaryoda, ilettiğimiz parametreye isim vermiyoruz. Bunu temsil etmek için kullandığımız tek şey alt çizgidir.

Tembel Değerlendirme

Çoğu dil, değişkenleri ve fonksiyon parametrelerini birbiri ardına sırayla değerlendirir. Scala'da, referans alınana kadar değerlendirilmesini istemediğimiz değerlerle başa çıkmamıza yardımcı olan tembel adında bir anahtar kelimemiz var.

Tembel olarak işaretlenen bir değişken, tanımlandığı yerde değerlendirilmez; buna genellikle istekli değerlendirme denir ve yalnızca kodun ilerleyen kısımlarında referans alındığında değerlendirilir.

Bu, bir değeri değerlendirirken pahalı bir hesaplama olabileceği durumlarda yararlı olabilir; eğer değere her zaman ihtiyaç duyulmuyorsa, değişkenimizi tembel hale getirerek yazılımımızı yavaşlatabilecek pahalı bir hesaplama yapmaktan kendimizi kurtarabiliriz.

lazy val myExpensiveValue = expensiveComputation

def runMethod()={
    if(settings == true){
        use(myExpensiveValue)
    }else{
        use(otherValue)
    }
}

Tembel değişkenlerin tek kullanım durumu bu değildir. Ayrıca koddaki döngüsel bağımlılık sorunlarının çözümüne de yardımcı olurlar.

Ayarların yanlış olması durumunda myExpensiveValue'yu kullanmamız gerekmeyebilir, bu da bizi pahalı bir hesaplama yapmaktan kurtarabilir, bu da kullanıcıların uygulamamızı kullanırken iyi vakit geçirmelerini sağlamaya yardımcı olur, çünkü diğer ihtiyaçları bunaltılmadan doğru şekilde hesaplanabilir. hafıza.

Ayarların yanlış olması durumunda myExpensiveValue'yu kullanmamız gerekmeyebilir, bu da bizi pahalı bir hesaplama yapmaktan kurtarabilir, bu da kullanıcıların uygulamamızı kullanırken iyi vakit geçirmelerini sağlamaya yardımcı olur, çünkü diğer ihtiyaçları bunaltılmadan uygun şekilde hesaplanabilir. hafıza.

Tembellik aynı zamanda, argümanların yalnızca fonksiyon içinde referans verildiğinde kullanıldığı fonksiyon argümanlarına da yardımcı olur. Bu kavrama isme göre çağrı parametreleri denir.

def sometimesUsedString(someValue:String, defaultValue:=> String)={
 if(someValue != null){
   use(defaultValue)
 }else{
   use(someValue)
   }
 }

Birçok dil argümanları değerlendirmek için değere göre çağırma yöntemini kullanır. Adına göre çağırma yoluyla geçirilen parametre yalnızca fonksiyon gövdesinde ihtiyaç duyulduğunda değerlendirilir ve bundan önce değerlendirilmez. Değer değerlendirildikten sonra saklanır ve daha sonra yeniden değerlendirilmesi gerekmeden yeniden kullanılabilir. Ezberleme olarak bilinen bir kavram.

Tür Çıkarımı

Scala'da oluşturduğunuz her değişken için tür bildirmenize gerek yoktur. Bunun nedeni, Scala derleyicisinin sağ taraftaki değerlendirmeye dayalı olarak türler üzerinde tür çıkarımı yapabilmesidir. Bu, kodunuzun daha kısa ve öz olmasını sağlar; bizi beklenen türün açık olduğu standart metin yazmaktan kurtarır

var first:String = "Hello, "
var second:String = "World"
var third = first + second
//the compile infers that third is of type String

Yüksek Dereceli Fonksiyon

Üst düzey bir işlev, işlevleri bağımsız değişken olarak alabilen ve bir işlevi dönüş türü olarak döndürebilen bir işlevdir. Scala'da işlevler birinci sınıf vatandaş olarak kabul edilir. Bu işlevleri bu şekilde kullanmak, yapabileceğimiz program türlerinde oldukça esnek olmamızı sağlar. Dinamik olarak işlevler oluşturabilir ve işlevselliği diğer işlevlere dinamik olarak besleyebiliriz.

def doMathToInt(n:Int, myMathFunction:Int=>Int): Int ={
    myMathFunction(n)
}

Yukarıdaki fonksiyonda, bir int ve int alıp int döndüren bir fonksiyon aktarıyoruz. Bu imzanın herhangi bir işlevini aktarabiliriz. İmza derken, bir fonksiyonun giriş ve çıkışını kastediyoruz. Int=>Int imzası, bir fonksiyonun girdi olarak bir Int aldığı ve çıktı olarak bir Int döndürdüğü anlamına gelir.

()=>Int İmzası, bir fonksiyonun girdi olarak hiçbir şey almadığı ve çıktı olarak bir Int döndürdüğü anlamına gelir. Bunun gibi bir fonksiyonun örneği, bizim için rastgele bir int üreten fonksiyon olabilir.

def generateRandomInt()={
 return scala.util.Random.nextInt()
}

Yukarıdaki işlevin bir imzası vardır ()=>Int

İmza ölçeği ()=>Birim olan bir fonksiyonumuz olabilir. Bu, işlevlerin hiçbir şey almadığı ve bir tür döndürmediği anlamına gelir. İşlev, bir şeyi önceden belirlenmiş bir şeye dönüştürerek bir tür hesaplama yapıyor olabilir.

Ancak bu tür yöntemler teşvik edilmez, çünkü bunlar bir sistemi bilinmeyen şekillerde etkileyebilen kara kutular gibi görünür. Ayrıca test edilemezler. Açık girdi ve çıktı türlerine sahip olmak, fonksiyonumuzun ne yaptığını akıl yürütmemizi sağlar.

Daha yüksek dereceli bir işlev de bir işlev döndürebilir.

Mesela bir kuvvetlendirme fonksiyonu yaratacak yani bir sayıyı alıp ona kuvvet uygulayacak bir yöntem oluşturabiliriz.

def powerByFunction(n:Int):Int=>Int = {
  return (x:Int)=> scala.math.pow(x,n).toInt
}

Yukarıdaki fonksiyon bir int alır. Dönüş tipimiz Int x, * alan anonim bir fonksiyondur, güç fonksiyonunun argümanı olarak int x'i kullanırız.

Körileme

Scala'da, iki argüman alan bir fonksiyonu, aynı anda bir argüman alan bir fonksiyona dönüştürebiliriz. Bir argümanı ilettiğimizde, onu kısmen uygularız ve işlevi tamamlamak için bir argüman alan bir fonksiyon elde ederiz. Currying, bazı argümanları kısmen ekleyerek işlevler oluşturmamızı sağlar.

Bu, tam bir argüman kümesine sahip olmadan önce dinamik olarak işlevler oluşturmak için yararlı olabilir.

def multiply two numbers(n:Int)(m:Int): Unit ={
  return n * m
}

Belirli bir sayıyla çarpan bir fonksiyon oluşturmamız gerekiyorsa başka bir çarpma yöntemi oluşturmamıza gerek yoktur.

Yukarıdaki fonksiyonumuzda .curried'i basitçe çağırabilir ve önce bir argüman alan ve kısmen uygulanmış bir fonksiyonu döndüren bir fonksiyon elde edebiliriz.

def multiplyTwoNumbers(n:Int)(m:Int): Unit ={
  return n * m
}

var multiplyByFive = multiplyTwoNumbers(5) 

multiplyByFive(4)

//returns 20

Desen Eşleştirme

Scala, tıpkı switch ifadesinde yaptığımız gibi, bir değişkenin belirli kriterlere uyup uymadığını kontrol etmemize yardımcı olacak güçlü bir dahili mekanizmaya sahiptir. Java veya bir dizi if/else ifadesinde. Dilin, bir değişkenin belirli bir türde olup olmadığını kontrol etmek için kullanabileceğimiz kalıp eşleştirmesi vardır. Scala'da desen eşleştirme güçlüdür ve ilgilendiğimiz alanları doğrudan eşleştirdiğimiz değişkenden almak için uygulanmayan bir yönteme sahip bileşenlerin yapısını bozmak için kullanılabilir.

Scala'nın kalıp eşleştirmesi aynı zamanda switch ifadesine göre daha hoş bir sözdizimi sağlar.

myItem match {
  case true => //do something
  case false => //do something else
  case  _ => //if none of the above do this by default
}

Değişkenimizi bir dizi seçenekle karşılaştırırız ve eşleştirdiğimiz değişken kriterleri karşıladığında kalın okun (=>) sağ tarafındaki ifade değerlendirilir ve eşleşme sonucu olarak döndürülür.

Kodumuzda eşleşmeyen durumları yakalamak için alt çizgi kullanırız. Switch ifadeleriyle uğraşırken varsayılan durumun davranışını yansıtır.

class Animal(var legs:Int,var sound:String)
class Furniture(var legs:Int, var color:Int, var woodType:String)

myItem match {
case myItem:Animal => //do something
case myItem:Furniture => //do something else
case _ => //case we have a type we don't recognize do sth else
}

Yukarıdaki kodda, myItem değişkeninin türünü bulabilir ve bu dallanmayı bazı özel kodlara göre bulabilirsiniz.

Desen eşleştirme, değişkenin eşleşip eşleşmediğini kontrol eder

Alt çizgi, yukarıdaki durum ifadelerindeki diğer öğelerle eşleşmeyen herhangi bir koşulla eşleşen bir yer tutucu görevi görür. MyItem değişkenini alıyoruz ve match yöntemini çağırıyoruz.

  • myItem öğesinin doğru olup olmadığını kullanarak kontrol ediyoruz ve "=>" kalın okunun Sağ Tarafında bazı mantık işlemleri gerçekleştiriyoruz.
  • alt çizgiyi kodda tanımladığımız case ifadelerinden herhangi biriyle eşleşmeyen herhangi bir şeyle eşleştirmek için kullanırız.

Case sınıflarıyla daha da ileri gidebilir ve nesnenin içindeki alanları elde etmek için sınıfın yapısını bozabiliriz.

Sınıflarımızı tanımlamak için mühürlü anahtar kelimeyi kullanarak, derleyicinin eşleştirmeye çalıştığımız durumları kapsamlı bir şekilde kontrol etmesini ve belirli bir durumu ele almayı unutursak bizi uyarmasını sağlama avantajından yararlanırız.

değişmezlik

Val anahtar sözcüğünü kullanarak Scala'da diğer işlevler tarafından değiştirilemeyecek değerler oluşturmak mümkündür. Bu, şu şekilde elde edilir: Java final anahtar sözcüğünü kullanarak. Scala'da bunu, değişken oluştururken değişken değişken oluşturmak için kullanacağımız alternatif olan var yerine val anahtar sözcüğünü kullanarak yaparız.

Val anahtar sözcüğü kullanılarak tanımlanan bir değişken salt okunurdur, var ile tanımlanan bir değişken ise koddaki diğer işlevler tarafından veya kullanıcı tarafından isteğe bağlı olarak okunabilir ve değiştirilebilir.

var changeableVariable = 8

changeableVariable =10
//the compiler doesn't complain, and the code compiles successfully

println(changeableVariable)
//10

val myNumber = 7

myNumber = 4

//if we try this the code won't compile

myNumber'ı val olarak bildirdikten sonra ona bir değer atamaya çalışmak derleme zamanı hatasına veya "val'e yeniden atanmaya" neden olur.

Neden Değişmezlik kullanılmalı?

Değişmezlik, kodun ve diğer programcıların değerlerimizi beklenmedik bir şekilde değiştirmesini önlememize yardımcı olur; bu da beklenmedik sonuçlara yol açabilir, eğer sakladığımız değeri kullanacaklarsa bunun yerine bir kopyasını alabilirler. Bu sayede birden fazla aktörün aynı değişkeni değiştirmesinden kaynaklanabilecek hataların önüne geçilmiş olur.

Sınıflar ve Nesneler

Hepimiz nesnelerin gerçek dünyadaki varlıklar olduğunu ve sınıfın da nesneleri tanımlayan bir şablon olduğunu biliyoruz. Sınıfların hem durumları hem de davranışları vardır. Durumlar ya değerlerdir ya da değişkenlerdir. Davranışlar Scala'daki yöntemlerdir.

Bir sınıfı nasıl tanımlayabileceğinizi, onu nasıl örneklendirebileceğinizi ve Scala kullanarak nasıl kullanabileceğinizi inceleyelim.

Burada iki değişken ve iki fonksiyona sahip olan Rectangle adı verilen sınıf var. Ayrıca l ve b parametrelerini doğrudan programdaki alanlar olarak kullanabilirsiniz. Bir ana yöntemi olan ve sınıfı iki değerle başlatan bir nesneniz var.

Örnek:

class Rectangle( l: Int,  b: Int) {
  val length: Int = l
  val breadth: Int = b
  def getArea: Int = l * b
  override def toString = s"This is rectangle with length as $length and breadth as  $breadth"
  }
object RectObject {
  def main(args: Array[String]) {
    val rect = new Rectangle(4, 5)
    println(rect.toString)
    println(rect.getArea)    
  }
}

Scala'da tüm alanlar ve yöntemler varsayılan olarak herkese açıktır. Scala'da Object için toString yöntemi tanımlandığından override kullanılması önemlidir.

miras

Scala, geleneksel biçimlerle çok sayıda ortak özelliği paylaşan birden fazla türde kalıtım (tek, çok düzeyli, çoklu, hiyerarşik, hibrit gibi) içerir. Java. Hem sınıflardan hem de özelliklerden miras alabilirsiniz. “Extends” anahtar sözcüğünü kullanarak bir sınıfın üyelerini başka bir sınıfa miras alabilirsiniz. Bu, yeniden kullanılabilirliği sağlar.

Bir sınıftan veya birden fazla sınıftan miras almak mümkündür. Ayrıca, süreçte bir kalıtım hiyerarşisi yaratarak, kendilerinin de üst sınıflarına sahip olan alt sınıflardan miras almak da mümkündür.

Aşağıdaki Scala örneğinde Temel sınıf Circle, türetilmiş sınıf ise Sphere'dir. Bir dairenin, Sphere sınıfından miras alınan, yarıçap adı verilen bir değeri vardır. calcArea yöntemi geçersiz kılma anahtar sözcüğü kullanılarak geçersiz kılınır.

Örnek:

class Circle {
  val radius = 5;
  def calcArea = {
    println(radius * radius )
  }
}
class Sphere extends Circle{
 override def calcArea = {
    println(radius * radius * radius )
  }
}
  object SphereObject{
    def main(args : Array[String]){
      new Sphere().calcArea 
    }
  }

Soyutlama

Scala'da soyut sınıfları ve özellikleri kullanarak soyut yöntemler ve üye alanları oluşturabiliriz. Soyut sınıflar ve özellikler içinde, soyut alanları uygulama zorunluluğu olmadan tanımlayabiliriz.

Örnek:

trait MakesSound{
    var nameOfSound:String
    def sound():String
}
abstract class HasLegs(var legs:Int){
    val creatureName:String

    def printLegs():String={
        return s"$creatureName has this number of legs: $legs"
    }
}

Bu alanlar, özelliği veya soyut sınıfı genişleten sınıflar tarafından uygulanır. Uygulamamızın ne yapabilmesi gerektiğine dair sözleşmeler oluşturmak için özellikleri kullanabilir ve daha sonra bu yöntemleri uygulayabilirsiniz.

trait DatabaseService{
    def addItemName(itemName:String)
    def removeItem(itemId:Int)
    def updateItem(itemId:Int, newItemName:String)
}

Bu şekilde, çeşitli yöntemlerin nasıl görüneceğini öngörmemize yardımcı olabilecek yöntemleri uygulamadan, uygulamamızın nasıl görüneceğini planlayabiliriz. Gerçek uygulamayı değil, soyutlamalara programlama olarak bilinen bir modeli takip eder.

Özet anahtar sözcüğüyle başlayan sınıf, hem soyut hem de soyut olmayan yöntemler içerebilir. Ancak soyut sınıfta çoklu miras desteklenmez. Yani en fazla bir soyut sınıfı genişletebilirsiniz.

Tekil Nesneler

Singleton, bir programda yalnızca bir kez başlatılan bir sınıftır. Bu, “tekli model” olarak bilinen popüler ve kullanışlı bir programlama modelindendir. Uzun ömürlü olması amaçlanan ve durumu bir sistemin olaylarını koordine etmenin ayrılmaz bir parçası olan, programınız boyunca yaygın olarak erişilecek olan örneklerin oluşturulmasında faydalıdır. Scala'da böyle bir sınıf oluşturmak kolaydır çünkü Scala bize object anahtar sözcüğünü kullanarak singleton oluşturmanın basit bir yolunu sağlar.

object UserProfile{
    var userName=""
    var isLoggedIn:Boolean = false
}

Daha sonra programımızın tüm bölümlerinin aynı verileri göreceğini garanti ederek programımız boyunca bu nesneye referans verebiliriz çünkü bunun yalnızca bir örneği vardır.

def getLoggedInStatus():Boolean={
   return UserProfile.isLoggedIn
}

def changeLoggedInStatus():Boolean={
    UserProfile.isLoggedIn = !UserProfile.isLoggedIn
    return  UserProfile.isLoggedIn
}

Statik üye kavramı Scala'da yoktur, bu nedenle bir sınıfın statik üyeleri gibi davranan tekil nesneleri kullanmanız gerekir.

Örtülü Sınıflar

Örtülü sınıflar, sürüm 2.1'den sonra eklenen yeni işlevlerdir. Öncelikle kapalı sınıflara yeni işlevler eklemektir.

Örtülü anahtar kelime bir sınıf, nesne veya özellikte tanımlanmalıdır. Örtük bir sınıfın birincil kurucusunun ilk parametre listesinde tam olarak bir argümanı olmalıdır. Ayrıca ek bir örtülü parametre listesi de içerebilir.

Aşağıdaki Scala örneğinde, bir String'in sesli harflerini * ile değiştirmeye yönelik yeni işlevsellik eklenmiştir.

object StringUtil {
  implicit class StringEnhancer(str: String) {
    
    def replaceVowelWithStar: String = str.replaceAll("[aeiou]", "*")
  }
}

Kullandığınız sınıfa aktarmanız gerekir.

import StringUtil.StringEnhancer

object ImplicitEx extends App {
  val msg = "This is Guru99!"
  println(msg.replaceVowelWithStar)
}

Nesneye Yönelik Programlama (OOP) ve İşlevsel Programlama (FP)

OOP'ta programlar, verileri ve bu veriler üzerinde çalışan işlevleri yüksek düzeyde bağlantılı birimler halinde gruplandırarak oluşturulur. Nesneler verilerini üzerlerinde çalışan alanlar ve yöntemler içerisinde taşırlar. Bu programlama tarzında, oluşturulan yöntemlerin veriler üzerinde çalışması amaçlandığından ana soyutlama verilerdir.

Fonksiyonel programlama, ise verileri ve veriler üzerinde çalışan işlevleri ayırır. Bu, geliştiricilerin programları modellerken işlevleri soyutlama ve itici güç olarak ele almasına olanak tanır.

Scala, fonksiyonları birinci sınıf vatandaşlar olarak bulundurarak fonksiyonel programlamayı mümkün kılar, bunların diğer fonksiyonlara değer olarak geçirilmesine ve değer olarak geri döndürülmesine izin verir. Bu iki paradigmanın birleşimi, Scala'yı Veri Bilimi gibi çeşitli sektörlerde karmaşık yazılımlar oluşturmada harika bir seçim haline getirmiştir.

Scala'daki önemli çerçeveler

Scala'nın bazı önemli çerçevelerini burada bulabilirsiniz

  • OYNA kullanan açık kaynaklı bir web uygulama çerçevesidir. MVC mimarisi. 2007 yılında piyasaya sürülen ve şu anda Apache altında lisanslanan, 2013 yılında GitHub üzerinde en popüler framework haline geldi. LinkedIn, Walmart, Samsung, Eero gibi şirketler bu frameworkü kullanıyor.
  • asansör 2007'de başlatılan Scala'da yazılmış başka bir ücretsiz web çerçevesidir. Foursquare, Lift çerçevesini kullanır. Yüksek performanslıdır, çerçeve oluşturmak daha hızlıdır.
  • Akça
  • Kediler
  • Spark

Eşzamanlılık desteği

  • Scala'daki değerler varsayılan olarak değişmezdir. Bu, onu eşzamanlı ortama çok uyumlu hale getirir.
  • Scala'da eşzamanlı uygulamalar için onu en iyi yapan birçok özellik vardır.
  • Futures ve Promises, verilerin asenkron olarak işlenmesini kolaylaştırır ve dolayısıyla paralelliği destekler.
  • Akka – Aktör eşzamanlılık modelini kullanan araç seti. Mesaj aldıklarında harekete geçen çok sayıda Aktör vardır.
  • İş parçacıklarını kullanarak eşzamanlılık Java Scala'da da desteklenebilir.
  • Akış işleme, verilerin sürekli, gerçek zamanlı işlenmesini sağlayan bir başka harika özelliktir.

Scala dünyadaki en iyi eşzamanlılık kitaplıklarından bazılarına sahiptir. Java ekosistem.

  • Yerli Java Konuları
  • Vertex gibi kütüphanelerden alınan lifler
  • ZIO – eşzamanlılık ve eşzamansız hesaplamayla başa çıkmamıza yardımcı olacak ilkel öğelere sahip bir kütüphane
  • STM – İşlem
  • Gelecek - Scala dilinde yerleşik

Java Scala'ya karşı

İşte ana arasındaki fark Java ve Scala.

Scala Java
Daha kompakt ve özlü Nispeten daha büyük kod parçaları
Hem nesne hem de işlevsel odaklı bir dil olacak şekilde tasarlandı ve geliştirildi.
Eşzamanlılık, Değişmezlik gibi çok çeşitli işlevsel programlama özelliklerini destekler.
Başlangıçta nesne yönelimli bir dil olarak geliştirildi ve son günlerde işlevsel programlama özelliklerini desteklemeye başladı. Hala işlevsel bir programlama dili olarak güçlü değil.
Eşzamanlılığı desteklemek için modern olan aktör modelini kullanır Eşzamanlılık için geleneksel iş parçacığı tabanlı modeli kullanır.
Çerçeveleri destekler – Oynat, Kaldır Spring'i, Kaseleri ve çok daha fazlasını destekler
Tembel değerlendirmeyi destekler Tembel değerlendirmeyi desteklemiyor
Statik üye yok Statik üyeler içerir
Operatörün aşırı yüklenmesini destekler Operatörün aşırı yüklenmesini desteklemez
Kaynak kodun derlenmesi nispeten yavaştır Kaynak kodun derlenmesi Scala'dan daha hızlıdır
Özellikler – gibi davran Java 8 arayüz Java 8 arayüz, sınıflar ve arayüzler arasındaki boşluğu doldurmaya çalışıyor
Yeniden yazmaya ihtiyaç var Yeniden yazmaya gerek yok
Hatasız kodların garantisi yok Daha az kusurun tam güvencesi
Geriye dönük uyumluluğu destekler. Scala geriye dönük uyumluluğu desteklemez.
OperaTorlara farklı davranılıyor Java ve yöntem çağrıları değildir. Girişlerdeki tüm operatörler Scala'da adı verilen bir yöntemle arlanır.
Sınıfları kullanarak birden fazla mirası destekler ancak soyut sınıfları desteklemez Sınıfları kullanarak birden fazla mirası desteklemez, ancak arayüzleri destekler
Kod kompakt bir biçimde yazılmıştır. Kod uzun biçimde yazılmıştır.
Scala statik anahtar kelimeyi içermiyor. Java static anahtar sözcüğünü içerir.

ÖZET

Bu eğitimde Scala'ya nasıl başlayacağınızı öğrendiniz. Ayrıca işlevsel ve nesneye yönelik özellikleri de öğrendiniz. Ayrıca aralarındaki benzerlikleri ve farklılıkları da keşfettiniz. Java ve Scala. Bu eğitimin, iyi bir şekilde kanıtlanmış çok çeşitli örneklerle size yardımcı olması gerekirdi.