Evet, sakıncaları var
Okunması kolay kod iyidir, ancak kodun ne iletişim kurduğuna da dikkat edin . Bir nesnenin yöntemleri her zaman nesneyi döndürdüğünde, birkaç şey iletir:
- Hangi şeylerin ayarlanması veya yapılandırılması gerektiği açıkça belli olmayan gelişmiş yapılandırmaya ihtiyacım var
- Her bir sonraki yöntem çağrısı son
Geçerli Kullanım Durumu: Geçici Veritabanı Sorguları
Sınıf kütüphaneleri, sabit kodlu SQL'e başvurmadan bir veritabanını sorgulamanızı sağlayan her dilde bulunur. .NET için Entity Framework'ü örnek olarak alalım:
DBContext db = new DBContext();
List<Post> posts = db.Posts
.Where(post => post.Title.Contains("Test"))
.OrderBy(post => post.DateCreated)
.ToList();
Bu, her bir sonraki yöntem çağrısının bir öncekine dayandığı akıcı bir arayüzdür. Bu çağrıları mantıksal olarak okumak, bir veritabanını sorgulama bağlamında anlamlıdır.
Geçersiz Kullanım Durumu: Ayar Özellikleri İçin Sözdizimsel Şeker
Şimdi Post
sınıfla aynı modeli kullanalım :
public class Post
{
public string Title { get; set; }
public DateTime DateCreated { get; set; }
public string Body { get; set; }
public Post SetTitle(string title)
{
Title = title;
return this;
}
public Post SetDateCreated(DateTime created)
{
DateCreated = created;
return this;
}
public Post SetBody(string body)
{
Body = body;
return this;
}
}
Şimdi bu sınıfı nasıl kullanacağınıza bakalım:
Post post = new Post()
.SetTitle("Test")
.SetDateCreated(DateTime.Now)
.SetBody("Just a test");
Bu kodu gördüğümde hemen şu soruyu sorarım: " SetBody
Aradıktan sonra veritabanını sorgular mı?" Bitirdim mi? "Demek için başka bir yöntem çağırmam gerekir mi?"
Zincirleme yöntem çağrıları sınıfı kullanarak kodla ne iletişim kurarPost
?
- Karmaşık bir kurulumum var
- Her yöntem çağrısı bir öncekine dayanır
Bu gerçekten doğru mu? Hayır Post
sınıf yok değil bir karmaşık kurulum var. Başlık, oluşturulma tarihi ve gövde ayarlanması, daha karmaşık bir nihai hedefe yönelik olarak birbirini etkilemez . Yuvarlak bir deliğe kare bir pimi ezdiniz.
Kendine başvurulan yöntem zincirlemesinin dezavantajı, bir şey yapmak için birden çok yöntem çağrısının gerekli olduğunu ve her çağrının sonuncuyu oluşturduğunu bildirmenizdir. Bu doğru değilse, yöntem zincirleme yanlış şeyi diğer programcılara iletiyor olabilir.
İş arkadaşlarınız dediğinde:
Akıcı arayüzler sadece kolaylık sağlamak için değil, anlambilim için de uygulanmalıdır.
Kesinlikle doğruydu. Akıcı bir arayüz veya yöntem zinciri, kendi başına doğru olmayan bir şey iletir.