OOP DAO tasarım soru

5 Cevap php

Hızlı background: PHP programlama, ben ayrı bir veri erişim katmanı DB veri alma ve etki sınıfları oluşturmak için sorumludur (DAO sınıfları) ile bir etki alanı modeli var.

Diyelim ki group ve groupList nesneleri oluşturmak için sorumlu bir DAO sınıf var diyelim. Bir sosyal ağ bileşeni olarak gruplarını tahmin edebilirsiniz; Gerçekten bu soruya ne de umrumda değil.

Ben farklı farklı kriterlere göre beni çeşitli groupList nesneleri yapmak için DAO sormak gerekiyor:

  • en son eklenen grupları
  • En popüler gruplar
  • bir yönetici tarafından "özellikli" olarak tanımlanan gruplar
  • grupları, belli bir etiket ile etiketlenmiş
  • Belirli bir anahtar kelimeyle eşleşen grupları
  • belli bir kategori içindeki grupların
  • belirli bir kişi tarafından oluşturulan gruplar
  • Belirli bir günde oluşturulan gruplar

Bunlardan bazıları ben aslında şu vea ihtiyacım yok, ama ben tür ben proje bitince önce bunları gerekir hayal edebiliyorum. Şimdi ben güzel bir basit DAO yöntemi ile başladı: createList. Bu harika çalıştı. : Sen olarak sahte kod düşünebilirsiniz

find out how many groups
create SQL query to fetch group details
loop through results
{
   create group object
   add to group list object
}

Benim uygulama ilerledikçe, o zaman yeni bir yöntem yarattı createFeaturedList. Bu harika çalıştı. Ama bu biraz daha farklı bir sorgu, aslında createList çok benzer oldu. Kod ~ 150 hatlarının geri kalan bir çok aynıydı.

Yani ... what should I do about all the slightly different cases I need? Çoğu zaman ben gerçekten sadece belli kriterlere göre listeyi filtrelemek ve sıralamak istiyorum. Soru bu - gerekir I:

a) gibi odaklı yaradılış yöntemin birçok oluşturmak:

  • createList ()
  • createCategoryList (categoryObject)
  • createUsersList (UserObject)
  • createTagList (tag)
  • createPopularList ()

or

b) create one BIG method that can do everything: - createList ( searchString, orderBy, filterByCategoryObject=null, filterByUserObject=null )

Ben oldukça bir fikir gibi (a) benim DAO arayüzü basit ve (örn: aniden karşı karşılaştırmak için date geçmesi gerektiğinde başka bir parametre ekleyerek) değiştirmek gerekir olasılığı daha azdır, çünkü zorluk geliyor Eğer diğer parametreleri ile birleştirmek mümkün olmak istiyorum arama anahtar gibi şeyler varsa; örneğin: (a) ile yola başladım ne tür .., kategori listesi arveı popüler liste arveı, vb tag listesini aradı.

I (b) için üstlenmeden ile bir flört yaşadım ama çok, benim yöntemi oldukça hızlı, çok büyük ve çok karmaşık oluyor görebiliyorum "eğer" ler ve SQL oluştururken farklı davalarına s "seçme" ve yöntemi beslenir parametrelerin çok. Ama en azından tek bir yerde bulunuyor. Ve bir şeyler birleştirebilirsiniz; örneğin: Bir kullanıcının grupları, anahtar kelimeler vesaire eşleşen, vesaire ile etiketledi.

5 Cevap

Tüm kamu yöntemleri içine çağırır özel bir yöntemi yapabiliriz. IE

private function _createList ( searchString, orderBy, ... )
{
    ...
}

public function createList()
{
    return $this->_createList('...', 'id');
}

public function createCategoryList()
{
    return $this->_createList('...', 'category_id');
}

Lütfen _createList işlevi değiştirmek gerekiyorsa bu şekilde daha sonra sadece yerine bu DAO kullanan tüm sınıfların daha bu DAO'sunda genel yöntemleri refactor var.

Ben kesinlikle bir ya da bir durum olduğunu sanmıyorum. Seçeneği bu yüzden o tutmak gerektiğini düşünüyorum maruz için DAO için güzel kullanışlı bir arayüz. Benim için Seçenek b gerçekten uygulama belirli mantık gibi görünüyor. Yani BÜYÜK yöntem amaca uygun olursa, ben bir seçenek olarak arayüzü teşhir ederken gerçek işleme mantığını gerçekleştirmek için kullanmak söyleyebilirim.

Bu BÜYÜK yöntemi çok dolambaçlı ve karmaşık hale gelir ve kod yeniden aslında kod karmaşıklığını artırmak ve uygulama yaşatılabilirlik azalan takdirde o zaman sen her arabirim yöntemi için ayrı SQL ifadeleri tutmak için refactor ancak yardımcı bir yöntem ortak mantığı yürütmek isteyebilirsiniz, dedi sonuçlarını ayrıştırma.

Seçenek B big yöntem hemen hemen kodu yeniden azaltmak ve karmaşıklığı ve bakım süresini artırmak için garanti edilir.

Şahsen, (ve Kanunu'na göre tam) yöntemleri bir şey yapmak gerektiğini ve bunun iyi değil içeri gelecekte refactor ve ilk kez akıllı yok kaçının sahip her şeyi sığdırmak için deneyin.

Esasları programlanması: bu bölümlere veya fonksiyonlar halinde kodlarını yıkmak için iyi bir uygulamadır.

Ben seçeneği (a) için gidecek; Sen kodunu korumak ve hata ayıklamak gerekir. Eğer bir hata varsa ne zaman, size çeşitli yöntemler içine kodunuzu kadar bölünmüş olması çok mutlu olacak.

Buna ek olarak, yöntem adı yazarken sen ne yaptığını anlamak için yardımcı olur.

Bu karşılaştırın:

Option (a)

$obj->AddNewList( /* params */ );
$obj->UpdateList( /* params */ );

ve bu:

Option (b)

$obj->parse( /* first set of params */ );
$obj->parse( /* second set of params */ );

Insanlar sağa sola okunur gibi zaman kazandırır. Fonksiyonu ve yöntem adları her zaman solda bulunan nedeni budur.

Ya performans büyük bir sorun değil, ya da grupların yararlı olmak için sorgu önbelleğe almayı etkinleştirmek için yeterince yavaş yavaş değiştirirseniz, filtreleme fonksiyonlarını yazabilirsiniz ve gruplar aracılığıyla döngü ediyorsanız Lütfen bu geçmek ve filtreleme yöntemleri sizin döngü opsiyonel bir dizi var olacak:

for(group in group) {
    cont = true
    for(f in functions) {
        if ! f(group) {cont = false; continue;}
    }
    if(cont) Continue
    add group to list
}

Bu, döngü değiştirmeden sadece yazarken veya bir işlevi değiştirmeden filtreleme params değiştirmek için izin verecek.