Birlikte gruplandırma Benzer Varlıkları Kolu Tasarım Deseni

3 Cevap

Geçtiğimiz birkaç yıl içinde ben her zaman sorunlara neden görünüyor bizim nesne hiyerarşisi içinde benzer bir sorun haline çalıştırmak projeler üzerinde oldum. Herkes burada klasik bir OOP (Java, C #, PHP5, vb) incelikle bu durumu ele verebilir tasarım deseni biliyordum merak ettim.

Varolan bir sistemi var demek. Bu sistem, diğer şeyler arasında, işletmelerin iki tür, tek bir sınıf ile modellenen her sahiptir. Diyelim ki

  1. Müşteri

  2. SalesRepresentative

Tarihsel nedenlerden dolayı, bu sınıfların hiçbiri aynı temel sınıfından ya da ortak bir arabirimi paylaşacak.

The problem I've seen is, inevitably, a new feature gets specced out that requires us to treat the Müşteri ve the SalesRepresentative as the same type of Object. The way I've seen this hveled in the past is to create a new class that includes a member variable for both, ve then each method will operate on the objects differently depending on which is set

//pseudo PHPish code
class Participator
{
	public $customer;
	public $salesRepresentative;

	public function __construct($object)
	{
		if(object is instance of Müşteri)
		{
			$this->customer = $object;
		}

		if(object is instance of SalesRepresentative)
		{
			$this->salesRepresentative = $object;
		}			
	}

	public function doesSomething()
	{

		if($customer)
		{
			//We're a customer, do customer specific stuff
		}
		else if($salesRepresentative)
		{
			//We're a salesRepresentative, do sales 
			//representative specific stuff
		}			
	}
}

Durum bu tür işleme daha zarif bir yolu var mı?

3 Cevap

Belki bir sarıcı burada kullanılabilir. Bir sarıcı arabirimini oluşturmak ParticipatorWrapper yeni işlevsellik belirten ve her sınıf için somut Korumalar kurmak demek, CustomerWrapper ve SalesRepresentativeWrapper yeni işlevselliğini uygulamak hem söylüyorlar.

Sonra sadece kendine uygun ambalajında ​​nesneyi sarın ve ParticipatorWrapper hedef kod yazmak.

Güncelle: Javaish kodu:

interface ParticipatorWrapper{
    public void doSomething();
}

class CustomerWrapper implements ParticipatorWrapper{
    Customer customer;
    public void doSomething(){
       //do something with the customer
    }
}

class SaleREpresentativeWrapper implements ParticipatorWrapper{
    SaleRepresentative salesRepresentative;
    public void doSomething(){
       //do something with the salesRepresentative
    }

}

class ClientOfWrapper{
    public void mymethod(){
         ParticipatorWrapper p = new ParticipatorWrapper(new Customer());
         p.doSomething();
   }
}

Bu yaklaşımın tam tersi bir tür alarak, bu Vincent'ın cevabı için bir alternatiftir. Ben aşağıdaki nota gibi, orada bazı olumsuz yanları vardır, ancak belirli bir sorun bu ortadan olabilir ve ben bu çözüm bu durumlarda basit olduğunu düşünüyorum (ya da bu çözüm ve Vincent bazı kombinasyonunu kullanmak isteyebilirsiniz).

Aksine sınıfları sarma daha sınıflarında kanca tanıtmak ve daha sonra onlara fonksiyonlarını geçmek. Eğer (iki sınıf ortak bir üst sınıfı yok ki ağlayıp dayalı Senin tahmin ediyorum,) hem sınıftan aynı verilerle aynı şeyi yapmak arıyorsanız bu makul bir alternatiftir.

Bu Visitor yerine Wrapper kullanıyor. Javaish bu gibi bir şey olabilir:

public <Output> Output visit(Vistor<Output> v) {
return v.process(...all shared the fields in Customer/SalesRep...);
}

Ve sonra tüm fonksiyonları benziyor devralan Bir Ziyaretçi arayüzü var:

interface Visitor<Output> {
public Output process(...shared fields...);
}

Orada Ziyaretçi geçirilen olur ne doğrayın someways, ama neyse sarma olur, hangi kullanmak için girişlerine belirtmek için yeni sınıflar tanıtan, bu yüzden de Vincent'ın cevabı kullanabilirsiniz içerir.

Bu çözüm olumsuz sınıf alanların yapısını değiştiren bir şey yaparsanız, kendinizi Vincent'ın cevap bir sorun daha azdır üstlenmeden, bir sürü satın alabilirsiniz. Etkili Ziyaretçi içinde bu sarmak olurdu gibi, Müşteri / salesrep örneğinde saklanan veri değişiklikler yapıyoruz eğer bu çözüm aynı zamanda biraz daha az kullanışlıdır.

Ben size istediğiniz işlevselliği almak için derslere mixins kavramını uygulamak düşünüyorum.