Son zamanlarda kendi API'mı geliştiriyorum ve API tasarımına bu kadar ilgi duyduğumda, API tasarımımı nasıl geliştirebileceğimi çok merak ettim.
Birkaç kez ortaya çıkan bir yönü (API'mın kullanıcıları tarafından değil, konu hakkındaki gözlemli tartışmamda): API'yı ne yaptığını çağıran koda bakarak bilmelisiniz .
Örneğin , söylem repo için GitHub'daki bu tartışmaya bakın , şuna benzer:
foo.update_pinned(true, true);
Sadece koda bakarak (parametre adlarını, dokümantasyonu vb. Bilmeden) ne yapacağını tahmin edemez - 2. argüman ne demektir? Önerilen iyileştirme şuna benzer:
foo.pin()
foo.unpin()
foo.pin_globally()
Ve bu bir şeyleri temizler (2. arg, küresel olarak foo'nun sabitlenip sabitlenmeyeceği idi, sanırım) ve bu durumda daha sonra kesinlikle bir gelişme olacağına katılıyorum.
Ancak, sadece koda bakarak ne yaptığını bilmeseniz bile , farklı ancak mantıksal olarak ilgili durumu ayarlamak için yöntemlerin ayrı olanlardan ziyade bir yöntem çağrısı olarak daha iyi açığa çıkabileceği durumlar olabileceğine inanıyorum . (Bu yüzden parametre adlarına ve belgelerine bakmak için başvurmanız gerekir - bir API'ya aşina olmadığım zaman ne kişisel olarak her zaman yapacağım).
Örneğin SetVisibility(bool, string, bool)
bir FalconPeer üzerinde bir yöntem maruz ve sadece hatta bakarak kabul:
falconPeer.SetVisibility(true, "aerw3", true);
Ne yaptığı hakkında hiçbir fikriniz olmaz. falconPeer
Mantıksal anlamda "görünürlüğünü" kontrol eden 3 farklı değer ayarlıyor : birleştirme isteklerini kabul et, sadece şifre ile ve keşif isteklerine cevap ver. Bunu 3 yöntem çağrısına bölmek, API'nın bir kullanıcısına "görünürlük" ün bir yönünü ayarlamaya ve diğerlerini "görünürlük" ün tüm yönlerini ayarlamak için tek bir yöntemi açığa çıkararak onları düşünmeye zorladığımı ayarlamayı unutmasına neden olabilir . Ayrıca, kullanıcı bir yönü değiştirmek istediğinde neredeyse her zaman başka bir yönü değiştirmek isteyecektir ve şimdi bunu tek bir çağrıda yapabilir.
setSize(10, 20)
okunabilir değil . Zorunlu adlandırılmış parametrelere sahip dillerde booleans, enums / adlandırılmış sabitleri kullanmakla aynı miktarda bilgi iletebilir, böylece API'larda iyi olabilirler . setSize(width=10, height=20)
random(distribution='gaussian', mean=0.5, deviation=1)
update
yöntemle:foo.update(pinned=true, globally=true)
. Veya:foo.update_pinned(true, globally=true)
. Bu nedenle, sorunuzun cevabı dil özelliklerini de dikkate almalıdır, çünkü X dili için iyi bir API Y ve viceversa dili için iyi olmayabilir.