2009-01-14 15 views
5

Bir alan adınız Kullanıcı olduğunuzu ve bir Kullanıcı'nın alışveriş sepetine bir öğe ekleyebilme özelliğini desteklemesini istediğinizi varsayalım. Şimdi, alışveriş sepetindeki ürün benzersiz olduğundan emin olmak istiyoruz, bu yüzden biz Kullanıcı sınıfının içindeki aşağıdaki işlevi oluşturun: Bu harika çalışıyorİş mantığı etki alanına veya hizmetlere yerleştirilmeli mi?

function AddItemToCart(Item item) 
{ 
    // Add business logic to make sure item is unique 
} 

. Ancak, şimdi, bir ürün sepetine eklendiğinde, kullanıcıyı e-postayla göndermek istiyorsak ne olur? Bunu AddItemToCart'a ekleyebiliriz, ancak User sınıfına bir çeşit IEmailer bağımlılığı enjekte etmeyi gerektirir. Alternatif, iş mantığını yerine getirecek ve e-postayı gönderecek olan bu işlemi (ör. ShoppingCartService) işlemek için bir hizmet oluşturmak olacaktır. Bununla birlikte, bu, oldukça anemik bir alana yol açar (yani Kullanıcı sınıfı, alıcılar/ayarlayıcılardan başka bir şey değildir)

+0

Site yöneticisi telefon açıyorsa ne olur? User.AddItemToCart'ın bu senaryoda uygun bir tasarım olduğundan emin misiniz? –

cevap

4

Bu, Kullanıcı varlığını bir hizmetle enjekte etmeyi içerebilir veya içermeyebilir. Hizmetin, Kullanıcı sınıfının iş mantığının bir parçası olup olmadığına ve bu durumun her yerde bulunup bulunmadığına bağlı olduğuna inanıyorum.

ben yazarsınız:

class ShoppingCartService 
{ 
    private EmailService emailer; 

    public void addItemToUserCart(User u, Item i) 
    { 
     u.addItemToCart(i); 
     this.emailer.sendEmailTo(u, "Item " + i.toString() + " was added to your cart"); 
    } 
} 

This related question tartışma Eğer yararlı olduğunu görebileceğiniz vardır.

Ayrıca, kuplajı azaltmak için alıcıları ve ayarlayıcıları mümkün olduğunca kısıtlanmış şekilde tutmanızı da tavsiye ederim.

0

Yöntemi olduğu gibi tutun, Sonra işlemi işlemek için bir hizmet sınıfı oluşturun. Servis sınıfı yöntemine çağrı yapıldığında, o zaman e-posta gönderme mantığınızı buraya enjekte edebilirsiniz.

2

Kullanıcı bütün alanı değil "Ancak, bu oldukça anemik etki alanına açar (yani Kullanıcı sınıfı getters/belirleyiciler başka bir şey değildir)".

Öğeleri Sepete koyan Sepetim, Ürün ve sofistike Cart.add() ürününüz var.

Peki kullanıcı sınıfı basit görünüyorsa? Kullanıcının etki alanı mantığının bir parçası olan mantık kullanıcıda kalmalıdır.

+0

O zaman basit bir Kullanıcı sınıfına sahip olacaksınız ... hayat devam ediyor. – Jobo

0

Büyük sistemlerde Kullanıcı sınıfı çok sayıda farklı işlem türüne sahip olacaktır. Sınıf çok büyük olabilir. Bundan kaçınmak için, kullanıcı için şeyler yapan başka sınıflar olmalıdır.

İlgili konular