Below are few rules, recommendations and best practices we try to follow when developing the GoodData Java SDK.
- Every pull request with non-trivial change must be associated with an issue.
- Every closed non-rejected pull request and issue must be marked with exactly one milestone version.
- Issue must be properly labeled (bug/enhancement/backward incompatible/...).
- Add usage examples of new high level functionality to README.md
- Package names for DTOs and services should be named in the same manner as REST API.
- Don't create single implementation interfaces for services.
- All DTOs which can be updated should be mutable. Please keep mutable only the fields which are subject of change, the rest should be immutable.
- Create method named
String getUri()
to provide link to self. - Introduce constants:
public static final String URI = "/gdc/someresource/{resource-id}";
public static final UriTemplate TEMPLATE = new UriTemplate(URI);
- Put Jackson annotations on getters rather then on fields.
- Consider the visibility - use
package protected
when DTO is not intended for SDK user, but is needed in related service. - Test all DTOs using JsonUnit.
- Use enums sparingly, because they don't work with REST API changes (eg. new value added on the backend) never use them when deserializing.
- Where make sense, use overloaded methods with an enum argument as well as
String
argument.
- When programming client for some polling return
FutureResult
to enable user asynchronous call. - Create custom
GoodDataException
when you feel the case is specific enough. - Prefer DTOs to
String
or primitive arguments. - Method naming:
get*()
when searching form single object (throw exception when no or multiple objects are found, never returnnull
)find*()
when searching for multiple objects (collection of objects, never returnnull
)remove*()
(i.e.remove(Project project)
) instead oddelete*()
- Write integration tests for services using Jadler.
- If it is possible write acceptance tests to be run with the real backend.
- Update
README
with usage examples.
- Test class naming:
*Test
unit tests*IT
integration tests (seeAbstractGoodDataIT
)*AT
acceptance tests
- Everything public should be documented using javadoc.
- When you need some utility code, look for handy utilities in used libraries first (e.g. Spring has its
StreamUtils
,FileCopyUtils
, ...). When you decide to create new utility class, use abstract utility class pattern.