เมื่อเร็ว ๆ นี้ฉันได้พัฒนา API ของตัวเองและด้วยความสนใจลงทุนในการออกแบบ API ฉันมีความสนใจอย่างมากว่าฉันจะปรับปรุงการออกแบบ API ได้อย่างไร
แง่มุมหนึ่งที่เกิดขึ้นสองสามครั้งคือ (ไม่ใช่โดยผู้ใช้ API ของฉัน แต่ในการสังเกตการอภิปรายเกี่ยวกับหัวข้อ): สิ่งหนึ่งที่ควรรู้เพียงแค่ดูรหัสที่เรียก API ว่ามันกำลังทำอะไรอยู่
ตัวอย่างเช่นดูการสนทนานี้ใน GitHub สำหรับวาทกรรมวาทกรรมมันมีลักษณะดังนี้:
foo.update_pinned(true, true);
เพียงแค่มองไปที่โค้ด (โดยไม่รู้ชื่อพารามิเตอร์เอกสาร ฯลฯ ) เราไม่สามารถเดาได้ว่ามันจะทำอะไร - อาร์กิวเมนต์ที่ 2 หมายถึงอะไร การปรับปรุงที่แนะนำคือการมี:
foo.pin()
foo.unpin()
foo.pin_globally()
และนั่นก็เป็นการล้างสิ่งต่าง ๆ (ข้อโต้แย้งที่สองคือว่าจะตรึง foo ทั่วโลกฉันเดา) และฉันเห็นด้วยในกรณีนี้ภายหลังจะเป็นการปรับปรุงอย่างแน่นอน
แต่ผมเชื่อว่าอาจจะมีกรณีที่วิธีการในการตั้งค่าสถานะที่แตกต่างกัน แต่ที่เกี่ยวข้องเหตุผลจะได้รับการสัมผัสที่ดีกว่าเรียกวิธีหนึ่งมากกว่าคนแยกเป็นสัดส่วนถึงแม้คุณจะไม่ทราบว่าสิ่งที่ทำเพียงแค่มองรหัส (ดังนั้นคุณจะต้องหันไปดูที่ชื่อพารามิเตอร์และเอกสารประกอบเพื่อค้นหา - ซึ่งโดยส่วนตัวแล้วฉันจะทำทุกอย่างไม่ว่าฉันจะไม่คุ้นเคยกับ API)
ตัวอย่างเช่นฉันเปิดเผยหนึ่งวิธีSetVisibility(bool, string, bool)
ในFalconPeerและฉันรับทราบเพียงแค่ดูที่บรรทัด:
falconPeer.SetVisibility(true, "aerw3", true);
คุณคงไม่รู้ว่ามันกำลังทำอะไรอยู่ มันตั้งค่าที่แตกต่างกัน 3 ค่าที่ควบคุม "การมองเห็น" ของfalconPeer
ในแง่ตรรกะ: ยอมรับคำขอเข้าร่วมเฉพาะด้วยรหัสผ่านและตอบกลับคำขอค้นพบ แยกออกมานี้ในวิธีที่ 3 โทรอาจนำไปสู่ผู้ใช้ API เพื่อชุดแง่มุมหนึ่งของ "การมองเห็น" ลืมกับคนอื่น ๆ ชุดว่าผมบังคับให้พวกเขาคิดเกี่ยวกับโดยเฉพาะการเปิดเผยวิธีการหนึ่งที่จะตั้งทุกแง่มุมของ "การมองเห็น" นอกจากนี้เมื่อผู้ใช้ต้องการเปลี่ยนด้านหนึ่งพวกเขาเกือบจะต้องการเปลี่ยนด้านอื่นและตอนนี้สามารถทำได้ในสายเดียว
setSize(10, 20)
ไม่เป็นที่อ่านได้เป็นหรือsetSize(width=10, height=20)
random(distribution='gaussian', mean=0.5, deviation=1)
ในภาษาที่มีพารามิเตอร์ที่บังคับใช้ชื่อ booleans สามารถนำเสนอข้อมูลจำนวนเดียวกันกับการใช้ค่าคงที่ enums / ชื่อดังนั้นพวกเขาสามารถดีใน API
update
foo.update(pinned=true, globally=true)
หรือ:foo.update_pinned(true, globally=true)
. ดังนั้นคำตอบสำหรับคำถามของคุณควรคำนึงถึงคุณสมบัติของภาษาด้วยเพราะ API ที่ดีสำหรับภาษา X อาจไม่ดีสำหรับภาษา Y และ viceversa