Ya, ada kekurangannya
Kode yang mudah dibaca itu baik, tetapi juga berhati-hatilah dengan apa yang dikomunikasikan kode juga. Ketika metode objek selalu mengembalikan objek, itu mengkomunikasikan beberapa hal:
- Saya memerlukan konfigurasi lanjutan yang belum tentu jelas dengan urutan hal mana yang harus diatur atau dikonfigurasi
- Setiap panggilan metode selanjutnya dibangun berdasarkan yang terakhir
Kasing Penggunaan yang Valid: Kueri Basis Data Ad Hoc
Pustaka kelas ada di sebagian besar setiap bahasa yang memungkinkan Anda untuk query database tanpa menggunakan SQL kode keras. Ambil Entity Framework untuk .NET sebagai contoh:
DBContext db = new DBContext();
List<Post> posts = db.Posts
.Where(post => post.Title.Contains("Test"))
.OrderBy(post => post.DateCreated)
.ToList();
Ini adalah antarmuka yang lancar di mana setiap panggilan metode selanjutnya dibangun di atas yang sebelumnya. Membaca panggilan ini secara logis masuk akal dalam konteks permintaan basis data.
Case Penggunaan Tidak Valid: Gula Sintaksis Untuk Mengatur Properti
Sekarang mari kita gunakan pola yang sama dengan Post
kelas:
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;
}
}
Sekarang mari kita lihat bagaimana Anda akan menggunakan kelas ini:
Post post = new Post()
.SetTitle("Test")
.SetDateCreated(DateTime.Now)
.SetBody("Just a test");
Ketika saya melihat kode ini, saya langsung menanyakan pertanyaan ini: "Setelah menelepon SetBody
, apakah ini meminta basis data? Apakah saya perlu memanggil metode lain untuk mengatakan 'Saya sudah selesai?'"
Apa yang metode panggilan berantai berkomunikasi ke kode menggunakan Post
kelas?
- Saya memiliki pengaturan yang rumit
- Setiap pemanggilan metode dibangun dari yang sebelumnya
Apakah ini benar ? Tidak. Post
Kelas tidak memiliki pengaturan yang rumit. Pengaturan judul, tanggal dibuat dan tubuh tidak membangun satu sama lain menuju tujuan akhir yang lebih rumit. Anda telah menumbuk pasak persegi menjadi lubang bundar.
Kekurangan dari metode self-referential chain adalah bahwa Anda berkomunikasi bahwa beberapa panggilan metode diperlukan untuk melakukan sesuatu, dan bahwa setiap panggilan dibangun dari yang terakhir. Jika ini tidak benar, maka metode chaining bisa mengkomunikasikan hal yang salah kepada programmer lain.
Ketika rekan kerja Anda berkata:
Antarmuka yang lancar tidak harus diimplementasikan hanya untuk kenyamanan, tetapi untuk semantik
Mereka benar sekali. Antarmuka yang lancar, atau metode chaining, mengkomunikasikan sesuatu di dalam dan dari dirinya sendiri yang mungkin tidak benar.