Nesne sorumluluklar - liste ve madde

4 Cevap php

Benim sorum daha çok teorik gibi.

Eğer bir şeyin listesini temsil eden bir nesne, (makaleler, sayfalar, hesapları vs) var demek

class ObjCollection 

Sen koleksiyonunda belirli bir öğeyi temsil eden bir sınıf var:

class objItem

Ben her nesnenin bir temel sorumlulukları arasında bir sorun düşünce var.

Yeni bir oluşturmak için sorumlu olduğu sınıf objItem?

Hangi sınıf bir objItem silme sorumludur? Bir yöntem olarak kendisini silmek gerekir?


Update 1: Techpriester: Is it ok to use object's constructor as a function to create new item? I think of that like:

class objItem {
    public function __construct($id = 0) {
        if ($id > 0) {
            // load item data...
        } else {
            // make new item...
        }
    }
}

Ama bir şey kodunda yanlış gider ve yerine> 0 $ id geçen ne varsa, o 0 geçer? Bu durumda bir daha beklenen davranış boş bir nesne olması değil, yeni bir, ya da ben yanlış olur?

4 Cevap

Ben bu soruya cevap vermez biliyorum ama PHP gibi bu etiketlendi beri neredeyse kesinlikle veritabanı modeli çeşit ile uygulanabilir olacağını kabul edeceğim.

Bu durumda, muhtemelen her sınıf sadece bir nesneyi temsil yapılmış eğer 10 blog yazılarını görmek istiyorsa, örneğin, her geri alınmasına 10 ayrı SELECT sorguları çağırıyor olacak beri tamamen 'koleksiyonları' ile uzakta yapmak için daha iyi bir fikir sadece tek bir veritabanı kaydı, sen 'BlogPost' sınıfı kendi alma yöntemini saklanması karar verdi çünkü.

Alternatif sınıfı, bir veya daha fazla ya da kayıtları, bu şekilde temsil bildirmek için, sadece 5000 kayıtları veya sadece birini almak ister bir SELECT sorgusu çalıştırmak gerekir. Hemen hemen her object-relational-mapper bunu yapar.

Nesne yönelimli programlama yaparken, bu nesnenin somut bir 'şey' olup olmadığını daha behavior veya responsibility açısından düşünmek daha iyidir. Yani OOP teorik tartışma ile sorun. Bu gerçek dünya programlama için çok az ilgisi var hayvanlar ve meyve gibi benzetmeler kullanmak çok cazip.

Bu düşünmenin bir yolu:

objItem usually Bir sınıf yapıcısı var ve bu yüzden türü nesneleri oluşturmak için might be sorumlu bu class objItem.

Bir objItem bir liste / koleksiyonunda takıldığında diyelim objCollection bu koleksiyon silmek için can be objCollection responsability.

objItem usually have a class constructor so this class is responsible for creating objects of type objItem.

Oluşturucu sorumluluk (genellikle) ile hiçbir ilgisi yoktur. Bu şekilde düşünerek, her nesnenin kendisi için tek sorumlu olacaktır.

Sorumluluk doğrudan sınıf hiyerarşisi ile binded olmayan bir kavramdır.

Eğer:

ObjCollection = Nest objItem = Yumurta. Ve üçüncü nesne Kuş, (yuva yumurta varsa bile) Sonra Kuş egs oluşturmak için sorumluluk alır var. Bu konuda sağduyu hakkında programlama değil ... :)

"Boş bir nesne" gibi böyle bir şey yoktur. Nesneleri "devlet" var. Sen bir nesne oluşturabilir ve sonra bunu, ya da bunu oluşturmak için olmayabilir ve sonra hiçbir nesne yoktur.

Lütfen yapıcı oluşturulan yeni nesne ile ve bu olmadan, her iki durumda da iyi çalışacaktır eğer endişelenmenize gerek hepsi bu.

Genellikle başka bir nesnenin içine yaratmak için değil ($ yerine id) yapıcı parametre olarak nesne enjekte etmek daha iyidir.

Bir nesne kendisini silemezsiniz yana, toplama o has to be sorumluluğundadır.

Eğer koleksiyon oluşturmasına izin Wether o $collection->makeNewItem(); gibi nesneler bulunuyor (daha sonra yapıcı öğeleri aramaları) ya da yöntem sizin kadar tamamen $item = new Item();, doğrudan ve daha sonra bazı $collection->addItem($item); kullanın ve uygulama ihtiyacı var.

Ben öğeler kendileri de toplama dışında kullanıldığında düzenli örnekleme kullanmanızı tavsiye ediyorum.