2

I will get to the question in a minute....

We have 2 in house services that either have an API contract between the 2 that involves an enum or the enum value is stored in a shared database.

I don't consider copying this enum class between the 2 services' source a good idea, but creating a shared library has draw backs as well.

Now let the number of services grow that need to share this enum and making a change to it does require the update and redeployment of all services involved.

Now let the number of enums that are shared between the services grow and the question comes, should I share all the enums in a large library? This would make less libraries but cause more sharing of the library and more frequent changes to the library and cause more deployments.

Smaller libraries that are more focused would help that situation, but makes more libraries to maintain.

Finally my question...

What have people found to be the best way to share items like enums between contractually bound services that utilize the same data that is represented by the said enum?

2
  • I don't consider copying this enum class between the 2 services' source a good idea -> double entry bookkeeping was invented in 1458 and is still used because it works. I've kept redundant data in test suites because "double-entry data keeping" concept catches data update errors.
    – radarbob
    Commented Apr 30 at 22:54
  • 1
    Double entry bookkeeping? It's used for providing accuracy of financial statements and computation is used to provide that accuracy. Plus I'm also talking the possibility of 10 x copied code. This is really an apple and orange comparison you have here. It doesn't work at all.
    – jdtommy
    Commented May 1 at 0:31

1 Answer 1

1

There is no "best" approach for this. How to approach this depends on a few factors not mentioned in the question:

  • is the enum extended in a way existing values will keep they semantics (backwards-compatible), or is it changed in a way that existing values get a new semantics?

  • do the involved services read or write values of that enum (or both)?

  • is the code for readers written in a way they ignore new enum values they don't know yet?

  • is the code base of the different services under control of a single team, may be in a monorepo, or are different teams involved (so simultanous changes / updates are an issue)?

In short, when there is only one dev team for all services, with one common code base, different services with a common library might be the most effective approach. However, the larger the system is, with different teams involved or maybe a single team, but still separated code bases and deployment procedures for the different services, then the negative consequences from the coupling by a common library may outweigh it's benefits. These consequences involve the need for keeping things backwards compatible, making it possible to deploy a new version of a single service without redeploying every other related service.

This is a tradeoff, and there is no simple "formula" to decide which approach to use when. The only thing I would avoid in almost all situations is a common lib for all kind of unrelated enums (or other unrelated stuff).

See also: Is a common library a good idea?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.