Sobes.tech
Middle

Bir sınıfın kamuya açık bir özelliği varsa, bu sınıfın değiştirilemez olduğu anlamına mı gelir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Hayır.

Bir sınıfta genel özellik, bu özelliğin değerinin nesne dışından değiştirilebileceği anlamına gelir. Değiştirilemez bir nesne, durumu (özelliklerinin değerleri) oluşturulduktan sonra değiştirilemeyen nesnedir. Genel bir özellik bulunması, değiştirilemezlik ilkesine aykırıdır.

Değiştirilemezliği sağlamak için, sınıf aşağıdaki koşullara uygun olmalıdır:

  • Tüm özellikler private veya protected olmalıdır.
  • Özelliklerin değerlerini değiştiren setter metodları olmamalıdır.
  • Sınıfın bağımlılıkları (çalıştığı nesneler) da değiştirilemez olmalı veya durumu dışarıdan değişmemelidir.
  • Yapıcı metod, nesneyi tamamen başlatmalı ve oluşturulduktan sonra değişmemelidir.
  • Değişiklik gerekiyorsa, yeni değerlerle yeni nesneler oluşturulmalıdır.

Örnek bir genel özelliğe sahip (değiştirilebilir) sınıf:

<?php
class MutableObject
{
    public $value; // Genel özellik

    public function __construct($value)
    {
        $this->value = $value;
    }
}

$obj = new MutableObject(10);
echo $obj->value; // 10

$obj->value = 20; // Dışarıdan değer değiştirildi
echo $obj->value; // 20

Değiştirilemez bir sınıfın örneği:

<?php
class ImmutableObject
{
    private $value; // Özel özellik

    public function __construct($value)
    {
        $this->value = $value;
    }

    public function getValue() : int
    {
        return $this->value;
    }

    // "Değişiklik" için metod, aslında yeni bir nesne oluşturur
    public function withValue(int $newValue) : self
    {
        return new self($newValue);
    }
}

$obj1 = new ImmutableObject(10);
echo $obj1->getValue(); // 10

// $obj1->value = 20; // Hata: Özel özelliğe erişim engellenmiştir

$obj2 = $obj1->withValue(20); // Yeni nesne oluşturulur

echo $obj1->getValue(); // 10 (orijinal nesne değişmedi)
echo $obj2->getValue(); // 20 (değiştirilmiş yeni nesne)