Solidity'de Sınıflar (Structs) Nedir?

Solidity'de Sınıflar (Structs) Nedir?

Merhabalar. Nesne tabanlı programlamada karşımıza çıkan sınıf (class) yapısının Solidity dilindeki karşılığı olan yapıları (structs) bu yazımızda ele alacağım.

Struct Nedir?

Yapı (struct); yeni objeler oluşturmak için tasarlanan, değişkenlerden meydana gelen ve tekrar tekrar kullanılabilecek sınıflardır. Yapılar (structs), nesneye yönelik programlama dillerindeki sınıflarla (classes) benzer işleve sahiptir. Diğer dillerde class olarak isimlendirilen sınıflar Solidity'de struct olarak isimlendirilir.

struct Yazım Şekli

// Oyuncu isminde bir obje taslağı (struct) oluşturduk.
struct Oyuncu {
    uint id;
    string isim;
    string soyisim;
    string kullanici_adi;
    string eposta;
    uint seviye;
}

struct Özellikleri

  • Sözleşmelerin içerisinde veya dışarısında tanımlanabilirler. Sözleşme dışında tanımlanan yapılar (structs) farklı kontratlar tarafından kullanılabilir.
  • Yapılar (structs), referans tipindeki verilerdir. (ayr. bkz.)
  • Yapı türleri (struct types), adreslemeler (mappings) ve diziler (arrays) içinde kullanılabilir ve kendileri adreslemeler (mappings) ve diziler (arrays) içerebilir. [1]
  • Struct içinde adresleme (mapping) varsa bu yapı fonksiyon içerisinde storage veri konumunda tutulmalıdır.
  • Yapılarda değişiklik yapmak için yerel değişkene tanımlama yapılabilir. Yanı sıra oyuncuListesi[_oyuncuId].seviye = 3 örneğindeki gibi yapılara (struct) direkt olarak müdahale edilebilir.
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.6.0 <0.9.0;


// Oyuncu isminde bir obje taslağı (struct) oluşturduk.
struct Oyuncu {
    uint id;
    string isim;
    string soyisim;
    string kullanici_adi;
    string eposta;
    uint seviye;
}


contract OyuncuSozlesmesi{
    // Oyuncu listesini tutmak için adresleme (mapping) yaptık.
    mapping (uint => Oyuncu) oyuncuListesi;


    function oyuncuEkle(string calldata _oyuncu_adi, uint _oyuncuId) public {
        // Oyuncu listesinden id'ye göre oyuncu seçtik.
        Oyuncu storage oyn = oyuncuListesi[_oyuncuId];


        // Oyuncunun ismi ve levelini değiştirdik.
        oyn.isim = _oyuncu_adi;
        oyn.seviye = oyn.seviye + 1;


        // Id'ye göre seçilen oyuncu üzerinde direkt değişiklik de yapılabilir.
        oyuncuListesi[_oyuncuId].seviye = 3


  

Ek olarak, Solidity dökümanlarında verilen örneği inceleyelim.

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.6.0 <0.9.0;


// İki değişkenli yeni bir yapı (struct) tanımladık.
// Sözleşme dışında struct tanımlanabilir. Bunlar farklı sözleşmelerde kullanılabilir.
struct Funder {
    address addr;
    uint amount;
}


contract CrowdFunding {
    // Sözleşme içinde de yapı (struct) tanımlanabilir.
    // Bu yapılar sözleşme içerisinde ve türetilmiş (derived) sözleşmelerde kullanılabilir.
    struct Campaign {
        address payable beneficiary;
        uint fundingGoal;
        uint numFunders;
        uint amount;
        mapping (uint => Funder) funders;
    }


    uint numCampaigns;
    mapping (uint => Campaign) campaigns;


    function newCampaign(address payable beneficiary, uint goal) public returns (uint campaignID) {
        campaignID = numCampaigns++; // campaignID dönüş değişkenidir.
        // Campaing yapısı mapping (adresleme) içerdiği için "campaigns[campaignID] = Campaign(beneficiary, goal, 0, 0)" şeklindeki kullanım hata verir.
        Campaign storage c = campaigns[campaignID];
        c.beneficiary = beneficiary;
        c.fundingGoal = goal;


        // Örnekteki kullanım sorusunz şekilde çalışacaktır. (memory konumuna dikkat!)
        // Funder memory ffff = Funder({addr: msg.sender, amount: 2});
    }


    function contribute(uint campaignID) public payable {
        Campaign storage c = campaigns[campaignID];
        // Verilen değerlerle başlatılan yeni bir geçici bellek (temporary memory) yapısı oluşturur ve bunu depoya (storage) kopyalar.
        // Funder(msg.sender, msg.value) ilk tanımlama için kullanılabilir..
        c.funders[c.numFunders++] = Funder({addr: msg.sender, amount: msg.value});
        c.amount += msg.value;
    }


    function checkGoalReached(uint campaignID) public returns (bool reached) {
        Campaign storage c = campaigns[campaignID];
        if (c.amount < c.fundingGoal)
            return false;
        uint amount = c.amount;
        c.amount = 0;
        c.beneficiary.transfer(amount);
        return true;
 

Bu yazımda Solidity dilindeki yapıların (struct) ne olduğu ayrıntılı olarak ele almaya gayret ettim. Umarım faydalı olmuştur. Bir sorunuz olursa bana ulaşabilirsiniz. İyi kodlamalar.

Yorumunu Bırak

Çok hızlısın. Biraz dinlendikten sonra tekrar devam edebilirsin.
Bugünlük gönderebileceğin kadar yorum gönderdin. Lütfen yarın tekrar dene.
Mesajınız bize başarılı bir şekilde ulaştırıldı. Teşekkürler.

Yorumlar

0 Yorum yok

Henüz yorum yapılmamış. İlk yorum yapan sen ol.

Blog Yazarı

Ömer Faruk Coşkun
Yazar
@ofcskn

İstanbul Üniversitesi Bilgisayar Mühendisliği Öğrencisi