Struct & Enum

Solidity'de Struct ve Enum veri yapıları, daha karmaşık verileri ve durumları saklamak için kullanılır. Bu yapılar, akıllı kontratların daha düzenli ve okunabilir olmasına yardımcı olur.

1. Struct

Struct, farklı veri tiplerini bir araya getirip tek bir yapı altında toplamak için kullanılır. Struct'lar, Solidity'de veriyi organize etmenin ve kompleks veri tiplerini yönetmenin güçlü bir yoludur.

struct Person {
    string name;
    uint age;
    address wallet;
}

Yukarıdaki örnekte Person adlı struct, bir kişinin adını (name), yaşını (age) ve cüzdan adresini (wallet) saklar.

Struct Kullanımı

Struct tanımladıktan sonra, bu yapıdan yeni veri oluşturabiliriz.

Person public person1 = Person("Alice", 30, 0x1234567890123456789012345678901234567890);

Bu kodda, person1 adında bir Person örneği oluşturulmuş ve bu örneğe Alice adında bir kişi atanmıştır.

Struct ile Fonksiyonlar

Struct'lar, fonksiyonlar içinde parametre olarak kullanılabilir veya fonksiyonlardan döndürülebilir.

function createPerson(string memory _name, uint _age, address _wallet) public returns (Person memory) {
    return Person(_name, _age, _wallet);
}

Bu fonksiyon, bir Person struct'ı oluşturur ve döndürür.

Struct'ları Depolama

Struct'lar, mapping ve array gibi veri yapıları içerisinde depolanabilir. Bu, Solidity'de veri tabanı gibi kullanılabilecek güçlü bir yapıdır.

mapping(uint => Person) public people;
uint public peopleCount;

function addPerson(string memory _name, uint _age, address _wallet) public {
    people[peopleCount] = Person(_name, _age, _wallet);
    peopleCount++;
}

Bu örnekte, people adlı bir mapping kullanarak birden fazla kişiyi saklayabilirsiniz.

2. Enum

Enum, bir dizi sabit değeri tanımlamak için kullanılır. Özellikle belirli bir durum veya seçenek seti varsa, enum kullanmak kodu daha okunabilir hale getirir.

enum Status { Pending, Shipped, Delivered, Canceled }

Bu enum, bir siparişin durumlarını saklamak için kullanılabilir: Pending, Shipped, Delivered, Canceled.

Enum Kullanımı

Enum tanımlandıktan sonra, bir değişken olarak kullanılabilir:

Status public currentStatus;

function setStatus(Status _status) public {
    currentStatus = _status;
}

Bu örnekte, currentStatus adlı bir enum değişkeni oluşturulmuş ve setStatus fonksiyonu ile bu durum ayarlanabilir.

Enum ile Koşullu Yapılar

Enum'lar, koşullu yapılarda kullanılarak belirli işlemler gerçekleştirilirken durumların kontrol edilmesini sağlar:

solidityKodu kopyalafunction shipOrder() public {
    require(currentStatus == Status.Pending, "Order cannot be shipped!");
    currentStatus = Status.Shipped;
}

Bu örnekte, shipOrder fonksiyonu yalnızca sipariş durumu Pending olduğunda çalışır ve durumu Shipped olarak günceller.

Örnek Uygulama

Aşağıda, hem Struct hem Mapping hem de Enum kullanılarak oluşturulmuş bir örnek kontrat bulunmaktadır:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract StructEnumExample {
    // Enum tanımı
    enum Status { Pending, Shipped, Delivered, Canceled }
    
    // Struct tanımı
    struct Order {
        uint id;
        string item;
        uint quantity;
        Status status;
    }
    
    // Mapping ile siparişleri saklama
    mapping(uint => Order) public orders;
    uint public orderCount;

    // Yeni bir sipariş ekleme fonksiyonu
    function createOrder(string memory _item, uint _quantity) public {
        orders[orderCount] = Order(orderCount, _item, _quantity, Status.Pending);
        orderCount++;
    }
    
    // Sipariş durumunu güncelleme fonksiyonu
    function updateOrderStatus(uint _orderId, Status _status) public {
        Order storage order = orders[_orderId];
        order.status = _status;
    }

    // Siparişin mevcut durumunu kontrol etme fonksiyonu
    function getOrderStatus(uint _orderId) public view returns (Status) {
        return orders[_orderId].status;
    }
}

Bu örnekte, StructEnumExample adlı kontrat, siparişleri takip etmek için Order struct'ını ve sipariş durumlarını izlemek için Status enum'ını kullanır. Yeni siparişler eklenebilir, durumları güncellenebilir ve mevcut durumu kontrol edilebilir.

Last updated