1. Anasayfa
  2. 100 Günde Solidity

🧵 #100GündeSolidity 024 : Devralınan Durum Değişkenlerini Gölgeleme

🧵 #100GündeSolidity 024 : Devralınan Durum Değişkenlerini Gölgeleme
Devralınan Durum Değişkenlerini Gölgeleme
0

Devralınan Durum Değişkenlerini Gölgeleme (Shadowing Inherited State Variables)

Solidity programlama dilinde, state variable’ların override edilmesi mümkün değildir. Bunun yerine, yapılandırıcı fonksiyonu kullanılarak inherited state variable’ların geçirilmesi ve yeniden tanımlanması gereklidir. Bu yöntem, doğru kullanıldığında state variable’ların güncellenmesine ve geliştirilmesine olanak tanır ancak aynı zamanda state variable’ların yapılandırılması sırasında dikkatli olunması gerektiğini de unutmamalıyız.

Haydi Başlayalım;

Solidity dili, blockchain teknolojileri için yazılan bir smart contract dili olarak kabul edilir. Bu dille yazılan smart contract’lar, verilerin ve işlemlerin blockchain ağında güvenli bir şekilde saklanmasını ve yönetilmesini sağlar. Ancak, Solidity dili ile birlikte bazı zorluklar da ortaya çıkmaktadır. İşte bu zorluklardan biri de, Inherited State Variables’ın doğru bir şekilde tanımlanması ve override edilmesidir. Bu e-bülte, Inherited State Variables’ın shadowing (gölgelenmesi) yöntemini anlatacak ve bu yöntemin doğru kullanımının nasıl sağlanabileceğini açıklayacaktır.

State variables nasıl tanımlanır ve hangi özelliklerine sahiptir?

State Variables, bir smart contract içinde verilerin saklandığı ve yönetildiği değişkenlerdir. State variables, smart contract ömür boyu saklanır ve herhangi bir fonksiyon çağrısı sırasında erişilebilir. State variables, smart contract’ın kaynak kodunda tanımlanır ve Solidity dilinde “var” anahtar kelimesi kullanılarak tanımlanır.

State variables, aşağıdaki özelliklere sahiptir:

  • Değişken tipi: State variables, farklı değişken tiplerine sahip olabilir ve bu değişken tipleri, Solidity dilinde açıkça belirtilmelidir. Örneğin, bir sayı değişkeni için “uint” tipi, bir metin değişkeni için “string” tipi belirtilmelidir.
  • Visibility: State variables, “public”, “private” veya “internal” gibi farklı visibilty seçeneklerine sahip olabilir. Bu seçenekler, değişkenin nasıl erişilebileceğini belirler. Örneğin, “public” olarak tanımlanmış bir state variable, diğer smart contract’lardan da erişilebilir.
  • Modifier: State variables, “constant” veya “storage” gibi farklı modifier seçeneklerine sahip olabilir. Bu seçenekler, değişkenin nasıl saklandığını belirler. Örneğin, “constant” olarak tanımlanmış bir state variable, değiştirilemez ve sadece okunabilir.

Inherited state variables nasıl geçirilir ve nasıl kullanılabilir?

Inherited state variables, bir smart contract’tan başka bir smart contract’a geçirilen state variables’lardır. Bu, smart contract’lar arasında verilerin kalıcı olarak saklanmasını ve paylaşılmasını sağlar. Inherited state variables, “is” anahtar kelimesi kullanılarak bir child contract’a geçirilir. Child contract, inherited state variables’ın tüm özelliklerini kullanabilir ve bu değişkenlere erişmek için aynı şekilde kullanılırlar.

Örnek olarak, aşağıdaki gibi bir parent contract tanımlanabilir:

contract Parent {
    uint public age;
}

Ve bu parent contract’tan inherit edilen bir child contract şu şekilde tanımlanabilir:

contract Child is Parent {
    function getAge() public view returns (uint) {
        return age;
    }
}

Bu örnekte, “Child” contract, “Parent” contract’tan “age” state variable’ını inherit etmiştir. “Child” contract, inherit edilen state variable’a “getAge()” fonksiyonu ile erişebilir ve değerini döndürebilir.

State variables’ın override edilme sorunları ve neden mümkün değildir?

State variables, smart contract programlama dilinde sıradan değişkenler gibi düşünülebilir ancak, farklı olarak, bir kez tanımlandıklarında değiştirilemezler. Bunun nedeni, state variables’ın Ethereum blockchain üzerinde kalıcı olarak saklanması ve herhangi bir fonksiyon çağrısı sırasında erişilebilmesidir. Bu nedenle, state variables’ın özellikleri ve verileri, bir kez tanımlandıktan sonra değiştirilemez.

Bununla birlikte, state variables’ın override edilmesi, bir child contract tarafından inherit edilen bir state variable’ın özelliklerinin değiştirilmesini amaçlar. Ancak, smart contract programlama dillerinde, state variables’ın override edilmesi mümkün değildir.

Bu, state variables’ın özelliklerinin ve verilerinin, bir kez tanımlandıktan sonra değiştirilememesi nedeniyle ortaya çıkar. Smart contract programlamada, state variables’ın override edilmesi yerine, farklı bir state variable tanımlanması ve bu değişkenin kullanılması önerilir.

Inherited state variables’ın nasıl shadowed (gölgelendi) olduğu ve bu yöntemin doğru kullanımı?

Inherited state variables, bir child contract tarafından inherit edilirken, aynı isimde bir state variable tanımlandığında, tanımlanan state variable inherit edilen state variable’ı gölgeleyebilir. Bu, tanımlanan state variable’ın inherit edilen state variable’a nüfuz ederek, inherit edilen state variable’ın değerini değiştirebilir.

Bu yöntem, inherit edilen state variable’ın değerini, child contract tarafından yönetmek isteyen durumlarda kullanılabilir. Ancak, dikkatli bir şekilde kullanılması önerilir, çünkü inherit edilen state variable’ın verilerinin, bir kez tanımlandıktan sonra değiştirilememesi nedeniyle, shadowed state variable’ın değerinin doğru şekilde tanımlanması ve yönetilmesi önemlidir.

Örnek olarak, aşağıdaki gibi bir parent contract tanımlanabilir:

contract Parent {
    uint public age;
}

Ve bu parent contract’tan inherit edilen bir child contract şu şekilde tanımlanabilir:

contract Child is Parent {
    uint public age;

    function setAge(uint _age) public {
        age = _age;
    }

    function getParentAge() public view returns (uint) {
        return super.age;
    }
}

Bu örnekte, “Child” contract, “Parent” contract’tan “age” state variable’ını inherit etmiştir. Ancak, aynı isimde “age” state variable’ı tanımlanmıştır. Bu tanımlanan “age” state variable, inherit edilen “age” state variable’ı gölgelemiştir. “Child” contract, tanımlanan “age” state variable’ına “setAge()” fonksiyonu ile değer atayabilir ve değerini “getParentAge()” fonksiyonu ile inherit edilen “age” state variable’ından alabilir.

Shadowing Inherited State Variables’ın faydaları ve dezavantajları

Shadowing Inherited State Variables, farklı durumlarda faydalı veya dezavantajlı sonuçlar doğurabilir.

Faydaları:

  1. Esneklik: Child contract’lar tarafından inherit edilen state variable’ların değerini değiştirmek ve yönetmek mümkün olabilir.
  2. Anlaşılır Kod: Child contract’lar tarafından yönetilen state variable’ların, aynı isimdeki inherit edilen state variable’lar ile karışmasını önler.

Dezavantajları:

  1. Konseptsel Zorluk: Shadowing Inherited State Variables konsepti, Solidity dili kullanmaya başlayan kişiler için zorlayıcı ve anlaşılması güç bir konu olabilir.
  2. Hata Potansiyeli: Shadowing Inherited State Variables’ın doğru kullanımı, dikkatli bir şekilde yapılması gerektiğinden, hata potansiyeli fazladır.
  3. Debugging Zorlukları: Shadowing Inherited State Variables’ın yanlış kullanımı, kodun anlaşılmasını ve hata ayıklamasını zorlaştırabilir.

Bu nedenle, Shadowing Inherited State Variables’ın kullanımı, doğru bir şekilde anlaşılması ve dikkatli bir şekilde yapılması durumunda faydalı sonuçlar doğurabilir, ancak yanlış kullanımı durumunda dezavantajlı sonuçlar doğurabilir.

Inherited state variables’ın nasıl yapılandırılması gerektiği ve bu konuda dikkat edilmesi gereken noktalar

Inherited state variables’ın yapılandırılmasında dikkat edilmesi gereken bazı noktalar şunlardır:

  1. Üst sınıfın state variable’ları, alt sınıf tarafından kullanılacaksa mutable (değiştirilebilir) tanımlanmalıdır.
  2. Üst sınıfın state variable’ları, alt sınıf tarafından değiştirilmeyecekse, immutable (değiştirilemez) tanımlanmalıdır.
  3. Alt sınıf tarafından inherit edilen state variable’ların, isimleri aynı olarak tanımlanmamalıdır.
  4. Shadowing Inherited State Variables, doğru bir şekilde yapılandırılmadığında, üst sınıf tarafından tanımlanan değerlerin değiştirilmesine neden olabilir.
  5. Inherited state variable’ların, yapılandırılması esnasında öncelikli olarak güvenliği ve performansı göz önünde bulundurulmalıdır.

Bu noktalara dikkat edildiğinde, Inherited state variables’ın yapılandırılması, sorunsuz ve verimli bir şekilde yapılabilir.

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

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

contract A {
    string public name = "Contract A";

    function getName() public view returns (string memory) {
        return name;
    }
}

// Shadowing is disallowed in Solidity 0.6
// This will not compile
// contract B is A {
//     string public name = "Contract B";
// }

contract C is A {
    // This is the correct way to override inherited state variables.
    constructor() {
        name = "Contract C";
    }

    // C.getName returns "Contract C"
}

Bu akıllı sözleşme, Solidity 0.8.17 sürümü ile yazılmıştır ve MIT lisansı altındadır.

Sözleşme A, public olarak tanımlanmış “name” adlı bir string türünde state variable’ı ve bu değeri döndüren “getName()” adlı bir fonksiyona sahiptir.

Sözleşme B, Sözleşme A’dan inherit edilmiştir ve aynı isimde “name” adlı bir state variable tanımlamaya çalışmıştır. Ancak, Solidity 0.6 sürümünde state variable’ların override edilmesi yasaktır ve bu sözleşme hata verir.

Sözleşme C ise, Sözleşme A’dan inherit edilmiştir ve “name” adlı state variable’ın override edilmesi için, yapılandırıcı fonksiyonu kullanılmıştır. “C.getName()” fonksiyonu, “Contract C” değerini döndürür.

Bu şekilde, inherited state variables’ın override edilmesi doğru bir şekilde yapılmıştır.

Sonuç Bağlamı

Sonuç olarak, Solidity programlama dili içinde state variable’ların override edilmesi mümkün değildir. Bunun yerine, yapılandırıcı fonksiyonu kullanılarak inherited state variables’ın geçirilmesi ve yeniden tanımlanması gereklidir. Bu yöntem, doğru kullanıldığında state variable’ların güncellenmesine ve geliştirilmesine olanak tanır. Ancak, bu yöntemin dezavantajları da bulunmaktadır ve state variable’ların yapılandırılması sırasında dikkatli olunması gerekir.

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

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