1. Anasayfa
  2. 100 Günde Solidity

🧵 #100GündeSolidity 014 : Enum

🧵 #100GündeSolidity 014 : Enum
Enum
0

Enum Kullanarak Durum Takibi ve Seçenek Modellenmesi

#100GündeSolidity serisinin 14. gününde “Enum” üzerine konuşacağız. Haydi bugün hangi konulara değineceğimizi listeleyelim.

Enum, Solidity dilinde tanımlanabilecek değişken tiplerinden biridir ve seçenek modellenmesi ve durum takibinde çok yararlıdır. Enumlar, bir kontrat dışında tanımlanabilir. Bu yazıda, Solidity 0.8.0 sürümünde nasıl kullanılacağını ve örnek kodlar ile birlikte anlatacağız. Öncelikle Enum nedir ve nasıl tanımlanır öğreneceğiz, daha sonra Enum ile fonksiyonlar, yapılar ve kontratlar arasındaki kullanım örneklerine değineceğiz. Ayrıca Enum ile yapılan durum takibinde ve seçenek modellenmesinde dikkat edilmesi gereken noktaları da ele alacağız.

Enum Nedir?

Enum, Solidity dilinde, belirli bir aralıkta olan değerleri tanımlayan bir veri tipidir. Enum, bir dizi değer içeren bir değişken türüdür ve her değer için bir adlandırma işlemi yapılır. Enumlar, bir kontrat dışında tanımlanabilir ve daha sonra kontrat içerisinde kullanılabilir. Enumlar, bir dizi değer arasından seçim yapmak için kullanılabilir ve bu değerleri belirli bir şekilde etiketlemek için de kullanılabilir. Örneğin, bir oyun içerisinde oyuncunun durumunu (online, offline, away vb.) veya bir siparişin durumunu (beklemede, hazırlandı, teslim edildi vb.) tanımlamak için kullanılabilir.

Enum Kullanımı

Enum, Solidity dilinde aşağıdaki şekilde tanımlanır:

enum EnumName {
  EnumValue1,
  EnumValue2,
  EnumValue3,
  ...
}

Bu örnekte, EnumName adında bir Enum tanımlanmıştır ve içerisinde EnumValue1, EnumValue2, EnumValue3 gibi değerler barındırmaktadır. Bu değerler, Enum içerisinde kullanılmak üzere tanımlanmıştır ve bu değerlere ait etiketlerdir.

Enum değerleri, kontrat içerisinde değişken olarak tanımlanabilir :

enum EnumName {
  EnumValue1,
  EnumValue2,
  EnumValue3,
  ...
}
EnumName public state;

Bu şekilde state adında bir Enum değişkeni tanımlanmıştır ve EnumName Enum tipindedir. Bu değişken için EnumName içerisindeki değerlerden herhangi birini atayabiliriz.

Enum değerleri kullanmak için aşağıdaki gibi kullanabiliriz:

state = EnumName.EnumValue1;

Bu şekilde state değişkeni için EnumValue1 değeri atanmış olur.

Ayrıca Enum değerleri için fonksiyonlar yazabiliriz, örneğin:

function setState(EnumName _newState) public {
    state = _newState;
}

Bu fonksiyon ile state değişkeni için EnumName Enum tipindeki herhangi bir değer atanabilir.

Enum Örnekleri

Enum örnekleri aşağıdaki gibi olabilir:

  1. Oyun içerisinde oyuncunun durumunu tanımlamak için:
enum PlayerStatus {
    Online,
    Offline,
    Away
}
PlayerStatus public player1;

Bu örnekte, PlayerStatus adında bir Enum tanımlanmıştır ve içerisinde Online, Offline, Away gibi oyuncunun durumlarını tanımlayan değerler barındırmaktadır. player1 adında bir değişken tanımlanmıştır ve PlayerStatus Enum tipindedir. Bu değişken için PlayerStatus içerisindeki değerlerden herhangi birini atayabiliriz.

  1. Bir siparişin durumunu tanımlamak için:
enum OrderStatus {
    Waiting,
    Preparing,
    Delivered
}
OrderStatus public order;

Bu örnekte, OrderStatus adında bir Enum tanımlanmıştır ve içerisinde Waiting, Preparing, Delivered gibi siparişin durumlarını tanımlayan değerler barındırmaktadır. order adında bir değişken tanımlanmıştır ve OrderStatus Enum tipindedir. Bu değişken için OrderStatus içerisindeki değerlerden herhangi birini atayabiliriz.

Bu örnekler sadece birkaç fikir vermek amacı ile verilmiştir, Enum’lar çok daha fazla kullanım alanına sahiptir. Örneklerde gördüğünüz gibi Enumlar, durumları veya seçenekleri tanımlamak için kullanılabilir ve bu tanımları yaparken daha okunaklı ve anlaşılır kodlar oluşturmanızı sağlar.

Enum ile Fonksiyonlar Kullanımı

Enum ile fonksiyonlar arasında birçok kullanım alanı vardır. Enum değerleri, fonksiyonlar içinde kullanılarak işlem yapılmasını sağlayabilir. Örneğin, bir siparişin durumunu değiştirmek için aşağıdaki gibi bir fonksiyon yazabilirsiniz:

enum OrderStatus {
    Waiting,
    Preparing,
    Delivered
}
OrderStatus public order;

function changeOrderStatus(OrderStatus _newStatus) public {
    require(_newStatus != order); // ensure status change
    order = _newStatus;
}

Bu fonksiyon ile order değişkeni için OrderStatus Enum tipindeki herhangi bir değer atanabilir. Ayrıca fonksiyon içinde require ile _newStatus değişkeni ile order değişkeninin farklı olmasının kontrol edilmesi sağlanmıştır. Bu sayede aynı duruma geri dönülmüşse hata verilir.

Ayrıca Enum değerleri kullanarak fonksiyonlar arası geçiş yapabiliriz. Örneğin :

enum GameStatus {
    Start,
    Play,
    End
}
GameStatus public game;

function startGame() public {
    require(game == GameStatus.Start);
    game = GameStatus.Play;
}

function endGame() public {
    require(game == GameStatus.Play);
    game = GameStatus.End;
}

Bu örnekte, oyunun başlaması için startGame fonksiyonunun çalışması gerekir. Bu fonksiyonun çalışması sonrası oyun GameStatus.Play durumuna geçer. Aynı şekilde oyunun bitmesi için endGame fonksiyonunun çalışması gerekir ve bu fonksiyonun çalışması sonrası oyun GameStatus.End durumuna geçer.

Enum değerleri ile fonksiyonlar arasında bu şekilde birçok kullanım alanı vardır ve Enumlar ile daha okunaklı ve anlaşılır kodlar yazmanızı sağlar.

Enum ile Yapılar (Struct) Kullanımı

Enum ile yapılar (Struct) arasında da birçok kullanım alanı vardır. Örneğin, bir siparişin detaylarını tutan bir yapı oluşturalım:

enum OrderStatus {
    Waiting,
    Preparing,
    Delivered
}

struct Order {
    address customer;
    uint256 amount;
    OrderStatus status;
}

mapping(address => Order) public orders;

Bu örnekte, Order adında bir yapı tanımlanmıştır ve siparişler için customer adresi, amount tutarı ve status durumu değerlerini içermektedir. OrderStatus adında bir Enum tanımlanmıştır ve siparişlerin durumlarını tanımlamak için kullanılır. Ayrıca orders adında bir mapping tanımlanmıştır ve bu mapping içerisinde müşteri adreslerine göre siparişler tutulmaktadır.

Bu örnekte Enum ile yapılar arasında kullanım örneği verilmiştir. Enumlar ile yapılar arasında kullanımın avantajlarından biri de, yapı içerisinde belirli bir aralıkta olan değerleri tanımlamak için kullanılmasıdır. Bu sayede yapı içerisinde tanımlanan değerler arasından seçim yapmak veya bu değerleri belirli bir şekilde etiketlemek için kullanılabilir.

Enum ile Kontratlar Kullanımı

Enum ile kontratlar arasında da birçok kullanım alanı vardır. Örneğin, bir oyun kontratı oluşturalım ve oyunun durumunu tanımlamak için Enum kullanalım:

enum GameStatus {
    Waiting,
    Playing,
    End
}

contract Game {
    GameStatus public gameStatus;

    function startGame() public {
        require(gameStatus == GameStatus.Waiting);
        gameStatus = GameStatus.Playing;
    }

    function endGame() public {
        require(gameStatus == GameStatus.Playing);
        gameStatus = GameStatus.End;
    }
}

Bu örnekte, Game adlı bir kontrat tanımlanmıştır ve içerisinde oyunun durumunu tanımlayan gameStatus adlı bir Enum değişkeni bulunmaktadır. Ayrıca kontrat içerisinde startGame ve endGame adlı iki fonksiyon tanımlanmıştır. Bu fonksiyonlar oyunun durumunu değiştirmek için kullanılır. Örneğin, startGame fonksiyonu oyunun başlaması için çağrılır ve gameStatus değişkeni GameStatus.Playing durumuna geçirilir. Aynı

şekilde, endGame fonksiyonu oyunun bitmesi için çağrılır ve gameStatus değişkeni GameStatus.End durumuna geçirilir.

Bu örnekte görüldüğü gibi Enum ile kontratlar arasında kullanımın avantajlarından biri de, kontrat içerisinde belirli bir aralıkta olan değerleri tanımlamak için kullanılmasıdır. Bu sayede kontrat içerisinde tanımlanan değerler arasından seçim yapmak veya bu değerleri belirli bir şekilde etiketlemek için kullanılabilir. Ayrıca Enumlar ile kontratlar arasında kullanımın diğer avantajlarından biri de, kontrat içerisinde yapılan işlemleri daha okunaklı ve anlaşılır hale getirmek için kullanılmasıdır.

Enum ile ABI (Application Binary Interface) Kullanımı

Enum, ABI (Application Binary Interface) ile ilişkili olarak da kullanılabilir. ABI, bir kontratın fonksiyonlarını ve değişkenlerini çağırmak için kullanılan arayüzdür. ABI, kontratın fonksiyonlarını ve değişkenlerini daha okunaklı ve anlaşılır hale getirmek için kullanılır.

Enum, ABI içerisinde kullanıldığında, Enum değerleri için kullanılan etiketler kullanılır. Örneğin, bir oyun kontratı oluşturalım ve oyunun durumunu tanımlamak için Enum kullanalım:

enum GameStatus {
    Waiting,
    Playing,
    End
}

contract Game {
    GameStatus public gameStatus;

    function startGame() public {
        require(gameStatus == GameStatus.Waiting);
        gameStatus = GameStatus.Playing;
    }

    function endGame() public {
        require(gameStatus == GameStatus.Playing);
        gameStatus = GameStatus.End;
    }
}

Bu örnekte, Game adlı kontrat tanımlanmıştır ve içerisinde oyunun durumunu tanımlayan gameStatus adlı bir Enum değişkeni bulunmaktadır. Bu kontratın ABI’si oluşturulduğunda, gameStatus değişkeni için Enum değerleri için kullanılan etiketler kullanılır. Örneğin, ABI içerisinde gameStatus değişkeni için Waiting, Playing, End gibi etiketler kullanılır. Bu sayede ABI içerisinde yapılan işlemler daha okunaklı ve anlaşılır hale gelir.

Ayrıca Enumlar ile ABI arasındaki kullanımın diğer avantajlarından biri de, ABI içerisinde belirli bir aralıkta olan değerleri tanımlamak için kullanılmasıdır. Bu sayede ABI içerisinde tanımlanan değerler arasından seçim yapmak veya bu değerleri belirli bir şekilde etiketlemek için kullanılabilir.

Enum ile Solidity Yapıları ile Çalışma

Enum ile Solidity yapıları arasında da birçok kullanım alanı vardır. Enumlar, Solidity yapıları içinde kullanılarak işlem yapılmasını sağlayabilir. Örneğin, bir oyuncunun bilgilerini tutan bir yapı oluşturalım:

enum PlayerType {
    Human,
    AI
}

struct Player {
    address playerAddress;
    string playerName;
    PlayerType playerType;
}

mapping(address => Player) public players;

Bu örnekte, Player adında bir yapı tanımlanmıştır ve oyuncunun bilgileri için playerAddress adresi, playerName ismi ve playerType tipi değerlerini içermektedir. PlayerType adında bir Enum tanımlanmıştır ve oyuncunun tipini tanımlamak için kullanılır. Ayrıca players adında bir mapping tanımlanmıştır ve bu mapping içerisinde oyuncu adreslerine göre oyuncu bilgileri tutulmaktadır.

Bu örnekte Enum ile Solidity yapıları arasında kullanım örneği verilmiştir. Enumlar ile yapılar arasında kullanımın avantajlarından biri de, yapı içerisinde belirli bir aralıkta olan değerleri tanımlamak için kullanılmasıdır. Bu sayede yapı içerisinde tanımlanan değerler arasından seçim yapmak veya bu değerleri belirli bir şekilde etiketlemek için kullanılabilir. Örneğin, oyuncunun tipini (Human veya AI) tanımlamak için kullanılabilir ve bu tip bilgisi oyuncunun bilgileri içinde saklanabilir. Ayrıca Enumlar ile yapılar arasında kullanımın diğer avantajlarından biri de, yapı içerisinde yapılan işlemleri daha okunaklı ve anlaşılır hale getirmek için kullanılmasıdır.

Enum ile Sınıflandırma ve Etiketleme

Enumlar, sınıflandırma ve etiketleme işlemleri için de kullanılabilir. Enumlar, belirli bir aralıkta olan değerleri tanımlamak için kullanılabilir ve bu değerler arasından seçim yapmak veya bu değerleri belirli bir şekilde etiketlemek için kullanılabilir. Örneğin, bir oyun kontratı oluşturalım ve oyunun durumunu tanımlamak için Enum kullanalım:

enum GameStatus {
    Waiting,
    Playing,
    End
}

Bu örnekte, GameStatus adlı bir Enum tanımlanmıştır ve oyunun durumunu tanımlamak için kullanılır. Bu Enum içerisinde oyunun durumlarını tanımlamak için Waiting, Playing, End gibi değerler bulunmaktadır. Bu sayede oyunun durumunu belirli bir şekilde etiketlemek ve oyunun durumu hakkında bilgi sahibi olmak için kullanılabilir.

Enumlar ile sınıflandırma ve etiketleme işlemleri arasındaki kullanımın diğer avantajlarından biri de, kodun daha okunaklı ve anlaşılır hale getirmek için kullanılmasıdır. Enumlar, belirli bir aralıkta olan değerleri tanımlamak için kullanıldığından, bu değerleri belirli bir şekilde etiketlemek veya seçim yapmak için kullanılabilir. Bu sayede kod içerisinde yapılan işlemler daha anlaşılır hale gelir.

Enum ile Debugging ve Hata Ayıklama

Enumlar, debugging ve hata ayıklama işlemleri için de kullanılabilir. Enumlar, belirli bir aralıkta olan değerleri tanımlamak için kullanılabilir ve bu değerler arasından seçim yapmak veya bu değerleri belirli bir şekilde etiketlemek için kullanılabilir. Örneğin, bir oyun kontratı oluşturalım ve oyunun durumunu tanımlamak için Enum kullanalım:

enum GameStatus {
    Waiting,
    Playing,
    End
}

contract Game {
    GameStatus public gameStatus;

    function startGame() public {
        require(gameStatus == GameStatus.Waiting);
        gameStatus = GameStatus.Playing;
    }

    function endGame() public {
        require(gameStatus == GameStatus.Playing);
        gameStatus = GameStatus.End;
    }
}

Bu örnekte, Game adlı bir kontrat tanımlanmıştır ve içerisinde oyunun durumunu tanımlayan gameStatus adlı bir Enum değişkeni bulunmaktadır. Bu kontratın fonksiyonları olan startGame() ve endGame() fonksiyonları

oyunun durumunu değiştirmek için kullanılır. Örneğin, startGame() fonksiyonu oyunun başlaması için çağrılır ve gameStatus değişkeni GameStatus.Playing durumuna geçirilir. Aynı şekilde, endGame() fonksiyonu oyunun bitmesi için çağrılır ve gameStatus değişkeni GameStatus.End durumuna geçirilir.

Bu örnekte görüldüğü gibi Enumlar ile debugging ve hata ayıklama işlemleri arasında kullanımın avantajlarından biri de, kontrat içerisinde tanımlanan değerler arasından seçim yapmak veya bu değerleri belirli bir şekilde etiketlemek için kullanılmasıdır. Bu sayede debugging ve hata ayıklama işlemleri için belirli bir aralıkta olan değerleri tanımlamak ve bu değerleri kontrol etmek için kullanılabilir. Ayrıca Enumlar ile debugging ve hata ayıklama işlemleri arasında kullanımın diğer avantajlarından biri de, kodun daha okunaklı ve anlaşılır hale getirmek için kullanılmasıdır.

Enum ile Optimizasyon ve Performans

Enumlar, optimizasyon ve performans işlemleri için de kullanılabilir. Enumlar, belirli bir aralıkta olan değerleri tanımlamak için kullanılabilir ve bu değerler arasından seçim yapmak veya bu değerleri belirli bir şekilde etiketlemek için kullanılabilir.

Enumlar, belirli bir aralıkta olan değerleri tanımlamak için kullanıldığından, bu değerleri belirli bir şekilde etiketlemek veya seçim yapmak için kullanılabilir. Bu sayede kod içerisinde yapılan işlemler daha anlaşılır hale gelir. Ayrıca Enumlar kullanımı ile kodun okunabilirliği artar ve bu sayede hata oranı azaltılabilir.

Enumların diğer bir avantajı ise, veri tipinin doğruluğunu kontrol etmek için kullanılabilir. Enumlar ile tanımlanmış değerler arasından sadece belirli değerlerin kabul edilmesi sağlanabilir. Bu sayede kod içerisinde hata oranı azaltılır ve performans arttırılır.

Ayrıca Enumlar için memory alanının daha az kullanılmasını sağlar. Enumlar, belirli bir aralıkta olan değerleri tanımlamak için kullanıldığından, bu değerler için memory alanına ihtiyaç duyulmaz. Bu sayede memory alanının daha az kullanılması sağlanır ve bu sayede performans arttırılır.

Sonuç olarak, Enumlar solidity içinde optimizasyon ve performans işlemleri için de kullanılabilir. Enumlar belirli bir aralıkta olan değerleri tanımlamak için kullanılabilir ve bu değerler arasından seçim yapmak veya bu değerleri belirli bir şekilde etiketlemek için kullanılabilir. Enumlar kullanımı ile kodun okunabilirliği artar ve bu sayede hata oranı azaltılabilir, memory alanının kullanımı azaltılabilir ve performans arttırılabilir.

Enum ile Güvenlik ve DoS (Denial of Service) koruması

Enumlar, güvenlik ve DoS (Denial of Service) koruması işlemleri için de kullanılabilir. Enumlar, belirli bir aralıkta olan değerleri tanımlamak için kullanılabilir ve bu değerler arasından seçim yapmak veya bu değerleri belirli bir şekilde etiketlemek için kullanılabilir.

Enumlar, kontrat içerisinde tanımlanan değerler arasından sadece belirli değerlerin kabul edilmesini sağlar. Bu sayede kontrat içerisinde geçersiz değerlerin kabul edilmemesi sağlanır ve bu sayede güvenlik zafiyetleri önlenir. Ayrıca Enumlar, sadece belirli değerlerin kabul edilmesi sayesinde DoS (Denial of Service) saldırılarına karşı kontratın korunmasını sağlar.

Örneğin, bir oyun kontratı oluşturalım ve oyunun durumunu tanımlamak için Enum kullanalım:

enum GameStatus {
    Waiting,
    Playing,
    End
}

contract Game {
    GameStatus public gameStatus;

    function setGameStatus(GameStatus _status) public {
        require(_status == GameStatus.Waiting || _status == GameStatus.Playing || _status == GameStatus.End);
        gameStatus = _status;
    }
}

Bu örnekte, setGameStatus fonksiyonu ile oyunun durumunu değiştirmek için çağrılır. Fonksiyon içerisinde require ile geçersiz değerlerin kabul edilmemesi sağlanır. Sadece Waiting,Playing,End değerleri kabul edilir. Bu sayede güvenlik zafiyetleri önlenir ve DoS saldırılarına karşı kontrat korunmuş olur.

Enum ile Testler ve Test Otomasyonu

Enumlar, testler ve test otomasyonu işlemleri için de kullanılabilir. Enumlar, belirli bir aralıkta olan değerleri tanımlamak için kullanılabilir ve bu değerler arasından seçim yapmak veya bu değerleri belirli bir şekilde etiketlemek için kullanılabilir.

Enumlar ile tanımlanmış değerler arasından sadece belirli değerlerin kabul edilmesi sağlandığından, test otomasyonu için değerler arasından seçim yapmak daha kolay hale gelir. Örneğin, bir oyun kontratı oluşturalım ve oyunun durumunu tanımlamak için Enum kullanalım:

enum GameStatus {
    Waiting,
    Playing,
    End
}

contract Game {
    GameStatus public gameStatus;

    function startGame() public {
        require(gameStatus == GameStatus.Waiting);
        gameStatus = GameStatus.Playing;
    }

    function endGame() public {
        require(gameStatus == GameStatus.Playing);
        gameStatus = GameStatus.End;
    }
}

Bu örnekte, startGame() ve endGame() fonksiyonları oyunun durumunu değiştirmek için kullanılır. Bu fonksiyonların test edilmesi için, Enum içerisinde tanımlanan değerler arasından Waiting,Playing,End seçilebilir. Bu say

ede testler için değerler arasından seçim yapmak daha kolay hale gelir ve test otomasyonu için Enumlar kullanmak daha verimli hale gelir.

Ayrıca Enumlar, testler için sadece belirli değerlerin kabul edilmesini sağlar. Bu sayede testlerde kontrat içerisinde geçersiz değerlerin kabul edilmemesi sağlanır ve bu sayede testlerin daha doğru sonuçlar vermesi sağlanır.

Sonuç olarak, Enumlar Solidity içinde testler ve test otomasyonu işlemleri için de kullanılabilir. Enumlar belirli bir aralıkta olan değerleri tanımlamak için kullanılabilir ve bu değerler arasından seçim yapmak veya bu değerleri belirli bir şekilde etiketlemek için kullanılabilir. Enumlar kullanımı ile testler için değerler arasından seçim yapmak daha kolay hale gelir ve test otomasyonu için Enumlar kullanmak daha verimli hale gelir.

Enum ile Yayın ve Deployment (Dağıtım)

Enumlar, yayın ve deployment (dağıtım) işlemleri için de kullanılabilir. Enumlar, belirli bir aralıkta olan değerleri tanımlamak için kullanılabilir ve bu değerler arasından seçim yapmak veya bu değerleri belirli bir şekilde etiketlemek için kullanılabilir.

Enumlar, kontrat içerisinde tanımlanan değerler arasından sadece belirli değerlerin kabul edilmesini sağlar. Bu sayede kontrat içerisinde geçersiz değerlerin kabul edilmemesi sağlanır ve bu sayede yayın ve deployment işlemlerinde hata oranı azaltılır.

Örneğin, bir oyun kontratı oluşturalım ve oyunun durumunu tanımlamak için Enum kullanalım:

enum GameStatus {
    Waiting,
    Playing,
    End
}

contract Game {
    GameStatus public gameStatus;

    function setGameStatus(GameStatus _status) public {
        require(_status == GameStatus.Waiting || _status == GameStatus.Playing || _status == GameStatus.End);
        gameStatus = _status;
    }
}

Bu örnekte, setGameStatus fonksiyonu ile oyunun durumunu değiştirmek için çağr

ılır. Fonksiyon içerisinde require ile geçersiz değerlerin kabul edilmemesi sağlanır. Sadece Waiting,Playing,End değerleri kabul edilir. Bu sayede yayın ve deployment işlemlerinde geçersiz değerlerin kabul edilmemesi sağlanır ve hata oranı azaltılır.

Ayrıca, Enumlar ile tanımlanmış değerler kontratın ABI’sinde (Application Binary Interface) görünür olduğu için, deployment sırasında bu değerlerin doğruluğunun kontrol edilmesi de mümkündür.

Sonuç olarak, Enumlar Solidity içinde yayın ve deployment işlemleri için de kullanılabilir. Enumlar belirli bir aralıkta olan değerleri tanımlamak için kullanılabilir ve bu değerler arasından seçim yapmak veya bu değerleri belirli bir şekilde etiketlemek için kullanılabilir. Enumlar kullanımı ile kontrat içerisinde geçersiz değerlerin kabul edilmemesi sağlanır ve hata oranı azaltılır. Ayrıca Enumlar ile tanımlanmış değerler kontratın ABI’sinde görünür olduğu için, deployment sırasında bu değerlerin doğruluğunun kontrol edilmesi de mümkündür. Bu sayede yayın ve deployment işlemleri daha güvenli ve hata azaltılmış hale gelir.

Enum ile fonksiyonlar arası geçiş yapma

Enumlar, fonksiyonlar arası geçiş yapmak için de kullanılabilir. Enumlar, belirli bir aralıkta olan değerleri tanımlamak için kullanılabilir ve bu değerler arasından seçim yapmak veya bu değerleri belirli bir şekilde etiketlemek için kullanılabilir.

Enumlar ile tanımlanmış değerler arasından sadece belirli değerlerin kabul edilmesi sağlandığından, fonksiyonlar arası geçiş yapmak için değerler arasından seçim yapmak daha kolay hale gelir. Örneğin, bir oyun kontratı oluşturalım ve oyunun durumunu tanımlamak için Enum kullanalım:

enum GameStatus {
    Waiting,
    Playing,
    End
}

contract Game {
    GameStatus public gameStatus;

    function startGame() public {
        require(gameStatus == GameStatus.Waiting);
        gameStatus = GameStatus.Playing;
    }

    function endGame() public {
        require(gameStatus == GameStatus.Playing);
        gameStatus = GameStatus.End;
    }
}

Bu örnekte, startGame() fonksiyonu oyunun durumunu Waiting‘den Playing‘e geçirmek için kullanılır. endGame() fonksiyonu ise oyunun durumunu Playing‘den End‘e geçirmek için kullanılır. Bu sayede fonksiyonlar arası geçiş yaparken sadece belirli değerler arasında geçiş yapılması sağlanmış olur.

Enum ile global değişkenler kullanımı

Enumlar, global değişkenler kullanımı için de kullanılabilir. Enumlar, belirli bir aralıkta olan değerleri tanımlamak için kullanılabilir ve bu değerler arasından seçim yapmak veya bu değerleri belirli bir şekilde etiketlemek için kullanılabilir.

Global değişkenler, kontrat içerisinde her yerde erişilebilen değişkenlerdir ve Enumlar ile tanımlanmış değerleri bu değişkenler içerisinde saklamak, kontrat içerisinde daha kolay erişim sağlar. Örneğin, bir oyun kontratı oluşturalım ve oyunun durumunu tanımlamak için Enum kullanalım:

enum GameStatus {
    Waiting,
    Playing,
    End
}

contract Game {
    GameStatus public gameStatus;

    function setGameStatus(GameStatus _status) public {
        require(_status == GameStatus.Waiting || _status == GameStatus.Playing || _status == GameStatus.End);
        gameStatus = _status;
    }
}

Bu örnekte, gameStatus global değişkeni oyunun durumunu saklar ve her yerde erişilebilir. Bu sayede kontrat içerisinde oyunun durumunun ne olduğu kolayca kontrol edilebilir. Ayrıca global değişken olan Enumlar ile tanımlanmış değerler, fonksiyonlar arasında veya diğer kontratlar arasında paylaşılabilir. Bu sayede kontratlar arasındaki iletişim veya fonksiyonlar arasındaki geçişler daha kolay hale gelir.

Ayrıca, Enumlar ile tanımlanmış global değişkenler, smart contract’ın ABI’sinde (Application Binary Interface) görünür olduğu için, dışarıdan erişim ve kontrol sağlamak daha kolay hale gelir.

Sonuç olarak, Enumlar Solidity içinde global değişkenler kullanımı için de kullanılabilir. Enumlar belirli bir aralıkta olan değerleri tanımlamak için kullanılabilir ve bu değerler arasından seçim yapmak veya bu değerleri belirli bir şekilde etiketlemek için kullanılabilir. Enumlar ile tanımlanmış global değişkenler, kontrat içerisinde her yerde erişilebilir olur ve fonksiyonlar arasında veya diğer kontratlar arasında paylaşılabilir. Ayrıca global değişken olarak Enumlar ile tanımlanmış değerler, smart contract’ın ABI’sinde görünür olduğu için, dışarıdan erişim ve kontrol sağlamak daha kolay hale gelir.

Enum ile özel event tanımlama ve kullanımı

Enumlar, özel event tanımlama ve kullanımı için de kullanılabilir. Enumlar, belirli bir aralıkta olan değerleri tanımlamak için kullanılabilir ve bu değerler arasından seçim yapmak veya bu değerleri belirli bir şekilde etiketlemek için kullanılabilir.

Eventler, kontrat içerisinde gerçekleşen işlemleri bildirmek için kullanılır. Enumlar ile tanımlanmış değerler, eventler içerisinde kullanılabilecek şekilde tanımlanabilir. Örneğin, bir oyun kontratı oluşturalım ve oyunun durumunu tanımlamak için Enum kullanalım:

enum GameStatus {
    Waiting,
    Playing,
    End
}

event GameStatusChanged(GameStatus newStatus);

contract Game {
    GameStatus public gameStatus;

    function setGameStatus(GameStatus _status) public {
        require(_status == GameStatus.Waiting || _status == GameStatus.Playing || _status == GameStatus.End);
        gameStatus = _status;
        emit GameStatusChanged(_status);
    }
}

Bu örnekte, setGameStatus fonksiyonu ile oyunun durumunu değiştirirken, GameStatusChanged eventi tetiklenir. Bu event içerisinde oyunun yeni durumunun Enum ile tanımlanmış değeri gönderilir. Bu sayede oyunun durumunun değiştiği işlemler daha kolay takip edilebilir ve oyunun durumunun ne olduğu kolayca kontrol edilebilir.

Enum ile kullanıcı tanımlı türler oluşturma

Enumlar, kullanıcı tanımlı türler oluşturmak için de kullanılabilir. Enumlar, belirli bir aralıkta olan değerleri tanımlamak için kullanılabilir ve bu değerler arasından seçim yapmak veya bu değerleri belirli bir şekilde etiketlemek için kullanılabilir.

Kullanıcı tanımlı türler, kontrat içerisinde kullanılacak olan özel değişken veya fonksiyonlar için tanımlanabilir. Örneğin, bir oyun kontratı oluşturalım ve oyunun durumunu tanımlamak için Enum kullanalım:

enum GameStatus {
    Waiting,
    Playing,
    End
}

contract Game {
    GameStatus public gameStatus;
    mapping(address => GameStatus) public playerStatus;
    function setPlayerStatus(address _player, GameStatus _status) public {
        playerStatus[_player] = _status;
    }
}

Bu örnekte, playerStatus kullanıcı tanımlı tür olarak tanımlanmıştır. Bu tür, oyuncunun adresi ile oyun durumunun Enum ile tanımlanmış değerini eşleştirmek için kullanılmaktadır. Bu sayede oyun içerisinde her oyuncunun durumunun ne olduğu kolayca kontrol edilebilir ve oyunun durumunun ne olduğu kolayca kontrol edilebilir.

Enum ile sınırlı değer aralığı oluşturma

Enumlar, sınırlı değer aralığı oluşturmak için de kullanılabilir. Enumlar, belirli bir aralıkta olan değerleri tanımlamak için kullanılabilir ve bu değerler arasından seçim yapmak veya bu değerleri belirli bir şekilde etiketlemek için kullanılabilir.

Enumlar ile tanımlanmış değerler arasından sadece belirli değerlerin kabul edilmesi sağlandığından, sınırlı değer aralığı oluşturmak için kullanılabilir. Örneğin, bir oyun kontratı oluşturalım ve oyunun skorunu tanımlamak için Enum kullanalım:

enum Score {
    Zero,
    One,
    Two,
    Three,
    Four,
    Five
}

contract Game {
    Score public score;
    function setScore(Score _score) public {
        require(_score == Score.Zero || _score == Score.One || _score == Score.Two || _score == Score.Three || _score == Score.Four || _score == Score.Five);
        score = _score;
    }
}

Bu örnekte, setScore fonksiyonu ile oyunun skoru değiştirirken, sadece Score Enum’u içerisinde tanımlanmış değerlerin kabul edilmesi sağlanır. Bu sayede oyun içerisinde sadece belirli aralıktaki skorların kabul edilmesi sağlanmış olur ve oyunun skoru kontrol edilebilir.

Enum ile kod okunabilirliğini arttırma ve daha anlaşılır hale getirme

Enumlar, kod okunabilirliğini arttırmak ve daha anlaşılır hale getirmek için de kullanılabilir. Enumlar, belirli bir aralıkta olan değerleri tanımlamak için kullanılabilir ve bu değerler arasından seçim yapmak veya bu değerleri belirli bir şekilde etiketlemek için kullanılabilir.

Kod okunabilirliğini arttırmak için, Enumlar kullanarak kod içerisinde belirli bir anlam taşıyan, anlamlı ve açık değerler kullanabilirsiniz. Örneğin, bir oyun kontratı oluşturalım ve oyunun durumunu tanımlamak için Enum kullanalım:

enum GameStatus {
    Waiting,
    Playing,
    End
}

contract Game {
    GameStatus public gameStatus;
    function setGameStatus(GameStatus _status) public {
        gameStatus = _status;
    }
}

Bu örnekte, setGameStatus fonksiyonu ile oyunun durumunu değiştirirken, sadece GameStatus Enum’u içerisinde tanımlanmış değerler kullanılır. Bu sayede kod içerisinde anlamlı ve açık değerler kullanılmış olur ve kod okunabilirliği arttırılmış olur. Ayrıca, Enumlar ile tanımlanmış değerler ile kod içerisinde daha anlaşılır hale getirmiş olursunuz. Örneğin, GameStatus.Waiting değerini kullanarak oyunun bekleme durumunda olduğunu, GameStatus.Playing değerini kullanarak oyunun oynanıyor durumunda olduğunu ve GameStatus.End değerini kullanarak oyunun sonlandı durumunda olduğunu belirtmiş olursunuz.

Örnek Akıllı Sözleşme İnceleme

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

contract Enum {
    // Enum representing shipping status
    enum Status {
        Pending,
        Shipped,
        Accepted,
        Rejected,
        Canceled
    }

    // Default value is the first element listed in
    // definition of the type, in this case "Pending"
    Status public status;

    // Returns uint
    // Pending  - 0
    // Shipped  - 1
    // Accepted - 2
    // Rejected - 3
    // Canceled - 4
    function get() public view returns (Status) {
        return status;
    }

    // Update status by passing uint into input
    function set(Status _status) public {
        status = _status;
    }

    // You can update to a specific enum like this
    function cancel() public {
        status = Status.Canceled;
    }

    // delete resets the enum to its first value, 0
    function reset() public {
        delete status;
    }
}

Bu akıllı kontrat, bir gönderinin durumunu tanımlamak için Enum kullanmaktadır. Status Enum, gönderinin bekleyen, gönderildi, kabul edildi, reddedildi veya iptal edildi durumlarını temsil etmektedir. status değişkeni, Enum tipindedir ve varsayılan değeri “Pending” durumudur.

get() fonksiyonu, gönderinin durumunun Enum içerisindeki değerini döndürür. Bu fonksiyonun döndürdüğü değer, Enum içerisindeki değerlerin uint değerleriyle eşleşir. Örneğin, Pending değeri 0, Shipped değeri 1 vb.

set(Status _status) fonksiyonu, gönderinin durumunu güncellemek için kullanılır. Bu fonksiyon, Enum içerisindeki bir değer alır ve status değişkenini bu değere günceller.

cancel() fonksiyonu, gönderinin durumunu iptal etmek için kullanılır. Bu fonksiyon, status değişkenini Enum içerisindeki Canceled değerine günceller.

reset() fonksiyonu, gönderinin durumunu varsayılan değerine döndürmek için kullanılır. Bu fonksiyon, delete anahtar kelimesi ile status değişkenini sıfırlar ve varsayılan değer olan “Pending” durumuna döndürür.

Sonuç Bağlamı

Enumlar, Solidity dillerinde kullanılabilen özel türlerdir. Enumlar, belirli bir aralıkta olan değerleri tanımlamak için kullanılabilir ve bu değerler arasından seçim yapmak veya bu değerleri belirli bir şekilde etiketlemek için kullanılabilir. Enumlar ile tanımlanmış değerler arasından sadece belirli değerlerin kabul edilmesi sağlandığından, sınırlı değer aralığı oluşturmak için kullanılabilir.

Enumlar, kod okunabilirliğini arttırmak ve daha anlaşılır hale getirmek için de kullanılabilir. Enumlar ile tanımlanmış değerler ile kod içerisinde daha anlaşılır hale getirmiş olursunuz.

Enumlar, oyunlar, e-ticaret, finansal işlemler veya diğer kontratlar için kullanılabilir. Enumlar, kontratlar içerisinde tanımlanmış olan değişken veya fonksiyonlar için kullanılabilir ve bu değerler arasından seçim yapmak veya bu değerleri belirli bir şekilde etiketlemek için kullanılabilir.

Sonuç olarak, Enumlar, sınırlı değer aralığı oluşturmak, kod okunabilirliğini arttırmak, anlaşılır hale getirmek ve değerler arasından seçim yapmak için kullanılabilir ve bu yüzden, Solidity dillerinde kullanımı önerilir.

Solidity Programlama Dili Öğrenme yolculuğunuz hakkında daha iyi rehberlik almak için Solidity nedir? Ethereum Akıllı Sözleşmelerinin Dili Rehberi içeriğimize göz atın. Dilerseniz Yeni Başlayanlar için Solidity – Akıllı Sözleşme Geliştirme Hızlandırılmış Kursuna katılın.

Çalışmaya nereden başlayacağım diyenler için Blockchain ​​Developer Olmak İçin Yol Haritası içeriğine de muhakkak bakın.

Gelin aklınızdaki soruları SUPERPEER sohbetinde cevaplayalım.

Bu makaleyi okuduğunuz için teşekkürler! Bana destek olmak isterseniz;

Beni TwitterLinkedin ve YouTube‘da takip edin.

Kısa bir yorum bırakmayı UNUTMAYIN!

solidity101 - Solidity, 2015 yılında Christian Reitwiessner liderliğinde piyasaya sürülen, büyük harf kullanımına göre ikinci en büyük kripto para piyasası olan Ethereum tarafından oluşturulan yepyeni bir programlama dilidir.

Yazarın Profili
İlginizi Çekebilir

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir