Çok büyük veri nesneleri

4 Cevap php

Son zamanlarda, ben için çalışıyorum projesi birinde çok güçlü bir kod kokusu belirledik.

Özellikle, maliyet sayma özelliği. Bazı operasyon için toplam maliyetini saymak için, "ayrıştırıcı sınıf" bilgi birçok çeşit geçmek zorunda.

Örneğin:

  • telefon numaraları
  • Seçilen kampanyalar
  • Seçilen şablonlar
  • Seçilen kişiler
  • Seçilen grup
  • ve yaklaşık 2-4 bilgiler türleri daha

Üstlenmeden önce tüm bu parametreler Sayaç sınıf kurucusunu geçirildi vardı (görüntü bu olabilir 8 parametreleri, ..).

Ben tüm bu özelliklere okunabilir alıcılar ve ayarlayıcıları ile CostCountingData adında bir veri sınıfı, girmiştik okunabilirliği artırmak için.

Ama bu kod bu üstlenmeden sonra çok daha okunabilir hale geldiği, sanmıyorum:

$cost_data = new CostCountingData();
$cost_data->setNumbers($numbers);
$cost_data->setContacts($contacts);
$cost_data->setGroups($groups);
$cost_data->setCampaigns($campaigns);
$cost_data->setUser($user);
$cost_data->setText($text);
$cost_data->setTotalQuantity($total_quantity);

$CostCounter = new TemplateReccurentSendingCostCounter($cost_data);  
$total_cost = $CostCounter->count();

Can you tell me whether there is some problem with readability of this code snippet? Maybe you can see any code smells and can point me at them..

Ben bu kodu refactore nasıl sahip tek fikir, ilgili veri türlerini kapsayan, çeşitli için bu büyük veri nesnesi parçalanmasıdır. Ama bu ya da değil yapmalıyım emin değilim ..

Whay bunun hakkında ne düşünüyorsunuz?

4 Cevap

Birkaç olasılık var burada:

  • Sadece her vakit parametreleri birkaç gerekiyorsa, named parameter approach başka bir yerde bu cevap önerdi güzel bir çözümdür.

  • Her zaman tüm parametreleri gerekiyorsa, ben koku a broken semantic model of the data required to calculate a cost geliyor öneririm.

Olursa olsun sekiz argüman alır bir yöntem çağrısı giyinmek, nasıl bilgi sekiz sözde ilgisiz parçalar şey hesaplamak için gerekli olduğu gerçeği her zaman kokacak.

Bir adım geri atın:

  • Sekiz ayrı argümanlar really Tüm ilgisiz, ya da biraz daha iyi bir durumun gerçeği yansıtmadığını ara nesneleri oluşturabilirsiniz? Ürünler? Fatura ürün? Başka bir şey?

  • Maliyet yöntemi daha az argümanlara dayalı maliyet kısmını hesaplamak küçük yöntemine bölünmüş ve toplam maliyeti parça maliyetlerini ekleyerek elde edilebilir mi?

Ne istediğinizi parametreleri (size ulaşmak için çalışıyoruz ne olduğunu bana bakar), Hiç sadece tuşları gibi adlarla, bir ilişkisel dizi içinde geçen düşünecektim adlı if? Adını Parametre Deyim, I can only find a good reference for this for C++ though, belki PHP programcıları tarafından başka bir şey denir de vardır.

Hepsi orijinal nesneyi döndü böylece, sen CostCountingData üzerinde yöntemlerini değiştirmek istiyorum. Bu kod sizin üst parça yazabilirsiniz Bu şekilde:

$cost_data = new CostCountingData();
$cost_data
 ->setNumbers($numbers)
 ->setContacts($contacts)
 ->setGroups($groups)
 ->setCampaigns($campaigns)
 ->setUser($user)
 ->setText($text)
 ->setTotalQuantity($total_quantity);

Yani iki seçenek var. Kendini belgeleyen olduğu gibi muhtemelen adlandırılmış parametre deyim kendim için gitmek istiyorum, ama fark çok büyük olduğunu sanmıyorum.

Ben veri nesnesi (ve "veri" olarak adlandırılan sınıflar kendilerini bir kokusu vardır) Gerekirse ben onun kurucu değerlerini bırakacağım. Ama ilginç soru nerede bu değerler geliyor edilir? Değerlerin kaynağı kendisi bazı tür bir nesne olabilir, ve size gerçekten ilgilendiğiniz onun muhtemelen bir gerekir

Veri POST gelen ise Edit:, sonra sınıf POST veri etrafında sarıcı olarak yapacak. Ben herhangi bir setter fonksiyonlarını sağlamak değil, ve okuma erişimciler (benim PHP biraz paslanmış daha fazladır) bu gibi görünmesi olacaktır:

class CostStuff {

   constructor CostStuff( $postdata ) {
       $mypost = $postdata;
   }

   function User() {
      return $mypost[ "user_name" ];
   }

   ...

}

Eğer kod parçası ile yanlış ne düşünüyorsunuz? Eğer zaten şimdi $ cost_data içine almak gerektiğini kullanmış olduğunuz birçok değişkeni varsa, o zaman sırayla her birini ayarlamak gerekir. Bu etrafında hiçbir yolu yok.

Eğer bu değişkenler sen şimdi $ cost_data içine taşımak için gereken karar vereceksin vs $ numaraları, $ sözleşmeleri var neden bir soru olsa,?

Mı sen $ numaralarını ayarlamak kod noktası aslında $ cost_data-> numaralarını belirleme ve hiç $ sayılar değişken gereksiz yaşıyorsanız noktası olması gerektiğini muhtemelen arıyoruz üstlenmeden?

Örneğin

$numbers=getNumbersFromSomewhere() ; 
// do stuff
$contracts=getContracstFromSomewhere() ;
// do stuff 
$cost_data=new dataObject() ; 
$cost_data->setNumbers($numbers);
$cost_data->setContracts($contracts) ; 
$cost_data->someOperation() ;

olur

$cost_data=new dataObject() ; 

$cost_data->setNumbers(getNumbersFromSomewhere()) ; 
// do stuff
$cost_data->setContracts(getContractsFromSomewhere()) ; 
// do stuff
$cost_data->someOperation() ;