Kotlin #3 | Obje Odaklı Programlama

Ego1st

Uzman üye
15 Mar 2018
1,109
25

Kotlin #3 | Obje Odaklı Programlama

İçerik
Nesne Tabanlı Programlama Nedir?
Kotlin Nesne Tabanlı Programlama Giriş
Terimler
Örnekler


1- Nesne Tabanlı Programlama Nedir?

Nesne tabanlı programlama ya da diğer ismiyle "Obje Odaklı Programlama" Soyut veya somut her türlü kavramın nesneleştirilerek kodlamada kullanılmasına denir. Nesne tabanlı programlamanın tarihi çok eskilere dayanmaktadır ve günümüz için "yaşlı" sayılabilecek diller tarafından hem de yeni popülerleşmeye başlayan diller tarafından da desteklenmektedir(Bkz. Kotlin).

Nesne tabanlı programlamayı kullanmak kodun verimine ve kodlamanın kolaylaşmasına büyük önemde katkı sağlar.

Peki nesne tabanlı programlama dilini neden kullanırız?
Örneğin bir okul sınıfımız olsun ve bu sınıfta öğrencilerimiz var ve öğrencilerimizin bazı özelliklerini tutmak istiyoruz. Örneğin Adı ve Yaşı olsun bu örneğimizde. Nesne tabanlı programlamayı destekleyen bir dil kullanıyorsak öğrenci objesi oluşturup içindeki özellikleri belirterek bu işlemi kolayca yapabiliriz.

Örneğimizi biraz daha ilerletelim. Diyelim ki öğrencilerimize not ataması yapmamız gerekiyor bunun için kodumuzda ekstra olarak bir method / fonksiyon belirtmemize gerek yok. Oluşturduğumuz sınıfın / nesnenin içine not atama fonksiyonunu tanımlayarak her yerden erişilebilir bir hale getirebiliriz.

Nesne tabanlı programlamanın başka bir güzel yanı ise private ve public olarak tanımlamalardır.
private ve public tanımlamalar ne işe yarar?
private: Türkçe manasıyla gizli anlamına gelir ve adından da anlaşılacağı üzere sınıfı gizli tutar. Nesnemizi private olarak tanımlarsak başka sınıflardan erişilmesini engelleyebiliriz. Çoğu programlama dilinde bir sınıf tanımlandığında private olarak oluşur
public ise açık anlamına gelir dolayısıyla nesnemiz başka sınıf / nesnelerden erişilebilir duruma gelir.​

2- Kotlin Nesne Tabanlı Programlama Giriş
Kotlin'de kodlarımızı yazmadan önce bilmemiz gereken bazı OOP terimlerimiz var. Bunlar;
Abstraction, Inheritance, Encapsulation ve Polymorphism

Abstraction (Soyutlama / Soyut Hale Getirme) Nedir?

Abstract bir sınıfı o sınıftan obje oluşturulamaz hala getirmektir. Dilden dile tanımlamaları değişir ama Kotlin örneği için class'ın başına abstract yazmak yeterlidir. Abstract sınıflarda methodların body'si bulunabilir yani abstract metodlar olmak zorunda değillerdir.
Peki neden Abstract sınıflara ihtiyaç duyarız?
Başka sınıflara dahil etmek (Extends) için. Evet şu an garip duruyor ama açıklayayım.

Diyelim ki bir abstract class yazdık ve içinde toplama işlemi yapıyor. Biz bu sınıfı başka sınıflara dahil ederek her yerde toplama işlemini ayrı ayrı yerlerde tanımlamak yerine bulunduğumuz sınıflara dahil ederek otomatik olarak tanımlanmasını sağlarız. Mesela bir A fonksiyonumuz olsun bu fonksiyon öyle işlevsel ki daha önce yazdığımız bütün objelerde kullanabiliyor olalım. Yazdığımız bütün sınıflarda bu A fonksiyonunu tanımlamak yerine sınıflarımıza abstract class'ımızı implement ederek A işlevimizi yerine getirebiliriz.​

Örnek Kullanım;

People adında bir abstract sınıf oluşturalım;

Kod:
package com.ego1st.kotlinoop.abstractclasses

abstract class People {

    fun info(): String{
        return "I'm human"
    }
}

Daha sonra User adında bir sınıf oluşturalım;

User adında bir sınıf;

Kod:
package com.ego1st.kotlinoop.classes

import com.ego1st.kotlinoop.abstractclasses.People

class User: People {

    //property özellikleri
    var name: String? = null
    var age: Int? = null

    constructor(name: String?, age: Int?) {
        this.name = name
        this.age = age
        println("user created")
    }

    init {
        println("init")
    }
}

Interface (Arayüz) Nedir?

Abstract sınıflar soyut sınıflar demiştik Interfaceler de aynı onlar gibi ama tamamen soyut sınıflardır. Bunu söyleyerek ne demek istiyorum?

Interface'lerde sadece abstract metodlar olabilir yani metodların body dediğimiz gövdesi olamaz. Peki neden Interface kullanalım?

Interface'ler sayesinde o interface'yi uygulayarak (Implement) çoklu kalıtım yapabiliriz.

Interface ile Abstract arasındaki en belirgin fark Abstract sınıflarda extends yani dahil ettiğimiz için metodları override etmemize gerek kalmıyor. Bunun bir sebebi de interface'lere nazaran metod'ların içi boş olmuyor. Interface'lerde ise implement ettiğimiz yani uyguladığımız için bütün abstract metodlar'ı override etmemiz gerekiyor.

Şimdi birkaç interface ile örneklendirelim;

HouseDecor adında bir interface oluşturalım;

Kod:
package com.ego1st.kotlinoop.interfaces

interface HouseDecor {

    var roomName:String
}

Instrument adında bir interface oluşturalım;

Kod:
package com.ego1st.kotlinoop.interfaces

interface Instrument {

    fun information(){
        println("Instrument Info")
    }
}

Daha sonra bu interfaceleri uygulamak için bir örnek sınıf oluşturalım;

Piano adında bir sınıf oluşturuyoruz;

Kod:
package com.ego1st.kotlinoop.classes

import com.ego1st.kotlinoop.interfaces.HouseDecor
import com.ego1st.kotlinoop.interfaces.Instrument

class Piano : HouseDecor, Instrument {
    var brand: String? = null
    var digital: Boolean? = null

    override var roomName: String
        get() = "Kitchen"
        set(value){}
}

Inheritance Nedir?
Inheritance bir sınıfın diğer sınıfın özelliklerine(metod, üyeler) olarak tanımlanabilir. Inheritance Java'da 'extends' şeklinde tanımlanırkan Kotlin'de bu ':' şeklindedir.

Inheritance'ı örneklerle açıklayalım;

Musician adında bir sınıf oluşturalım;

Kod:
package com.ego1st.kotlinoop.classes.musicians

open class Musician(name: String, instrument: String, age: Int) {

    private var name: String? = name

    var instrument: String? = instrument

    var age: Int? = age
        private set
        get

    fun returnName(): String? {
        return name
    }
}

SuperMusicians adında Musician'a extend edebileceğimiz bir sınıf oluşturalım;

Kod:
package com.ego1st.kotlinoop.classes.musicians

import com.ego1st.kotlinoop.classes.musicians.Musician

class SuperMusicians(name: String, instrument: String, age: Int) : Musician(name, instrument, age) {

    fun sing(){
        println("Tamam aga şekil saatin araban evin falan, ama ben özgürüm sen emir alan!")
    }
}

Gördüğünüz gibi implement ettiğimiz zaman kodları override edip uygulamamız gerekiyor

Encapsulation (Kaplama) Nedir?

Türkçede tam olarak doğru bir karşılığı olmasa da genel olarak sarmalama ve kaplama anlamına gelir.
Encapsulation yukarıda da biraz değindiğim gibi objelerimizin başka sınıflardan erişilip erişilememesinin belirlenmesini sağlayan olan bir özelliktir.

Private: Sınıfa özel nesnedir.
Kod:
Public: Herkese açık olan nesnedir.
Kod:
public
Protected: Aynı sınıftakilere ve Extend(Dahil edilenlere) açık olan nesnedir.
Kod:
protected
ve Default (No Modifier): Hiçbir şey belirtilmesse aynı sınıftakilerin erişebildiği nesnedir.


Final: Bir kere değer ataması yapılır, bir daha değiştirilemez.
Statik: Eğer değişkenin nesneden değil de sınıftan türetilmesini istiyorsak bunu kullanırız.​

Encapsulation Örnek;

Polymorphsim (Çok Biçimlilik) Nedir?

Bir nesne veya metodun birden fazla, farklı biçimlerde kullanılmasına denir. Genelde bir metodun farklı nesnelerden aynı isimle çağrılıp farklı işlemler yapmasını istediğimizde kullanırız.

Static Polymorphism çok biçimliliğin aynı sınıf içinde kullanılmasıyken Dynamic Polymorphism ise çok biçimliliğin birden fazla sınıflarda kullanılmasına denir.

Static Polymorphism Örnek;

Math adında bir sınıf oluşturuyoruz;

Kod:
package com.ego1st.kotlinoop.classes

class Math {

    fun sum(): Int{

        return 0
    }

    fun sum(x: Int, y: Int): Int{
        return x + y
    }

    fun sum(x: Int, y: Int, z:Int): Int{
        return x + y + z
    }
}

Dynamic Polymorphism Örnek;

Animal adında bir sınıf oluşturuyoruz;

Kod:
package com.ego1st.kotlinoop.classes.animals

open class Animal {

    open fun sing(){
        println("animal class")
    }
}

Dog adında bir sınıf oluşturuyoruz;

Kod:
package com.ego1st.kotlinoop.classes.animals

class Dog: Animal() {

    fun test(){
        super.sing()
    }

    override fun sing(){
        println("dog class")
    }
}

3- Örnekler

Bir de Lambda Expression nedir ondan bahsedelim.

Lambda gösterimi ya da kısaca lambda isimsiz fonksiyonlardır. Bunlar ifade olarak tanımlanırlar ve bildirilmeye ihtiyaç duymazlar.

Öncelikle örneklerimizde kullanacağımız örnek sınıfların hepsini tanımlayalım

Şimdi yaptığımız bütün örnekleri uygulayalım

Kod:
fun main() {

        println("-----------ENCAPSULATION----------")

        var myMusician = Musician("Lars", "Electric Guitar", 100)
        //myMusician.age = 10
        println(myMusician.age.toString())

        //  | Burada age'i alabiliyoruz ama set edemiyoruz bu özellikleri Musician sınıfında belirtmiştik.

        println("------------INHERITANCE-------------")

        var bart = SuperMusicians("Bart", "Piano", 34)
        println(bart.returnName())
        println(bart.instrument)
        bart.sing()

        println("-------------STATIC POLYMORPHISM---------------------")
        var mathematics = Math()
        println(mathematics.sum())
        println(mathematics.sum(3, 4))
        println(mathematics.sum(3, 4, 5))

        println("--------------DYNAMIC POLYMORPHISM-----------------")
        var animal = Animal()
        animal.sing()

        var chedar = Dog()
        chedar.test()
        chedar.sing()

        println("------------ABSTRACT-----------")
        var myUser = User("Sheldon Cooper", 47)

        println(myUser.name)
        println(myUser.age.toString())
        println(myUser.info())

        println("------------INTERFACE-----------")
        var piano = Piano()
        piano.brand = "Yamaha"
        piano.digital = false
        println(piano.roomName)
        piano.information()


        println("--------------LAMBDA EXPRESSION----------")
        val testString = {input: String -> println(input)}
        testString("test")

        val multiplyLambda = {x: Int, y:Int -> println(x * y)}
        multiplyLambda(999999999, 999999999)

        val multiplyLambda2: (Int, Int) -> Int = {a,b -> a * b}
        println(multiplyLambda2(13, 13))

        val user: User = User("Alpha", 24)
        fun downloadData(url: String, completion : (User) -> Unit){
            //url -> download
            completion(user)
        }

        downloadData("turkhackteam.org", {user ->
            println(user.name)
        })
}
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.