I am taking a class at my university called "Software Constraints". In the first lectures we were learning how to build good APIs.
A good example we got of a really bad API function is the socket public static void Select(IList checkRead, IList checkWrite, IList checkError, int microseconds);
in C#. The function receives 3 lists of sockets, and destroys them making the user have to clone all the sockets before feeding them into the Select()
. It also has a timeout (in microseconds) which is an int, that sets the maximum time the server can wait for a socket. The limits of this is +/-35 minutes (because it is an int).
In general, an effective API design will have the following characteristics: Easy to read and work with: A well designed API will be easy to work with, and its resources and associated operations can quickly be memorized by developers who work with it constantly.
Consistency. For sure, one important aspect of a good API (if not the most important one) is consistency across endpoints, its structure, the request & response formats and everything that goes into consuming it.
A closed API, on the other hand, is one that individuals can only access through an organization's internal IT estate or a private network.
In API design I've always found this keynote very helpful:
How to Design a Good API and Why it Matters - by Joshua Bloch
Here's an excerpt, I'd recommend reading the whole thing / watching the video.
II. General Principles
- API Should Do One Thing and Do it Well
- API Should Be As Small As Possible But No Smaller
- Implementation Should Not Impact API
- Minimize Accessibility of Everything
- Names Matter–API is a Little Language
- Documentation Matters
- Document Religiously
- Consider Performance Consequences of API Design Decisions
- Effects of API Design Decisions on Performance are Real and Permanent
- API Must Coexist Peacefully with Platform
III. Class Design
- Minimize Mutability
- Subclass Only Where it Makes Sense
- Design and Document for Inheritance or Else Prohibit it
IV. Method Design
- Don't Make the Client Do Anything the Module Could Do
- Don't Violate the Principle of Least Astonishment
- Fail Fast - Report Errors as Soon as Possible After They Occur
- Provide Programmatic Access to All Data Available in String Form
- Overload With Care
- Use Appropriate Parameter and Return Types
- Use Consistent Parameter Ordering Across Methods
- Avoid Long Parameter Lists
- Avoid Return Values that Demand Exceptional Processing
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With