I remember a specific conversation with Felipe about API classification. He described a grid with two properties: prettiness on usage and prettiness of implementation.

You can place any API in that quadrant:

  • Ugly APIs in implementation and in usage.
  • APIs that have been developed without much care, but provide a nice way of interacting with them.
  • APIs with good care on the implementation but forgot about the users of it.
  • Nice all-around APIs.

He gave me that feedback while talking about my implementation of a router for the http server I had a simple and flexible enough API for the requirements, but I did not think much on the users of that code.

For example, the way you had to define the routes was:

new Route(
    new UriMatcher("/method_options"),
    respondAvailableOptions
);

new Route(
    new AndMatcher(
      new MethodMatcher("GET"),
      new UriMatcher("/logs")
    ),
    haveProtectedAccessToLogs
);

new Route(
    new MethodMatcher("GET"),
    readRequestedFile
);

It is not very handy. By providing a DSL layer on top, now the users could use it in this much-improved way:

onAnyMethodTo("/method_options").will(respondAvailableOptions)

on(GET, "/logs").will(haveProtectedAccessToLogs)

on(GET).will(readRequestedFile)