SORU
2 EYLÜL 2008, Salı


Kaç oluşturucu bağımsız değişkenleri çok fazla.

Hadi aşağıdaki alanları içeren Müşteri adında bir sınıf var diyelim:

  • Kullanıcı adı
  • E-posta
  • İlk Adı
  • Soyadı

Umalım da iş senin mantığına göre, tüm Müşteri nesneler bu dört özellikleri tanımlanmış olması gerektiğini söylüyorlar.

Şimdi, bu oldukça kolay bu özelliklerin her belirtmek için yapıcı zorlayarak yapabiliriz. Ama oldukça kolay bir Müşteri nesne için daha fazla gerekli alanları eklemek zorunda zaman kontrolden çıkabilir anlamak zor değil.

Onların kurucu 20 argümanlar yer alacak sınıfları gördüm ve sadece bunları kullanmak için bir ağrı oldu. Ancak, alternatif olarak, eğer tanımsız bilgi sahibi olma riskini çalıştırmak bu alanlar, ya da daha kötüsü ihtiyacınız yok eğer doğru değilse, eğer bu özellikleri belirtmesine kodu kullanan, referans hata nesnesi.

Seninle yaşamak için başka alternatif var biliyor musun, Sadece X oluşturucu bağımsız değişkenleri miktarı çok fazla olup olmadığını karar vermek zorunda?

CEVAP
2 EYLÜL 2008, Salı


İki tasarımı düşünün yaklaşımlar

essence desen

fluent interface desen

Bu yavaş bir ara nesne oluşturmak ve daha sonra tek bir adımda hedef nesne oluştur bu niyet hem de birbirine benzer.

Eylem akıcı arayüzü bir örnek olacaktır:

public class CustomerBuilder {
    String surname;
    String firstName;
    String ssn;
    public static CustomerBuilder customer() {
        return new CustomerBuilder();
    }
    public CustomerBuilder withSurname(String surname) {
        this.surname = surname; 
        return this; 
    }
    public CustomerBuilder withFirstName(String firstName) {
        this.firstName = firstName;
        return this; 
    }
    public CustomerBuilder withSsn(String ssn) {
        this.ssn = ssn; 
        return this; 
    }
    // client doesn't get to instantiate Customer directly
    public Customer build() {
        return new Customer(this);            
    }
}

public class Customer {
    private final String firstName;
    private final String surname;
    private final String ssn;

    Customer(CustomerBuilder builder) {
        if (builder.firstName == null) throw new NullPointerException("firstName");
        if (builder.surname == null) throw new NullPointerException("surname");
        if (builder.ssn == null) throw new NullPointerException("ssn");
        this.firstName = builder.firstName;
        this.surname = builder.surname;
        this.ssn = builder.ssn;
    }

    public String getFirstName() { return firstName;  }
    public String getSurname() { return surname; }
    public String getSsn() { return ssn; }    
}


import static com.acme.CustomerBuilder.customer;

public class Client {
    public void doSomething() {
        Customer customer = customer()
            .withSurname("Smith")
            .withFirstName("Fred")
            .withSsn("123XS1")
            .build();
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • André Frizzo

    André Frizz

    16 Aralık 2006
  • 10 Daughters, 2 Sons

    10 Daughters

    10 Mart 2009
  • LiquidMusick

    LiquidMusick

    23 Aralık 2010