SlideShare una empresa de Scribd logo
1 de 49
Descargar para leer sin conexión
How to Design a Good
    API and Why it Matters



      Joshua Bloch
      Principal Software Engineer

    _How   to Design a Good API and Why it Matters
1
Why is API Design Important?


    • APIs can be among a company's greatest assets
            _ Customers invest heavily: buying, writing, learning
            _ Cost to stop using an API can be prohibitive
            _ Successful public APIs capture customers

    • Can also be among company's greatest liabilities
            _ Bad APIs result in unending stream of support calls

    • Public APIs are forever - one chance to get it right



    _How   to Design a Good API and Why it Matters
2
Why is API Design Important to You?

    • If you program, you are an API designer
            _ Good code is modular–each module has an API

    • Useful modules tend to get reused
            _ Once module has users, can’t change API at will
            _ Good reusable modules are corporate assets

    • Thinking in terms of APIs improves code quality




    _How   to Design a Good API and Why it Matters
3
Characteristics of a Good API

    •      Easy to learn
    •      Easy to use, even without documentation
    •      Hard to misuse
    •      Easy to read and maintain code that uses it
    •      Sufficiently powerful to satisfy requirements
    •      Easy to extend
    •      Appropriate to audience



    _How   to Design a Good API and Why it Matters
4
Outline

       I. The Process of API Design
      II. General Principles
     III. Class Design
     IV. Method Design
      V. Exception Design
     VI. Refactoring API Designs




    _How   to Design a Good API and Why it Matters
5
I. The Process of API Design




    _How   to Design a Good API and Why it Matters
6
Gather Requirements–with a Healthy
    Degree of Skepticism

    • Often you'll get proposed solutions instead
            _ Better solutions may exist

    • Your job is to extract true requirements
            _ Should take the form of use-cases

    • Can be easier and more rewarding to build
           something more general


                 Good
    _How   to Design a Good API and Why it Matters
7
Start with Short Spec–1 Page is Ideal

    • At this stage, agility trumps completeness
    • Bounce spec off as many people as possible
            _ Listen to their input and take it seriously

    • If you keep the spec short, it’s easy to modify
    • Flesh it out as you gain confidence
            _ This necessarily involves coding




    _How   to Design a Good API and Why it Matters
8
Write to Your API Early and Often

    • Start before you've implemented the API
            _ Saves you doing implementation you'll throw away

    • Start before you've even specified it properly
            _ Saves you from writing specs you'll throw away

    • Continue writing to API as you flesh it out
            _ Prevents nasty surprises
            _ Code lives on as examples, unit tests




    _How   to Design a Good API and Why it Matters
9
Writing to SPI is Even More Important


     • Service Provider Interface (SPI)
             _ Plug-in interface enabling multiple implementations
             _ Example: Java Cryptography Extension (JCE)
     • Write multiple plug-ins before release
             _ If you write one, it probably won't support another
             _ If you write two, it will support more with difficulty
             _ If you write three, it will work fine
     • Will Tracz calls this “The Rule of Threes”
            (Confessions of a Used Program Salesman, Addison-Wesley, 1995)



                    Bad
     _How   to Design a Good API and Why it Matters
10
Maintain Realistic Expectations

     • Most API designs are over-constrained
             _ You won't be able to please everyone
             _ Aim to displease everyone equally

     • Expect to make mistakes
             _ A few years of real-world use will flush them out
             _ Expect to evolve API




     _How   to Design a Good API and Why it Matters
11
II. General Principles



     _How   to Design a Good API and Why it Matters
12
API Should Do One Thing and Do it Well


     • Functionality should be easy to explain
             _ If it's hard to name, that's generally a bad sign
             _ Good names drive development
             _ Be amenable to splitting and merging modules




     _How   to Design a Good API and Why it Matters
13
API Should Be As Small As Possible But
     No Smaller

     • API should satisfy its requirements
     • When in doubt leave it out
             _ Functionality, classes, methods, parameters, etc.
             _ You can always add, but you can never remove

     • Conceptual weight more important than bulk
     • Look for a good power-to-weight ratio



     _How   to Design a Good API and Why it Matters
14
Implementation Should Not Impact API

     • Implementation details
             _ Confuse users
             _ Inhibit freedom to change implementation
     • Be aware of what is an implementation detail
             _ Do not overspecify the behavior of methods
             _ For example: do not specify hash functions
             _ All tuning parameters are suspect
     • Don't let implementation details “leak” into API
             _ On-disk and on-the-wire formats, exceptions



     _How   to Design a Good API and Why it Matters
15
Minimize Accessibility of Everything

     • Make classes and members as private as possible
     • Public classes should have no public fields
            (with the exception of constants)

     • This maximizes information hiding
     • Allows modules to be used, understood, built,
            tested, and debugged independently




     _How   to Design a Good API and Why it Matters
16
Names Matter–API is a Little Language


     • Names Should Be Largely Self-Explanatory
             _ Avoid cryptic abbreviations
     • Be consistent–same word means same thing
             _ Throughout API, (Across APIs on the platform)
     • Be regular–strive for symmetry
     • Code should read like prose
        if (car.speed() > 2 * SPEED_LIMIT)
           generateAlert(quot;Watch out for cops!quot;);




     _How   to Design a Good API and Why it Matters
17
Documentation Matters

     Reuse is something that is far easier to say than
     to do. Doing it requires both good design and
     very good documentation. Even when we see
     good design, which is still infrequently, we won't
     see the components reused without good
     documentation.
                - D. L. Parnas, _Software Aging. Proceedings
                  of 16th International Conference Software
                 Engineering, 1994



     _How   to Design a Good API and Why it Matters
18
Document Religiously

     • Document every class, interface, method,
            constructor, parameter, and exception
             _ Class: what an instance represents
             _ Method: contract between method and its client
                      _ Preconditions, postconditions, side-effects
             _ Parameter: indicate units, form, ownership

     • Document state space very carefully




     _How   to Design a Good API and Why it Matters
19
Consider Performance Consequences of
     API Design Decisions

     • Bad decisions can limit performance
             _ Making type mutable
             _ Providing constructor instead of static factory
             _ Using implementation type instead of interface
     • Do not warp API to gain performance
             _ Underlying performance issue will get fixed,
               but headaches will be with you forever
             _ Good design usually coincides with good performance




     _How   to Design a Good API and Why it Matters
20
Effects of API Design Decisions on
     Performance are Real and Permanent

     • Component.getSize() returns Dimension
     • Dimension is mutable
     • Each getSize call must allocate Dimension
     • Causes millions of needless object allocations
     • Alternative added in 1.2; old client code still slow




     _How   to Design a Good API and Why it Matters
21
API Must Coexist Peacefully with Platform

     • Do what is customary
             _ Obey standard naming conventions
             _ Avoid obsolete parameter and return types
             _ Mimic patterns in core APIs and language
     • Take advantage of API-friendly features
             _ Generics, varargs, enums, default arguments
     • Know and avoid API traps and pitfalls
             _ Finalizers, public static final arrays




     _How   to Design a Good API and Why it Matters
22
III. Class Design



     _How   to Design a Good API and Why it Matters
23
Minimize Mutability

     • Classes should be immutable unless there’s a
            good reason to do otherwise
             _ Advantages: simple, thread-safe, reusable
             _ Disadvantage: separate object for each value
     • If mutable, keep state-space small, well-defined
             _ Make clear when it's legal to call which method
     Bad: Date, Calendar
     Good: TimerTask



     _How   to Design a Good API and Why it Matters
24
Subclass Only Where It Makes Sense


     • Subclassing implies substitutability (Liskov)
             _ Subclass only when is-a relationship exists
             _ Otherwise, use composition
     • Public classes should not subclass other public
            classes for ease of implementation
     Bad:                   Properties extends Hashtable
                            Stack extends Vector
     Good: Set extends Collection



     _How   to Design a Good API and Why it Matters
25
Design and Document for Inheritance
     or Else Prohibit it

     • Inheritance violates encapsulation (Snyder, ‘86)
             _ Subclass sensitive to implementation details of
               superclass
     • If you allow subclassing, document self-use
             _ How do methods use one another?
     • Conservative policy: all concrete classes final
     Bad: Many concrete classes in J2SE libraries
     Good: AbstractSet, AbstractMap



     _How   to Design a Good API and Why it Matters
26
IV. Method Design



     _How   to Design a Good API and Why it Matters
27
Don't Make the Client Do Anything the
     Module Could Do

     • Reduce need for boilerplate code
             _ Generally done via cut-and-paste
             _ Ugly, annoying, and error-prone
       import       org.w3c.dom.*;
       import       java.io.*;
       import       javax.xml.transform.*;
       import       javax.xml.transform.dom.*;
       import       javax.xml.transform.stream.*;

       // DOM code to write an XML document to a specified output stream.
       private static final void writeDoc(Document doc, OutputStream out)throws IOException{
         try {
           Transformer t = TransformerFactory.newInstance().newTransformer();
           t.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, doc.getDoctype().getSystemId());
           t.transform(new DOMSource(doc), new StreamResult(out));
         } catch(TransformerException e) {
           throw new AssertionError(e); // Can’t happen!
         }
       }




     _How   to Design a Good API and Why it Matters
28
Don't Violate the Principle of Least
     Astonishment

     • User of API should not be surprised by behavior
             _ It's worth extra implementation effort
             _ It's even worth reduced performance

        public class Thread implements Runnable {
          // Tests whether current thread has been interrupted.
          // Clears the interrupted status of current thread.
          public static boolean interrupted();
        }




     _How   to Design a Good API and Why it Matters
29
Fail Fast–Report Errors as Soon as
     Possible After They Occur

     • Compile time is best - static typing, generics
     • At runtime, first bad method invocation is best
             _ Method should be failure-atomic
        // A Properties instance maps strings to strings
        public class Properties extends Hashtable {
           public Object put(Object key, Object value);

                 // Throws ClassCastException if this properties
                 // contains any keys or values that are not strings
                 public void save(OutputStream out, String comments);
        }




     _How   to Design a Good API and Why it Matters
30
Provide Programmatic Access to All
     Data Available in String Form

     • Otherwise, clients will parse strings
             _ Painful for clients
             _ Worse, turns string format into de facto API
     public class Throwable {
       public void printStackTrace(PrintStream s);
       public StackTraceElement[] getStackTrace(); // Since 1.4
     }
     public final class StackTraceElement {
       public String getFileName();
       public int getLineNumber();
       public String getClassName();
       public String getMethodName();
       public boolean isNativeMethod();
     }

     _How   to Design a Good API and Why it Matters
31
Overload With Care

     • Avoid ambiguous overloadings
             _ Multiple overloadings applicable to same actuals
             _ Conservative: no two with same number of args
     • Just because you can doesn't mean you should
             _ Often better to use a different name
     • If you must provide ambiguous overloadings,
            ensure same behavior for same arguments
     public TreeSet(Collection c); // Ignores order
     public TreeSet(SortedSet s); // Respects order



     _How   to Design a Good API and Why it Matters
32
Use Appropriate Parameter and Return Types


     • Favor interface types over classes for input
             _ Provides flexibility, performance
     • Use most specific possible input parameter type
             _ Moves error from runtime to compile time
     • Don't use string if a better type exists
             _ Strings are cumbersome, error-prone, and slow
     • Don't use floating point for monetary values
             _ Binary floating point causes inexact results!
     • Use double (64 bits) rather than float (32 bits)
             _ Precision loss is real, performance loss negligible




     _How   to Design a Good API and Why it Matters
33
Use Consistent Parameter Ordering
     Across Methods

     • Especially important if parameter types identical
       #include <string.h>
       char *strcpy (char *dest, char *src);
       void bcopy   (void *src, void *dst, int n);


       java.util.Collections – first parameter always
       collection to be modified or queried
       java.util.concurrent – time always specified as
       long delay, TimeUnit unit




     _How   to Design a Good API and Why it Matters
34
Avoid Long Parameter Lists

     • Three or fewer parameters is ideal
             _ More and users will have to refer to docs
     • Long lists of identically typed params harmful
             _ Programmers transpose parameters by mistake
             _ Programs still compile, run, but misbehave!
     • Two techniques for shortening parameter lists
             _ Break up method
             _ Create helper class to hold parameters
     // Eleven parameters including four consecutive ints
     HWND CreateWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName,
           DWORD dwStyle, int x, int y, int nWidth, int nHeight,
           HWND hWndParent, HMENU hMenu, HINSTANCE hInstance,
           LPVOID lpParam);


     _How   to Design a Good API and Why it Matters
35
Avoid Return Values that Demand
     Exceptional Processing

     • return zero-length array or empty collection, not null

        package java.awt.image;
        public interface BufferedImageOp {
          // Returns the rendering hints for this operation,
          // or null if no hints have been set.
          public RenderingHints getRenderingHints();
        }




     _How   to Design a Good API and Why it Matters
36
V. Exception Design




     _How   to Design a Good API and Why it Matters
37
Throw Exceptions to Indicate
     Exceptional Conditions

     • Don’t force client to use exceptions for control flow
              private byte[] a = new byte[BUF_SIZE];
              void processBuffer (ByteBuffer buf) {
                try {
                  while (true) {
                    buf.get(a);
                    processBytes(tmp, BUF_SIZE);
                  }
                } catch (BufferUnderflowException e) {
                  int remaining = buf.remaining();
                  buf.get(a, 0, remaining);
                  processBytes(bufArray, remaining);
                }
              }
     • Conversely, don’t fail silently
               ThreadGroup.enumerate(Thread[] list)
     _How   to Design a Good API and Why it Matters
38
Favor Unchecked Exceptions

     • Checked – client must take recovery action
     • Unchecked – programming error
     • Overuse of checked exceptions causes boilerplate
     try {
         Foo f = (Foo) super.clone();
         ....
     } catch (CloneNotSupportedException e) {
         // This can't happen, since we’re Cloneable
         throw new AssertionError();
     }



     _How   to Design a Good API and Why it Matters
39
Include Failure-Capture Information in
     Exceptions

     • Allows diagnosis and repair or recovery
     • For unchecked exceptions, message suffices
     • For checked exceptions, provide accessors




     _How   to Design a Good API and Why it Matters
40
VI. Refactoring API Designs




     _How   to Design a Good API and Why it Matters
41
1. Sublist Operations in Vector

     public class Vector {
         public int indexOf(Object elem, int index);
         public int lastIndexOf(Object elem, int index);
         ...
     }


     • Not very powerful - supports only search
     • Hard too use without documentation




     _How   to Design a Good API and Why it Matters
42
Sublist Operations Refactored

     public interface List {
         List subList(int fromIndex, int toIndex);
         ...
     }


     • Extremely powerful - supports all operations
     • Use of interface reduces conceptual weight
             _ High power-to-weight ratio
     • Easy to use without documentation


     _How   to Design a Good API and Why it Matters
43
2. Thread-Local Variables

      // Broken - inappropriate use of String as capability.
       // Keys constitute a shared global namespace.
       public class ThreadLocal {
           private ThreadLocal() { } // Non-instantiable

                 // Sets current thread’s value for named variable.
                 public static void set(String key, Object value);

                 // Returns current thread’s value for named variable.
                 public static Object get(String key);
      }




     _How   to Design a Good API and Why it Matters
44
Thread-Local Variables Refactored (1)

      public class ThreadLocal {
           private ThreadLocal() { } // Noninstantiable

                public static class Key { Key() { } }
                // Generates a unique, unforgeable key
                public static Key getKey() { return new Key(); }
                public static void set(Key key, Object value);
                public static Object get(Key key);
      }


     • Works, but requires boilerplate code to use
      static ThreadLocal.Key serialNumberKey = ThreadLocal.getKey();
      ThreadLocal.set(serialNumberKey, nextSerialNumber());
      System.out.println(ThreadLocal.get(serialNumberKey));




     _How   to Design a Good API and Why it Matters
45
Thread-Local Variables Refactored (2)


      public class ThreadLocal {
          public ThreadLocal() { }
          public void set(Object value);
          public Object get();
      }


     • Removes clutter from API and client code
      static ThreadLocal serialNumber = new ThreadLocal();
      serialNumber.set(nextSerialNumber());
      System.out.println(serialNumber.get());




     _How   to Design a Good API and Why it Matters
46
Conclusion

     • API design is a noble and rewarding craft
             _ Improves the lot of programmers, end-users,
               companies
     • This talk covered some heuristics of the craft
             _ Don't adhere to them slavishly, but...
             _ Don't violate them without good reason
     • API design is tough
             _ Not a solitary activity
             _ Perfection is unachievable, but try anyway



     _How   to Design a Good API and Why it Matters
47
Shameless Self-Promotion




     _How   to Design a Good API and Why it Matters
48
How to Design a Good
     API and Why it Matters



       Joshua Bloch
       Principal Software Engineer

     _How   to Design a Good API and Why it Matters
49

Más contenido relacionado

La actualidad más candente

API Management in Digital Transformation
API Management in Digital TransformationAPI Management in Digital Transformation
API Management in Digital TransformationAditya Thatte
 
REST-API introduction for developers
REST-API introduction for developersREST-API introduction for developers
REST-API introduction for developersPatrick Savalle
 
Introduction to REST - API
Introduction to REST - APIIntroduction to REST - API
Introduction to REST - APIChetan Gadodia
 
Postman Webinar: "API Governance with Postman"
Postman Webinar: "API Governance with Postman"Postman Webinar: "API Governance with Postman"
Postman Webinar: "API Governance with Postman"Postman
 
OpenAPI Intro (1).pdf
OpenAPI Intro (1).pdfOpenAPI Intro (1).pdf
OpenAPI Intro (1).pdfPostman
 
API Frenzy: API Strategy 101
API Frenzy: API Strategy 101API Frenzy: API Strategy 101
API Frenzy: API Strategy 101Akana
 
Postman Introduction
Postman IntroductionPostman Introduction
Postman IntroductionRahul Agarwal
 
What is an API Gateway?
What is an API Gateway?What is an API Gateway?
What is an API Gateway?LunchBadger
 
API Security Best Practices & Guidelines
API Security Best Practices & GuidelinesAPI Security Best Practices & Guidelines
API Security Best Practices & GuidelinesPrabath Siriwardena
 
API Management Within a Microservices Architecture
API Management Within a Microservices Architecture API Management Within a Microservices Architecture
API Management Within a Microservices Architecture Nadeesha Gamage
 

La actualidad más candente (20)

API Management in Digital Transformation
API Management in Digital TransformationAPI Management in Digital Transformation
API Management in Digital Transformation
 
API
APIAPI
API
 
Api presentation
Api presentationApi presentation
Api presentation
 
REST-API introduction for developers
REST-API introduction for developersREST-API introduction for developers
REST-API introduction for developers
 
REST & RESTful Web Services
REST & RESTful Web ServicesREST & RESTful Web Services
REST & RESTful Web Services
 
Introduction to REST - API
Introduction to REST - APIIntroduction to REST - API
Introduction to REST - API
 
Web API Basics
Web API BasicsWeb API Basics
Web API Basics
 
Postman Webinar: "API Governance with Postman"
Postman Webinar: "API Governance with Postman"Postman Webinar: "API Governance with Postman"
Postman Webinar: "API Governance with Postman"
 
OpenAPI Intro (1).pdf
OpenAPI Intro (1).pdfOpenAPI Intro (1).pdf
OpenAPI Intro (1).pdf
 
An Introduction To REST API
An Introduction To REST APIAn Introduction To REST API
An Introduction To REST API
 
React Native Workshop
React Native WorkshopReact Native Workshop
React Native Workshop
 
REST API
REST APIREST API
REST API
 
What's an api
What's an apiWhat's an api
What's an api
 
API Frenzy: API Strategy 101
API Frenzy: API Strategy 101API Frenzy: API Strategy 101
API Frenzy: API Strategy 101
 
Postman Introduction
Postman IntroductionPostman Introduction
Postman Introduction
 
What is an API Gateway?
What is an API Gateway?What is an API Gateway?
What is an API Gateway?
 
API Security Best Practices & Guidelines
API Security Best Practices & GuidelinesAPI Security Best Practices & Guidelines
API Security Best Practices & Guidelines
 
API Design- Best Practices
API Design-   Best PracticesAPI Design-   Best Practices
API Design- Best Practices
 
Architecture: Microservices
Architecture: MicroservicesArchitecture: Microservices
Architecture: Microservices
 
API Management Within a Microservices Architecture
API Management Within a Microservices Architecture API Management Within a Microservices Architecture
API Management Within a Microservices Architecture
 

Destacado

Api anti patterns
Api anti patternsApi anti patterns
Api anti patternsMike Pearce
 
APIs: the Glue of Cloud Computing
APIs: the Glue of Cloud ComputingAPIs: the Glue of Cloud Computing
APIs: the Glue of Cloud Computing3scale
 
Design Beautiful REST + JSON APIs
Design Beautiful REST + JSON APIsDesign Beautiful REST + JSON APIs
Design Beautiful REST + JSON APIsStormpath
 
Microsoft v Google UI Design Debate Presentation (2015)
Microsoft v Google UI Design Debate Presentation (2015)Microsoft v Google UI Design Debate Presentation (2015)
Microsoft v Google UI Design Debate Presentation (2015)Ben Freeman
 
Rdf with contexts
Rdf with contextsRdf with contexts
Rdf with contextsPat Hayes
 
Hourglass Interfaces for C++ APIs - CppCon 2014
Hourglass Interfaces for C++ APIs - CppCon 2014Hourglass Interfaces for C++ APIs - CppCon 2014
Hourglass Interfaces for C++ APIs - CppCon 2014Stefanus Du Toit
 
Dependency Inversion Principle
Dependency Inversion PrincipleDependency Inversion Principle
Dependency Inversion PrincipleTom Philip
 
Goals Of Software Design - The main goals
Goals Of Software Design - The main goalsGoals Of Software Design - The main goals
Goals Of Software Design - The main goalsparag
 
170215 tech tourgrowth502017
170215 tech tourgrowth502017170215 tech tourgrowth502017
170215 tech tourgrowth502017Gaudefroy Ariane
 
Google Search Engine
Google Search Engine Google Search Engine
Google Search Engine Aniket_1415
 
Best Practices for Architecting a Pragmatic Web API.
Best Practices for Architecting a Pragmatic Web API.Best Practices for Architecting a Pragmatic Web API.
Best Practices for Architecting a Pragmatic Web API.Mario Cardinal
 
Some REST Design Patterns (and Anti-Patterns) - SOA Symposium 2009
Some REST Design Patterns (and Anti-Patterns) - SOA Symposium 2009Some REST Design Patterns (and Anti-Patterns) - SOA Symposium 2009
Some REST Design Patterns (and Anti-Patterns) - SOA Symposium 2009Cesare Pautasso
 
API 101 - Understanding APIs.
API 101 - Understanding APIs.API 101 - Understanding APIs.
API 101 - Understanding APIs.Kirsten Hunter
 
Designing better user interfaces
Designing better user interfacesDesigning better user interfaces
Designing better user interfacesJohan Ronsse
 
Questions product managers should ask customers
Questions product managers should ask customersQuestions product managers should ask customers
Questions product managers should ask customersProductPlan
 
Real World API Business Models That Worked
Real World API Business Models That WorkedReal World API Business Models That Worked
Real World API Business Models That WorkedProgrammableWeb
 

Destacado (20)

Api anti patterns
Api anti patternsApi anti patterns
Api anti patterns
 
APIs: the Glue of Cloud Computing
APIs: the Glue of Cloud ComputingAPIs: the Glue of Cloud Computing
APIs: the Glue of Cloud Computing
 
RESTful API Design, Second Edition
RESTful API Design, Second EditionRESTful API Design, Second Edition
RESTful API Design, Second Edition
 
API Design - 3rd Edition
API Design - 3rd EditionAPI Design - 3rd Edition
API Design - 3rd Edition
 
Design Beautiful REST + JSON APIs
Design Beautiful REST + JSON APIsDesign Beautiful REST + JSON APIs
Design Beautiful REST + JSON APIs
 
Microsoft v Google UI Design Debate Presentation (2015)
Microsoft v Google UI Design Debate Presentation (2015)Microsoft v Google UI Design Debate Presentation (2015)
Microsoft v Google UI Design Debate Presentation (2015)
 
Rdf with contexts
Rdf with contextsRdf with contexts
Rdf with contexts
 
Hourglass Interfaces for C++ APIs - CppCon 2014
Hourglass Interfaces for C++ APIs - CppCon 2014Hourglass Interfaces for C++ APIs - CppCon 2014
Hourglass Interfaces for C++ APIs - CppCon 2014
 
Dependency Inversion Principle
Dependency Inversion PrincipleDependency Inversion Principle
Dependency Inversion Principle
 
Goals Of Software Design - The main goals
Goals Of Software Design - The main goalsGoals Of Software Design - The main goals
Goals Of Software Design - The main goals
 
170215 tech tourgrowth502017
170215 tech tourgrowth502017170215 tech tourgrowth502017
170215 tech tourgrowth502017
 
Google Search Engine
Google Search Engine Google Search Engine
Google Search Engine
 
Best Practices for Architecting a Pragmatic Web API.
Best Practices for Architecting a Pragmatic Web API.Best Practices for Architecting a Pragmatic Web API.
Best Practices for Architecting a Pragmatic Web API.
 
Some REST Design Patterns (and Anti-Patterns) - SOA Symposium 2009
Some REST Design Patterns (and Anti-Patterns) - SOA Symposium 2009Some REST Design Patterns (and Anti-Patterns) - SOA Symposium 2009
Some REST Design Patterns (and Anti-Patterns) - SOA Symposium 2009
 
API 101 - Understanding APIs.
API 101 - Understanding APIs.API 101 - Understanding APIs.
API 101 - Understanding APIs.
 
Designing better user interfaces
Designing better user interfacesDesigning better user interfaces
Designing better user interfaces
 
APIs: The New Security Layer
APIs: The New Security LayerAPIs: The New Security Layer
APIs: The New Security Layer
 
Google Brand Analysis
Google Brand AnalysisGoogle Brand Analysis
Google Brand Analysis
 
Questions product managers should ask customers
Questions product managers should ask customersQuestions product managers should ask customers
Questions product managers should ask customers
 
Real World API Business Models That Worked
Real World API Business Models That WorkedReal World API Business Models That Worked
Real World API Business Models That Worked
 

Similar a How To Design A Good A P I And Why It Matters G O O G L E

How to design good api
How to design good apiHow to design good api
How to design good apiOsama Shakir
 
The Power Of Refactoring (PHPNW)
The Power Of Refactoring (PHPNW)The Power Of Refactoring (PHPNW)
The Power Of Refactoring (PHPNW)Stefan Koopmanschap
 
Sap web dynpro – practices for better functionality
Sap web dynpro – practices for better functionalitySap web dynpro – practices for better functionality
Sap web dynpro – practices for better functionalityanjalirao366
 
Dev Learn Handout - Session 604
Dev Learn Handout - Session 604Dev Learn Handout - Session 604
Dev Learn Handout - Session 604Chad Udell
 
MuleSoft Surat Meetup#39 - Pragmatic API Led Connectivity
MuleSoft Surat Meetup#39 - Pragmatic API Led ConnectivityMuleSoft Surat Meetup#39 - Pragmatic API Led Connectivity
MuleSoft Surat Meetup#39 - Pragmatic API Led ConnectivityJitendra Bafna
 
API Specifications and Best Practices | MuleSoft Mysore Meetup #4
API Specifications and Best Practices | MuleSoft Mysore Meetup #4API Specifications and Best Practices | MuleSoft Mysore Meetup #4
API Specifications and Best Practices | MuleSoft Mysore Meetup #4MysoreMuleSoftMeetup
 
How to Become an SAP ABAP Developer? Career Scope, Salary, Skills, Future Tre...
How to Become an SAP ABAP Developer? Career Scope, Salary, Skills, Future Tre...How to Become an SAP ABAP Developer? Career Scope, Salary, Skills, Future Tre...
How to Become an SAP ABAP Developer? Career Scope, Salary, Skills, Future Tre...Aspire Techsoft Academy
 
Designing Good API & Its Importance
Designing Good API & Its ImportanceDesigning Good API & Its Importance
Designing Good API & Its ImportanceImran M Yousuf
 
Why your APIs should fly first class
Why your APIs should fly first classWhy your APIs should fly first class
Why your APIs should fly first classLibbySchulze
 
Trouble with Performance Debugging? Not Anymore with Choreo, the AI-Assisted ...
Trouble with Performance Debugging? Not Anymore with Choreo, the AI-Assisted ...Trouble with Performance Debugging? Not Anymore with Choreo, the AI-Assisted ...
Trouble with Performance Debugging? Not Anymore with Choreo, the AI-Assisted ...WSO2
 
Using Artificial Intelligence in Software Engineering
Using Artificial Intelligence in Software EngineeringUsing Artificial Intelligence in Software Engineering
Using Artificial Intelligence in Software EngineeringFaculty of Computer Science
 
Your API Sucks! Why developers hang up and how to stop that.
Your API Sucks! Why developers hang up and how to stop that.Your API Sucks! Why developers hang up and how to stop that.
Your API Sucks! Why developers hang up and how to stop that.Apigee | Google Cloud
 
The Power Of Refactoring (4developers Krakow)
The Power Of Refactoring (4developers Krakow)The Power Of Refactoring (4developers Krakow)
The Power Of Refactoring (4developers Krakow)Stefan Koopmanschap
 
End to End Testing: Bug Squashing for API Developers
End to End Testing: Bug Squashing for API Developers End to End Testing: Bug Squashing for API Developers
End to End Testing: Bug Squashing for API Developers Apigee | Google Cloud
 
Crafting a Cloud Native API Platform to Accelerate Your Platform Maturity - B...
Crafting a Cloud Native API Platform to Accelerate Your Platform Maturity - B...Crafting a Cloud Native API Platform to Accelerate Your Platform Maturity - B...
Crafting a Cloud Native API Platform to Accelerate Your Platform Maturity - B...Nordic APIs
 

Similar a How To Design A Good A P I And Why It Matters G O O G L E (20)

Keynoteof A P I
Keynoteof A P IKeynoteof A P I
Keynoteof A P I
 
How to design good api
How to design good apiHow to design good api
How to design good api
 
The Power Of Refactoring (PHPNW)
The Power Of Refactoring (PHPNW)The Power Of Refactoring (PHPNW)
The Power Of Refactoring (PHPNW)
 
How to define an api
How to define an apiHow to define an api
How to define an api
 
Sap web dynpro – practices for better functionality
Sap web dynpro – practices for better functionalitySap web dynpro – practices for better functionality
Sap web dynpro – practices for better functionality
 
Dev Learn Handout - Session 604
Dev Learn Handout - Session 604Dev Learn Handout - Session 604
Dev Learn Handout - Session 604
 
MuleSoft Surat Meetup#39 - Pragmatic API Led Connectivity
MuleSoft Surat Meetup#39 - Pragmatic API Led ConnectivityMuleSoft Surat Meetup#39 - Pragmatic API Led Connectivity
MuleSoft Surat Meetup#39 - Pragmatic API Led Connectivity
 
The Power of Refactoring
The Power of RefactoringThe Power of Refactoring
The Power of Refactoring
 
API Specifications and Best Practices | MuleSoft Mysore Meetup #4
API Specifications and Best Practices | MuleSoft Mysore Meetup #4API Specifications and Best Practices | MuleSoft Mysore Meetup #4
API Specifications and Best Practices | MuleSoft Mysore Meetup #4
 
How to Become an SAP ABAP Developer? Career Scope, Salary, Skills, Future Tre...
How to Become an SAP ABAP Developer? Career Scope, Salary, Skills, Future Tre...How to Become an SAP ABAP Developer? Career Scope, Salary, Skills, Future Tre...
How to Become an SAP ABAP Developer? Career Scope, Salary, Skills, Future Tre...
 
Designing Good API & Its Importance
Designing Good API & Its ImportanceDesigning Good API & Its Importance
Designing Good API & Its Importance
 
API presentation
API presentationAPI presentation
API presentation
 
Why your APIs should fly first class
Why your APIs should fly first classWhy your APIs should fly first class
Why your APIs should fly first class
 
Trouble with Performance Debugging? Not Anymore with Choreo, the AI-Assisted ...
Trouble with Performance Debugging? Not Anymore with Choreo, the AI-Assisted ...Trouble with Performance Debugging? Not Anymore with Choreo, the AI-Assisted ...
Trouble with Performance Debugging? Not Anymore with Choreo, the AI-Assisted ...
 
Using Artificial Intelligence in Software Engineering
Using Artificial Intelligence in Software EngineeringUsing Artificial Intelligence in Software Engineering
Using Artificial Intelligence in Software Engineering
 
Effective API Design
Effective API DesignEffective API Design
Effective API Design
 
Your API Sucks! Why developers hang up and how to stop that.
Your API Sucks! Why developers hang up and how to stop that.Your API Sucks! Why developers hang up and how to stop that.
Your API Sucks! Why developers hang up and how to stop that.
 
The Power Of Refactoring (4developers Krakow)
The Power Of Refactoring (4developers Krakow)The Power Of Refactoring (4developers Krakow)
The Power Of Refactoring (4developers Krakow)
 
End to End Testing: Bug Squashing for API Developers
End to End Testing: Bug Squashing for API Developers End to End Testing: Bug Squashing for API Developers
End to End Testing: Bug Squashing for API Developers
 
Crafting a Cloud Native API Platform to Accelerate Your Platform Maturity - B...
Crafting a Cloud Native API Platform to Accelerate Your Platform Maturity - B...Crafting a Cloud Native API Platform to Accelerate Your Platform Maturity - B...
Crafting a Cloud Native API Platform to Accelerate Your Platform Maturity - B...
 

Último

NO1 Certified kala jadu karne wale ka contact number kala jadu karne wale bab...
NO1 Certified kala jadu karne wale ka contact number kala jadu karne wale bab...NO1 Certified kala jadu karne wale ka contact number kala jadu karne wale bab...
NO1 Certified kala jadu karne wale ka contact number kala jadu karne wale bab...Amil baba
 
What is sip and What are its Benefits in 2024
What is sip and What are its Benefits in 2024What is sip and What are its Benefits in 2024
What is sip and What are its Benefits in 2024prajwalgopocket
 
Hello this ppt is about seminar final project
Hello this ppt is about seminar final projectHello this ppt is about seminar final project
Hello this ppt is about seminar final projectninnasirsi
 
Overview of Inkel Unlisted Shares Price.
Overview of Inkel Unlisted Shares Price.Overview of Inkel Unlisted Shares Price.
Overview of Inkel Unlisted Shares Price.Precize Formely Leadoff
 
Market Morning Updates for 16th April 2024
Market Morning Updates for 16th April 2024Market Morning Updates for 16th April 2024
Market Morning Updates for 16th April 2024Devarsh Vakil
 
The top 4 AI cryptocurrencies to know in 2024 .pdf
The top 4 AI cryptocurrencies to know in 2024 .pdfThe top 4 AI cryptocurrencies to know in 2024 .pdf
The top 4 AI cryptocurrencies to know in 2024 .pdfJhon Thompson
 
Stock Market Brief Deck FOR 4/17 video.pdf
Stock Market Brief Deck FOR 4/17 video.pdfStock Market Brief Deck FOR 4/17 video.pdf
Stock Market Brief Deck FOR 4/17 video.pdfMichael Silva
 
The AES Investment Code - the go-to counsel for the most well-informed, wise...
The AES Investment Code -  the go-to counsel for the most well-informed, wise...The AES Investment Code -  the go-to counsel for the most well-informed, wise...
The AES Investment Code - the go-to counsel for the most well-informed, wise...AES International
 
Financial Preparation for Millennia.pptx
Financial Preparation for Millennia.pptxFinancial Preparation for Millennia.pptx
Financial Preparation for Millennia.pptxsimon978302
 
Banking: Commercial and Central Banking.pptx
Banking: Commercial and Central Banking.pptxBanking: Commercial and Central Banking.pptx
Banking: Commercial and Central Banking.pptxANTHONYAKINYOSOYE1
 
Kempen ' UK DB Endgame Paper Apr 24 final3.pdf
Kempen ' UK DB Endgame Paper Apr 24 final3.pdfKempen ' UK DB Endgame Paper Apr 24 final3.pdf
Kempen ' UK DB Endgame Paper Apr 24 final3.pdfHenry Tapper
 
『澳洲文凭』买科廷大学毕业证书成绩单办理澳洲Curtin文凭学位证书
『澳洲文凭』买科廷大学毕业证书成绩单办理澳洲Curtin文凭学位证书『澳洲文凭』买科廷大学毕业证书成绩单办理澳洲Curtin文凭学位证书
『澳洲文凭』买科廷大学毕业证书成绩单办理澳洲Curtin文凭学位证书rnrncn29
 
Gender and caste discrimination in india
Gender and caste discrimination in indiaGender and caste discrimination in india
Gender and caste discrimination in indiavandanasingh01072003
 
Global Economic Outlook, 2024 - Scholaride Consulting
Global Economic Outlook, 2024 - Scholaride ConsultingGlobal Economic Outlook, 2024 - Scholaride Consulting
Global Economic Outlook, 2024 - Scholaride Consultingswastiknandyofficial
 
The Inspirational Story of Julio Herrera Velutini - Global Finance Leader
The Inspirational Story of Julio Herrera Velutini - Global Finance LeaderThe Inspirational Story of Julio Herrera Velutini - Global Finance Leader
The Inspirational Story of Julio Herrera Velutini - Global Finance LeaderArianna Varetto
 
Financial analysis on Risk and Return.ppt
Financial analysis on Risk and Return.pptFinancial analysis on Risk and Return.ppt
Financial analysis on Risk and Return.ppttadegebreyesus
 
Uae-NO1 Black Magic Specialist In Lahore Black magic In Pakistan Kala Ilam Ex...
Uae-NO1 Black Magic Specialist In Lahore Black magic In Pakistan Kala Ilam Ex...Uae-NO1 Black Magic Specialist In Lahore Black magic In Pakistan Kala Ilam Ex...
Uae-NO1 Black Magic Specialist In Lahore Black magic In Pakistan Kala Ilam Ex...Amil baba
 
Liquidity Decisions in Financial management
Liquidity Decisions in Financial managementLiquidity Decisions in Financial management
Liquidity Decisions in Financial managementshrutisingh143670
 
2024 Q1 Crypto Industry Report | CoinGecko
2024 Q1 Crypto Industry Report | CoinGecko2024 Q1 Crypto Industry Report | CoinGecko
2024 Q1 Crypto Industry Report | CoinGeckoCoinGecko
 
Money Forward Integrated Report “Forward Map” 2024
Money Forward Integrated Report “Forward Map” 2024Money Forward Integrated Report “Forward Map” 2024
Money Forward Integrated Report “Forward Map” 2024Money Forward
 

Último (20)

NO1 Certified kala jadu karne wale ka contact number kala jadu karne wale bab...
NO1 Certified kala jadu karne wale ka contact number kala jadu karne wale bab...NO1 Certified kala jadu karne wale ka contact number kala jadu karne wale bab...
NO1 Certified kala jadu karne wale ka contact number kala jadu karne wale bab...
 
What is sip and What are its Benefits in 2024
What is sip and What are its Benefits in 2024What is sip and What are its Benefits in 2024
What is sip and What are its Benefits in 2024
 
Hello this ppt is about seminar final project
Hello this ppt is about seminar final projectHello this ppt is about seminar final project
Hello this ppt is about seminar final project
 
Overview of Inkel Unlisted Shares Price.
Overview of Inkel Unlisted Shares Price.Overview of Inkel Unlisted Shares Price.
Overview of Inkel Unlisted Shares Price.
 
Market Morning Updates for 16th April 2024
Market Morning Updates for 16th April 2024Market Morning Updates for 16th April 2024
Market Morning Updates for 16th April 2024
 
The top 4 AI cryptocurrencies to know in 2024 .pdf
The top 4 AI cryptocurrencies to know in 2024 .pdfThe top 4 AI cryptocurrencies to know in 2024 .pdf
The top 4 AI cryptocurrencies to know in 2024 .pdf
 
Stock Market Brief Deck FOR 4/17 video.pdf
Stock Market Brief Deck FOR 4/17 video.pdfStock Market Brief Deck FOR 4/17 video.pdf
Stock Market Brief Deck FOR 4/17 video.pdf
 
The AES Investment Code - the go-to counsel for the most well-informed, wise...
The AES Investment Code -  the go-to counsel for the most well-informed, wise...The AES Investment Code -  the go-to counsel for the most well-informed, wise...
The AES Investment Code - the go-to counsel for the most well-informed, wise...
 
Financial Preparation for Millennia.pptx
Financial Preparation for Millennia.pptxFinancial Preparation for Millennia.pptx
Financial Preparation for Millennia.pptx
 
Banking: Commercial and Central Banking.pptx
Banking: Commercial and Central Banking.pptxBanking: Commercial and Central Banking.pptx
Banking: Commercial and Central Banking.pptx
 
Kempen ' UK DB Endgame Paper Apr 24 final3.pdf
Kempen ' UK DB Endgame Paper Apr 24 final3.pdfKempen ' UK DB Endgame Paper Apr 24 final3.pdf
Kempen ' UK DB Endgame Paper Apr 24 final3.pdf
 
『澳洲文凭』买科廷大学毕业证书成绩单办理澳洲Curtin文凭学位证书
『澳洲文凭』买科廷大学毕业证书成绩单办理澳洲Curtin文凭学位证书『澳洲文凭』买科廷大学毕业证书成绩单办理澳洲Curtin文凭学位证书
『澳洲文凭』买科廷大学毕业证书成绩单办理澳洲Curtin文凭学位证书
 
Gender and caste discrimination in india
Gender and caste discrimination in indiaGender and caste discrimination in india
Gender and caste discrimination in india
 
Global Economic Outlook, 2024 - Scholaride Consulting
Global Economic Outlook, 2024 - Scholaride ConsultingGlobal Economic Outlook, 2024 - Scholaride Consulting
Global Economic Outlook, 2024 - Scholaride Consulting
 
The Inspirational Story of Julio Herrera Velutini - Global Finance Leader
The Inspirational Story of Julio Herrera Velutini - Global Finance LeaderThe Inspirational Story of Julio Herrera Velutini - Global Finance Leader
The Inspirational Story of Julio Herrera Velutini - Global Finance Leader
 
Financial analysis on Risk and Return.ppt
Financial analysis on Risk and Return.pptFinancial analysis on Risk and Return.ppt
Financial analysis on Risk and Return.ppt
 
Uae-NO1 Black Magic Specialist In Lahore Black magic In Pakistan Kala Ilam Ex...
Uae-NO1 Black Magic Specialist In Lahore Black magic In Pakistan Kala Ilam Ex...Uae-NO1 Black Magic Specialist In Lahore Black magic In Pakistan Kala Ilam Ex...
Uae-NO1 Black Magic Specialist In Lahore Black magic In Pakistan Kala Ilam Ex...
 
Liquidity Decisions in Financial management
Liquidity Decisions in Financial managementLiquidity Decisions in Financial management
Liquidity Decisions in Financial management
 
2024 Q1 Crypto Industry Report | CoinGecko
2024 Q1 Crypto Industry Report | CoinGecko2024 Q1 Crypto Industry Report | CoinGecko
2024 Q1 Crypto Industry Report | CoinGecko
 
Money Forward Integrated Report “Forward Map” 2024
Money Forward Integrated Report “Forward Map” 2024Money Forward Integrated Report “Forward Map” 2024
Money Forward Integrated Report “Forward Map” 2024
 

How To Design A Good A P I And Why It Matters G O O G L E

  • 1. How to Design a Good API and Why it Matters Joshua Bloch Principal Software Engineer _How to Design a Good API and Why it Matters 1
  • 2. Why is API Design Important? • APIs can be among a company's greatest assets _ Customers invest heavily: buying, writing, learning _ Cost to stop using an API can be prohibitive _ Successful public APIs capture customers • Can also be among company's greatest liabilities _ Bad APIs result in unending stream of support calls • Public APIs are forever - one chance to get it right _How to Design a Good API and Why it Matters 2
  • 3. Why is API Design Important to You? • If you program, you are an API designer _ Good code is modular–each module has an API • Useful modules tend to get reused _ Once module has users, can’t change API at will _ Good reusable modules are corporate assets • Thinking in terms of APIs improves code quality _How to Design a Good API and Why it Matters 3
  • 4. Characteristics of a Good API • Easy to learn • Easy to use, even without documentation • Hard to misuse • Easy to read and maintain code that uses it • Sufficiently powerful to satisfy requirements • Easy to extend • Appropriate to audience _How to Design a Good API and Why it Matters 4
  • 5. Outline I. The Process of API Design II. General Principles III. Class Design IV. Method Design V. Exception Design VI. Refactoring API Designs _How to Design a Good API and Why it Matters 5
  • 6. I. The Process of API Design _How to Design a Good API and Why it Matters 6
  • 7. Gather Requirements–with a Healthy Degree of Skepticism • Often you'll get proposed solutions instead _ Better solutions may exist • Your job is to extract true requirements _ Should take the form of use-cases • Can be easier and more rewarding to build something more general Good _How to Design a Good API and Why it Matters 7
  • 8. Start with Short Spec–1 Page is Ideal • At this stage, agility trumps completeness • Bounce spec off as many people as possible _ Listen to their input and take it seriously • If you keep the spec short, it’s easy to modify • Flesh it out as you gain confidence _ This necessarily involves coding _How to Design a Good API and Why it Matters 8
  • 9. Write to Your API Early and Often • Start before you've implemented the API _ Saves you doing implementation you'll throw away • Start before you've even specified it properly _ Saves you from writing specs you'll throw away • Continue writing to API as you flesh it out _ Prevents nasty surprises _ Code lives on as examples, unit tests _How to Design a Good API and Why it Matters 9
  • 10. Writing to SPI is Even More Important • Service Provider Interface (SPI) _ Plug-in interface enabling multiple implementations _ Example: Java Cryptography Extension (JCE) • Write multiple plug-ins before release _ If you write one, it probably won't support another _ If you write two, it will support more with difficulty _ If you write three, it will work fine • Will Tracz calls this “The Rule of Threes” (Confessions of a Used Program Salesman, Addison-Wesley, 1995) Bad _How to Design a Good API and Why it Matters 10
  • 11. Maintain Realistic Expectations • Most API designs are over-constrained _ You won't be able to please everyone _ Aim to displease everyone equally • Expect to make mistakes _ A few years of real-world use will flush them out _ Expect to evolve API _How to Design a Good API and Why it Matters 11
  • 12. II. General Principles _How to Design a Good API and Why it Matters 12
  • 13. API Should Do One Thing and Do it Well • Functionality should be easy to explain _ If it's hard to name, that's generally a bad sign _ Good names drive development _ Be amenable to splitting and merging modules _How to Design a Good API and Why it Matters 13
  • 14. API Should Be As Small As Possible But No Smaller • API should satisfy its requirements • When in doubt leave it out _ Functionality, classes, methods, parameters, etc. _ You can always add, but you can never remove • Conceptual weight more important than bulk • Look for a good power-to-weight ratio _How to Design a Good API and Why it Matters 14
  • 15. Implementation Should Not Impact API • Implementation details _ Confuse users _ Inhibit freedom to change implementation • Be aware of what is an implementation detail _ Do not overspecify the behavior of methods _ For example: do not specify hash functions _ All tuning parameters are suspect • Don't let implementation details “leak” into API _ On-disk and on-the-wire formats, exceptions _How to Design a Good API and Why it Matters 15
  • 16. Minimize Accessibility of Everything • Make classes and members as private as possible • Public classes should have no public fields (with the exception of constants) • This maximizes information hiding • Allows modules to be used, understood, built, tested, and debugged independently _How to Design a Good API and Why it Matters 16
  • 17. Names Matter–API is a Little Language • Names Should Be Largely Self-Explanatory _ Avoid cryptic abbreviations • Be consistent–same word means same thing _ Throughout API, (Across APIs on the platform) • Be regular–strive for symmetry • Code should read like prose if (car.speed() > 2 * SPEED_LIMIT) generateAlert(quot;Watch out for cops!quot;); _How to Design a Good API and Why it Matters 17
  • 18. Documentation Matters Reuse is something that is far easier to say than to do. Doing it requires both good design and very good documentation. Even when we see good design, which is still infrequently, we won't see the components reused without good documentation. - D. L. Parnas, _Software Aging. Proceedings of 16th International Conference Software Engineering, 1994 _How to Design a Good API and Why it Matters 18
  • 19. Document Religiously • Document every class, interface, method, constructor, parameter, and exception _ Class: what an instance represents _ Method: contract between method and its client _ Preconditions, postconditions, side-effects _ Parameter: indicate units, form, ownership • Document state space very carefully _How to Design a Good API and Why it Matters 19
  • 20. Consider Performance Consequences of API Design Decisions • Bad decisions can limit performance _ Making type mutable _ Providing constructor instead of static factory _ Using implementation type instead of interface • Do not warp API to gain performance _ Underlying performance issue will get fixed, but headaches will be with you forever _ Good design usually coincides with good performance _How to Design a Good API and Why it Matters 20
  • 21. Effects of API Design Decisions on Performance are Real and Permanent • Component.getSize() returns Dimension • Dimension is mutable • Each getSize call must allocate Dimension • Causes millions of needless object allocations • Alternative added in 1.2; old client code still slow _How to Design a Good API and Why it Matters 21
  • 22. API Must Coexist Peacefully with Platform • Do what is customary _ Obey standard naming conventions _ Avoid obsolete parameter and return types _ Mimic patterns in core APIs and language • Take advantage of API-friendly features _ Generics, varargs, enums, default arguments • Know and avoid API traps and pitfalls _ Finalizers, public static final arrays _How to Design a Good API and Why it Matters 22
  • 23. III. Class Design _How to Design a Good API and Why it Matters 23
  • 24. Minimize Mutability • Classes should be immutable unless there’s a good reason to do otherwise _ Advantages: simple, thread-safe, reusable _ Disadvantage: separate object for each value • If mutable, keep state-space small, well-defined _ Make clear when it's legal to call which method Bad: Date, Calendar Good: TimerTask _How to Design a Good API and Why it Matters 24
  • 25. Subclass Only Where It Makes Sense • Subclassing implies substitutability (Liskov) _ Subclass only when is-a relationship exists _ Otherwise, use composition • Public classes should not subclass other public classes for ease of implementation Bad: Properties extends Hashtable Stack extends Vector Good: Set extends Collection _How to Design a Good API and Why it Matters 25
  • 26. Design and Document for Inheritance or Else Prohibit it • Inheritance violates encapsulation (Snyder, ‘86) _ Subclass sensitive to implementation details of superclass • If you allow subclassing, document self-use _ How do methods use one another? • Conservative policy: all concrete classes final Bad: Many concrete classes in J2SE libraries Good: AbstractSet, AbstractMap _How to Design a Good API and Why it Matters 26
  • 27. IV. Method Design _How to Design a Good API and Why it Matters 27
  • 28. Don't Make the Client Do Anything the Module Could Do • Reduce need for boilerplate code _ Generally done via cut-and-paste _ Ugly, annoying, and error-prone import org.w3c.dom.*; import java.io.*; import javax.xml.transform.*; import javax.xml.transform.dom.*; import javax.xml.transform.stream.*; // DOM code to write an XML document to a specified output stream. private static final void writeDoc(Document doc, OutputStream out)throws IOException{ try { Transformer t = TransformerFactory.newInstance().newTransformer(); t.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, doc.getDoctype().getSystemId()); t.transform(new DOMSource(doc), new StreamResult(out)); } catch(TransformerException e) { throw new AssertionError(e); // Can’t happen! } } _How to Design a Good API and Why it Matters 28
  • 29. Don't Violate the Principle of Least Astonishment • User of API should not be surprised by behavior _ It's worth extra implementation effort _ It's even worth reduced performance public class Thread implements Runnable { // Tests whether current thread has been interrupted. // Clears the interrupted status of current thread. public static boolean interrupted(); } _How to Design a Good API and Why it Matters 29
  • 30. Fail Fast–Report Errors as Soon as Possible After They Occur • Compile time is best - static typing, generics • At runtime, first bad method invocation is best _ Method should be failure-atomic // A Properties instance maps strings to strings public class Properties extends Hashtable { public Object put(Object key, Object value); // Throws ClassCastException if this properties // contains any keys or values that are not strings public void save(OutputStream out, String comments); } _How to Design a Good API and Why it Matters 30
  • 31. Provide Programmatic Access to All Data Available in String Form • Otherwise, clients will parse strings _ Painful for clients _ Worse, turns string format into de facto API public class Throwable { public void printStackTrace(PrintStream s); public StackTraceElement[] getStackTrace(); // Since 1.4 } public final class StackTraceElement { public String getFileName(); public int getLineNumber(); public String getClassName(); public String getMethodName(); public boolean isNativeMethod(); } _How to Design a Good API and Why it Matters 31
  • 32. Overload With Care • Avoid ambiguous overloadings _ Multiple overloadings applicable to same actuals _ Conservative: no two with same number of args • Just because you can doesn't mean you should _ Often better to use a different name • If you must provide ambiguous overloadings, ensure same behavior for same arguments public TreeSet(Collection c); // Ignores order public TreeSet(SortedSet s); // Respects order _How to Design a Good API and Why it Matters 32
  • 33. Use Appropriate Parameter and Return Types • Favor interface types over classes for input _ Provides flexibility, performance • Use most specific possible input parameter type _ Moves error from runtime to compile time • Don't use string if a better type exists _ Strings are cumbersome, error-prone, and slow • Don't use floating point for monetary values _ Binary floating point causes inexact results! • Use double (64 bits) rather than float (32 bits) _ Precision loss is real, performance loss negligible _How to Design a Good API and Why it Matters 33
  • 34. Use Consistent Parameter Ordering Across Methods • Especially important if parameter types identical #include <string.h> char *strcpy (char *dest, char *src); void bcopy (void *src, void *dst, int n); java.util.Collections – first parameter always collection to be modified or queried java.util.concurrent – time always specified as long delay, TimeUnit unit _How to Design a Good API and Why it Matters 34
  • 35. Avoid Long Parameter Lists • Three or fewer parameters is ideal _ More and users will have to refer to docs • Long lists of identically typed params harmful _ Programmers transpose parameters by mistake _ Programs still compile, run, but misbehave! • Two techniques for shortening parameter lists _ Break up method _ Create helper class to hold parameters // Eleven parameters including four consecutive ints HWND CreateWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam); _How to Design a Good API and Why it Matters 35
  • 36. Avoid Return Values that Demand Exceptional Processing • return zero-length array or empty collection, not null package java.awt.image; public interface BufferedImageOp { // Returns the rendering hints for this operation, // or null if no hints have been set. public RenderingHints getRenderingHints(); } _How to Design a Good API and Why it Matters 36
  • 37. V. Exception Design _How to Design a Good API and Why it Matters 37
  • 38. Throw Exceptions to Indicate Exceptional Conditions • Don’t force client to use exceptions for control flow private byte[] a = new byte[BUF_SIZE]; void processBuffer (ByteBuffer buf) { try { while (true) { buf.get(a); processBytes(tmp, BUF_SIZE); } } catch (BufferUnderflowException e) { int remaining = buf.remaining(); buf.get(a, 0, remaining); processBytes(bufArray, remaining); } } • Conversely, don’t fail silently ThreadGroup.enumerate(Thread[] list) _How to Design a Good API and Why it Matters 38
  • 39. Favor Unchecked Exceptions • Checked – client must take recovery action • Unchecked – programming error • Overuse of checked exceptions causes boilerplate try { Foo f = (Foo) super.clone(); .... } catch (CloneNotSupportedException e) { // This can't happen, since we’re Cloneable throw new AssertionError(); } _How to Design a Good API and Why it Matters 39
  • 40. Include Failure-Capture Information in Exceptions • Allows diagnosis and repair or recovery • For unchecked exceptions, message suffices • For checked exceptions, provide accessors _How to Design a Good API and Why it Matters 40
  • 41. VI. Refactoring API Designs _How to Design a Good API and Why it Matters 41
  • 42. 1. Sublist Operations in Vector public class Vector { public int indexOf(Object elem, int index); public int lastIndexOf(Object elem, int index); ... } • Not very powerful - supports only search • Hard too use without documentation _How to Design a Good API and Why it Matters 42
  • 43. Sublist Operations Refactored public interface List { List subList(int fromIndex, int toIndex); ... } • Extremely powerful - supports all operations • Use of interface reduces conceptual weight _ High power-to-weight ratio • Easy to use without documentation _How to Design a Good API and Why it Matters 43
  • 44. 2. Thread-Local Variables // Broken - inappropriate use of String as capability. // Keys constitute a shared global namespace. public class ThreadLocal { private ThreadLocal() { } // Non-instantiable // Sets current thread’s value for named variable. public static void set(String key, Object value); // Returns current thread’s value for named variable. public static Object get(String key); } _How to Design a Good API and Why it Matters 44
  • 45. Thread-Local Variables Refactored (1) public class ThreadLocal { private ThreadLocal() { } // Noninstantiable public static class Key { Key() { } } // Generates a unique, unforgeable key public static Key getKey() { return new Key(); } public static void set(Key key, Object value); public static Object get(Key key); } • Works, but requires boilerplate code to use static ThreadLocal.Key serialNumberKey = ThreadLocal.getKey(); ThreadLocal.set(serialNumberKey, nextSerialNumber()); System.out.println(ThreadLocal.get(serialNumberKey)); _How to Design a Good API and Why it Matters 45
  • 46. Thread-Local Variables Refactored (2) public class ThreadLocal { public ThreadLocal() { } public void set(Object value); public Object get(); } • Removes clutter from API and client code static ThreadLocal serialNumber = new ThreadLocal(); serialNumber.set(nextSerialNumber()); System.out.println(serialNumber.get()); _How to Design a Good API and Why it Matters 46
  • 47. Conclusion • API design is a noble and rewarding craft _ Improves the lot of programmers, end-users, companies • This talk covered some heuristics of the craft _ Don't adhere to them slavishly, but... _ Don't violate them without good reason • API design is tough _ Not a solitary activity _ Perfection is unachievable, but try anyway _How to Design a Good API and Why it Matters 47
  • 48. Shameless Self-Promotion _How to Design a Good API and Why it Matters 48
  • 49. How to Design a Good API and Why it Matters Joshua Bloch Principal Software Engineer _How to Design a Good API and Why it Matters 49