Kurucu Karmaşıklığını Yönetmek: Çok Fazla Argüman Ne Zaman Çok Fazla?

Yazılım geliştirmede, özellikle nesne yönelimli programlamada, kurucular nesneleri başlatmada merkezi bir rol oynar. Ancak projeler geliştikçe ve gereksinimler arttıkça, yaygın bir sorun ortaya çıkar: Bir kurucu için kaç argüman çok fazladır? Çok sayıda kurucu parametresi gerektiren bir sınıf hızla karmaşık hale gelebilir, bu da bakımını ve etkin kullanımını zorlaştırır. Bu blog yazısında bu zorluğu tartışacak ve kurucu kullanımını basitleştirebilecek iki tasarım desenini keşfedeceğiz, böylece kodunuzu daha temiz ve yönetilebilir hale getireceğiz.

Sorun: Bunaltıcı Kurucular

Müşteri adında bir sınıfı düşünün. İş mantığınızla uyumlu olması gereken birkaç alan içerir:

  • Kullanıcı Adı
  • E-posta
  • Ad
  • Soyad

Bu dört alanı kurucuya koymak basit görünse de, durum daha fazla zorunlu alan biriktikçe karmaşık hale gelebilir. Bir sınıf 20 veya daha fazla parametre topladığında, o kurucunun kullanılması geliştiriciler için bir baş ağrısına dönüşür.

Aşırı Kurucu Argümanlarının Riskleri

  • Artan Karmaşıklık: Çok fazla parametreye sahip bir kurucu, okunması ve anlaşılması zor olabilir.
  • Hata Yapma Eğilimi: Geliştirici hataları, parametrelerin sırasının yanlış verilmesi veya zorunlu bir alanın unutulması gibi durumlardan kaynaklanabilir.
  • Bakım Zorlukları: Şişirilmiş bir kurucuya sahip bir sınıfı değiştirmek, genellikle kod tabanınızın birçok yerinde önemli ayarlamalar gerektirir.

Bu karmaşıklıkla başa çıkmanın yollarını düşünürken, kurucu parametrelerini sınırlamak veya kullanımını basitleştirmek için alternatif tasarım yaklaşımlarının olup olmadığını merak edebilirsiniz.

Çözümler: Yapıcı ve Akıcı Arayüz Kalıpları

  1. Yapıcı Deseni: Nesneleri oluşturmanın daha esnek ve okunabilir bir yolunu sağlar; ayrı alanlar kullanarak nesneyi adım adım inşa etmeyi mümkün kılar.
  2. Akıcı Arayüz Deseni: Bu desen, doğa dili gibi okunan bir kodu teşvik ederek netliği artırır.

Akıcı Arayüzün Uygulama Örneği

Aşağıdaki örnekte, Customer nesneleri oluşturmak için bir CustomerBuilder nasıl uygulanır göstereceğiz:

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; 
    }

    // Müşteri doğrudan oluşturulamaz
    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; }    
}

Müşteri Yapıcısını Kullanmak

CustomerBuilder ile gerçek nesne oluşturma şu şekilde görünür:

import static com.acme.CustomerBuilder.customer;

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

Sonuç: Dengeyi Bulmak

Kurucu argümanlarını akıllıca yönetmek, sürdürülebilir ve okunabilir kod yazmanın temelidir. Yapıcı ve Akıcı Arayüz gibi desenleri kullanarak, geliştiriciler kurucularındaki karmaşıklığı azaltabilir ve çok fazla parametre durumlarının olumsuz etkilerinden kaçınabilir.

Bir sonraki sefer, çok sayıda zorunlu alanla karşılaştığınızda, bu desenlerden birini uygulamayı düşünebilirsiniz. Kodunuz sadece daha temiz değil, aynı zamanda üzerinde çalışmak için daha keyifli olacaktır.