Baru-baru ini saya telah mengembangkan API saya sendiri dan dengan minat yang diinvestasikan dalam desain API, saya sangat tertarik bagaimana saya dapat meningkatkan desain API saya.
Salah satu aspek yang telah muncul beberapa kali adalah (bukan oleh pengguna API saya tetapi dalam diskusi saya mengamati tentang topik): orang harus tahu hanya dengan melihat kode memanggil API apa yang dilakukannya .
Sebagai contoh, lihat diskusi tentang GitHub ini untuk repo wacana , seperti:
foo.update_pinned(true, true);
Hanya dengan melihat kode (tanpa mengetahui nama parameter, dokumentasi, dll.) Orang tidak dapat menebak apa yang akan dilakukan - apa arti argumen ke-2? Perbaikan yang disarankan adalah memiliki sesuatu seperti:
foo.pin()
foo.unpin()
foo.pin_globally()
Dan itu sudah beres (argumen ke-2 adalah apakah akan pin foo secara global, saya kira), dan saya setuju dalam kasus ini nanti akan menjadi perbaikan.
Namun saya percaya mungkin ada contoh di mana metode untuk mengatur keadaan yang berbeda tetapi terkait secara logis akan lebih baik diekspos sebagai satu metode panggilan daripada yang terpisah, meskipun Anda tidak akan tahu apa yang dilakukannya hanya dengan melihat kode . (Jadi Anda harus mencari untuk melihat nama parameter dan dokumentasi untuk mencari tahu - yang secara pribadi saya akan selalu lakukan tidak peduli bagaimana jika saya tidak terbiasa dengan API).
Sebagai contoh saya memaparkan satu metode SetVisibility(bool, string, bool)
pada FalconPeer dan saya mengakui hanya melihat baris:
falconPeer.SetVisibility(true, "aerw3", true);
Anda tidak akan tahu apa yang dilakukannya. Ini menetapkan 3 nilai berbeda yang mengontrol "visibilitas" falconPeer
dalam arti logis: menerima permintaan bergabung, hanya dengan kata sandi dan membalas permintaan penemuan. Membagi ini menjadi 3 metode panggilan dapat menyebabkan pengguna API untuk mengatur satu aspek "visibilitas" lupa untuk mengatur orang lain yang saya paksa mereka pikirkan dengan hanya memaparkan satu metode untuk mengatur semua aspek "visibilitas" . Lebih jauh lagi ketika pengguna ingin mengubah satu aspek mereka hampir selalu ingin mengubah aspek lain dan sekarang dapat melakukannya dalam satu panggilan.
setSize(10, 20)
tidak dapat dibaca seperti setSize(width=10, height=20)
atau random(distribution='gaussian', mean=0.5, deviation=1)
. Dalam bahasa dengan parameter bernama yang dipaksakan, boolean dapat menyampaikan jumlah informasi yang persis sama dengan menggunakan enum / konstanta bernama, sehingga mereka bisa bagus di API.
update
metode:foo.update(pinned=true, globally=true)
. Atau:foo.update_pinned(true, globally=true)
. Jadi, jawaban untuk pertanyaan Anda juga harus mempertimbangkan fitur bahasa, karena API yang baik untuk bahasa X mungkin tidak baik untuk bahasa Y dan sebaliknya.