हाल ही में मैं अपना खुद का एपीआई विकसित कर रहा हूं और इसके साथ ही एपीआई डिजाइन में निवेशित रुचि मुझे गहरी दिलचस्पी है कि मैं अपने एपीआई डिजाइन को कैसे सुधार सकता हूं।
एक पहलू जो कुछ बार सामने आया है, वह है (मेरे एपीआई के उपयोगकर्ताओं द्वारा नहीं, लेकिन विषय के बारे में मेरी चर्चा में): किसी को एपीआई को कॉल करने वाले कोड को देखकर पता होना चाहिए कि वह क्या कर रहा है ।
उदाहरण के लिए GitHub पर प्रवचन रिपो के लिए इस चर्चा को देखें , यह कुछ इस तरह है:
foo.update_pinned(true, true);
बस कोड को देखकर (पैरामीटर नाम, प्रलेखन आदि को जाने बिना) कोई यह अनुमान नहीं लगा सकता है कि यह क्या करने जा रहा है - 2 तर्क का क्या मतलब है? सुझाए गए सुधार में कुछ ऐसा है:
foo.pin()
foo.unpin()
foo.pin_globally()
और इससे चीजें साफ हो जाती हैं (दूसरा तर्क यह था कि विश्व स्तर पर पिन करना है, मैं अनुमान लगा रहा हूं), और मैं इस मामले में सहमत हूं कि बाद में निश्चित रूप से सुधार होगा।
हालांकि मेरा मानना है कि ऐसे उदाहरण हो सकते हैं जहां अलग-अलग लेकिन तार्किक रूप से संबंधित राज्य को सेट करने के तरीके अलग-अलग लोगों के बजाय एक विधि कॉल के रूप में बेहतर उजागर होंगे, भले ही आपको पता नहीं होगा कि यह कोड को देखकर क्या कर रहा है । (इसलिए आपको यह पता लगाने के लिए पैरामीटर नाम और दस्तावेज देखने के लिए सहारा लेना होगा - जो व्यक्तिगत रूप से मैं हमेशा कोई फर्क नहीं पड़ता अगर मैं एक एपीआई से अपरिचित हूं)।
उदाहरण के लिए, मैं SetVisibility(bool, string, bool)
एक फाल्कनपेयर पर एक विधि का पर्दाफाश करता हूं और मैं स्वीकार करता हूं कि लाइन को देख रहा हूं:
falconPeer.SetVisibility(true, "aerw3", true);
आपको पता नहीं होगा कि यह क्या कर रहा है। यह 3 अलग-अलग मान सेट कर रहा falconPeer
है जो तार्किक अर्थों में "दृश्यता" को नियंत्रित करते हैं: केवल अनुरोधों को स्वीकार करें, केवल पासवर्ड के साथ और खोज अनुरोधों का जवाब दें। इसे 3 विधि कॉलों में विभाजित करने से एपीआई के उपयोगकर्ता को "दृश्यता" के एक पहलू को स्थापित करने की भूल हो सकती है, दूसरों को यह समझने के लिए कि मैं उन्हें "दृश्यता" के सभी पहलुओं को सेट करने के लिए केवल एक विधि को उजागर करने के बारे में सोचने के लिए मजबूर करता हूं । इसके अलावा जब उपयोगकर्ता एक पहलू को बदलना चाहता है तो वे लगभग हमेशा दूसरे पहलू को बदलना चाहते हैं और अब एक कॉल में ऐसा कर सकते हैं।
setSize(10, 20)
रूप में setSize(width=10, height=20)
या के रूप में पठनीय नहीं है random(distribution='gaussian', mean=0.5, deviation=1)
। लागू किए गए नामित मापदंडों वाली भाषाओं में, बूलियां वास्तव में उसी तरह की जानकारी दे सकती हैं, जैसे कि एनम / नामांकित स्थिरांक का उपयोग करना, इसलिए वे एपीआई में अच्छे हो सकते हैं।
update
विधि में बहुत सारी सेटिंग्स को समूहित कर सकते हैंfoo.update(pinned=true, globally=true)
:। या:foo.update_pinned(true, globally=true)
। तो, आपके प्रश्न का उत्तर भी भाषा की विशेषताओं को ध्यान में रखना चाहिए, क्योंकि भाषा X के लिए एक अच्छा एपीआई भाषा Y और उपाध्यक्ष के लिए अच्छा नहीं हो सकता है।