Bir nesne devlet izleme

4 Cevap php


In PHP, what's the best way to track an objects state, to tell whether or not it has been modified? I have a repository object that creates new entities, they are then read/modified by other components and eventually given back to the repository. If the object has changed I want the repository to save the data back to the persistent storage (DB).

Dört seçenekten düşünebilirsiniz:

  1. $ _modified Denilen dahili bir Boole özelliği, kullandığınız her setter güncellemeleri modifikasyonlar (belirleyiciler bir yeri varsa sıkıcı) yapıldığı zaman.
  2. Bazı korkunç çirkin hack kullanarak serialize () ve dizeleri karşılaştırma (Ben bu bir very kötü bir fikir olduğundan emin değilim, ama ben bütünlüğü için eklemek istiyorum düşündüm)
  3. Yukarıdaki ancak nesnelerin özellikleri bir karma ile (değil diğer nesneleri içeren nesneleri ile çalışmak emin eğer) gibi bir şey
  4. Onlar repo çıkması gibi nesnelerin klonları alarak ve gelir ne karşılaştırarak (nasıl nesneyi karşılaştırmak için klonlamak biliyor musunuz çünkü, sesler daha? Daha karmaşık)

    veya ...

  5. Ben farkında değilim diğer bazı zeki hüner?

Thanks,
Jack

4 Cevap

Seçenek 1 - Bir boolean bayrağını kullanarak - en iyi yoldur. Performans, hem de genel kullanılabilirlik ve taşınabilirlik açısından.

Tüm diğer seçenekler sadece bu durumda gerekli değildir aşırı yormayan.

Bu kadar bu mücadele için tasarlanmış bir sorun olarak, Unit of Work kalıbı içine bakmak isteyebilirsiniz. Nesneleri değiştirilir gibi, kendilerini kayıt veya pasif kayıtlı, nesneler değiştirildi edildiği izleyebilmek için sorumlu UOW, ile, ve sergiyi için ne oyun sonunda geri veritabanına kaydedilmesi gerekir.

Birincisi, ben genellikle modifiye $ veya $ kirli mülkiyet burada en iyi çözüm olduğunu düşünüyorum.

Ama ben yazıyorum nedeni olacağını Yorumunuz oldu

belirleyiciler bir yeri vardır sıkıcı olmadığını

Eğer PHP5 kullanarak değil, merak ediyorum?

Eğer, bu __ seti () sihirli yöntemi mükemmel bir kullanımıdır. Olduğu gibi-hatta __ seti () yöntemi mevcut belirleyiciler çağırarak, onu kullanabilirsiniz.

Örneğin:

class some_concept
{

    private $x = 1;
    private $y = 2;
    private $dirty = false;

    // This represents your existing setter methods
    function set_y($i)
    {
    	$this->y = $i;
    }

    function __set($name, $value)
    {
    	if ($value != $this->{$name}) $this->dirty = true;

    	return $this->{'set_' . $name}($value);
    }

    function __get($name)
    {
        	return $this->{$name};
    }
}

Ancak, tefrika dizeleri karşılaştırma senin fikrine bazı hak vardır. Serileştirme pahalı olabilir. Bu doğru.

Ama listenizde en doğru çözümdür. Kaydederek, geri 2'ye o ayarı, sonra, yukarıda nesnesi yükleme 0'a $ y ayarı düşünün. Bu kirli mi? Öyle söylüyorlar, ama gerçekte, o zaman yüklenmiş oldu aynı durumda bulunuyor.

Ben burada kullanmak istiyorum testi save () ne kadar pahalı olduğunu. Tasarruf vb çok pahalı bir API çağrısı, DB işlem ise, o zaman yük nesneyi serialize ve bunun bir md5 hash kaydetmek için gider değer olduğunu bulabilirsiniz.

Bir ikinci bir kısmını alacağını op, bir çok ikinci işlem kaydedebilirsiniz eğer, o zaman gerçekten buna değer olabilir.


Son olarak, Damien Katz bu konuda tam tersi bir görüş işaret etmek istiyorum. Katz CouchDB oluşturulan yetenekli geliştirici, ve şu anda MySQL için çalışıyor.

Onun Error Codes v Exceptions sonrası uzun ama bu konuda çok iyi bir okuma.

Bir özel durum atma bir Hata Kodu dönen yararları hakkında konuşurken iken başlar, o gerçekten çok sağlam bir yazılım yazmak için nasıl bahsediyoruz biter.

Öncelikle, o SQL İşlemleri olduğunu aynı şekilde atomik sınıfları oluşturmak için nasıl bahsediyor. Genel bir fikir onun devlet değiştirmek, bir nesnenin bir kopyasını yapmak ve sadece son aşamada, eğer başarılı olursa, size birincil nesne için kopya çıkışı takas yapmak varlık. Bu anlamlı geri alma özellikleri sağlar. Böyle bir model, güç olan bir uygulama haline şim için ise, bu is_modified soruna bir çözüm sağlar.

Ben ilk seçenek daha okunabilir kod ve daha hızlı yürütülmesi için iyi olduğunu düşünüyorum. Ben de (dosya demek) ilk nesneleri seri ve daha sonra içeriğini karma düşünün.

Aynı içeriği aynı hash değerini üretmek gerekir.