Design patternler yazılım geliştirme süreçlerinde kodun tekrar kullanılabilirliği, okunabilirliği ve geliştirme sürecini hızlandırması açısından oldukça önemli bir yere sahiptirler.
Normalde yazılım dilinden ya da platformundan bağımsız olsalar da ben design patternleri Android uygulama geliştirirken nasıl kullanabileceğimizi bu ve bundan sonraki yazılarımda bahsetmeye çalışacağım.
Design patternler aslında 3 ana başlıkta toplanırlar. Bunlar;
- Creational Design Patterns (Singleton, Factory, Builder vs.)
- Structural Design Patterns (Adapter, Facade, Proxy vs.)
- Behavioral Design Patterns (Observer, Command, Strategy vs)
Builder Pattern
Builder tasarım deseni nesne oluşturmayı zincirleme metod çağırımları ile basitleştirir ve kod okunabilirliğini arttırır. Bu sayede bazı parametreleri opsiyonel ya da zorunlu yapabiliriz. Android’de en sık kullanılan Builder pattern, Android SDK içerinde yer alan AlertDialog.Builder
dır.
1 2 3 4 |
new AlertDialog.Builder(this) .setTitle("Burada başlık yer alır") .setMessage("Mesaj burada verilir") .create(); |
Peki biz kendi Builder classımızı yazmak istersek nasıl yazabiliriz buna bakalım.
Bir kullanıcı nesnesini, Builder pattern kullanarak oluşturduğunuzu düşünün. Model classı alttaki gibi olacaktır.
1 2 3 4 5 |
public class User { private String firstName; private String lastName; private int age; } |
Daha sonra yine bu User classı içine bir tane Builder classı oluşturuyoruz. (Kodlar çok uzun olacağı için Builder classı ayrı bir classmış gibi alta yazdım aslında User classı içerisinde yer alıyor)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
static class Builder { private String firstName; private String lastName; private int age; public Builder setFirstName(final String firstName) { this.firstName = firstName; return this; } public Builder setLastName(final String lastName) { this.lastName = lastName; return this; } public Builder setAge(final int age) { this.age = age; return this; } public User create() { return new User(this); } } |
Üstte gördüğünüz gibi aynı propertyleri bu class içerisinde de tanımladık ve dönüş değeri Builder classı olan setter metodları yazdık. Bu metodlar içinde return this
diyerek zincirleme metod çağırımının yapılabilmesine olanak sağladık. En sonda da create
metodu ile yeni bir User nesnesi oluşturduk.
Şimdi yazdığımız bu Builder classını User classına constructor parametresi olarak vermemiz gerekiyor.
1 2 3 4 5 6 7 8 9 10 11 |
public class User { private String firstName; private String lastName; private int age; private User(final Builder builder) { firstName = builder.firstName; lastName = builder.lastName; age = builder.age; } } |
Burada önemli nokta constructor private olmalı ve dışarıdan buraya erişim sağlanmamalıdır. Bu sayede sadece Builder classı kullanarak bir nesne türetme işlemi yapabileceğiz.
Yukarıda bazı parametrelerin opsiyonel bazılarının zorunlu olabileceğinden bahsettim. Şimdi bu kısıtlamayı yapalım. Örneğin firstName zorunlu olsun, diğerleri opsiyonel olsun. Bu durumda create
metodunu alttaki gibi güncelliyoruz.
1 2 3 4 5 6 7 8 |
public User create() { User user = new User(firstName, lastName, age); if (user.firstName.isEmpty()) { throw new IllegalStateException( "İsim boş bırakılamaz"); } return user; } |
Classı tamamladık. Artık Builder pattern kullanarak alttaki gibi bir nesne oluşturma işlemi yapabiliriz.
1 2 3 4 5 |
new User.Builder() .setFirstName("Jon") .setLastName("Snow") .setAge(21) .create(); |
İşte bu kadar!