I'm writing a framework that automatically documents applications dependencies in a distributed system, the idea is to produce something close to an UML component diagram of the whole system at runtime.

Components are usually applications or one of the resources they consume (database, HTTP API, file...).

Each component has a name, and a type. I was wondering if there is such a thing as a "software component type classification" ?
I don't like reinventing the wheel, especially if a standard exists.

Here are a few examples of what I call component type :

  • application/http
  • application/desktop
  • application/mobile/android
  • database/mysql
  • database/cassandra
  • There are an infinite number of component types. You have identified a few common ones. – Frank Hileman Mar 18 '17 at 0:10
  • Yes obviously, and depending on the point of view (developer, system administrator, etc) the same "component" could be viewed differently. I'm searching for any kind of starting point. In other disciplines (cooking, construction work, physics...) classifications have been achieved even though it seemed "infinite" at first, men like to categorize things. – Michael Técourt Mar 19 '17 at 10:19

What are components ?

An UML component component is basically a black box with a well defined behavior and interface. The idea is that it is self-contained and replaceable.

With such a broad definition, a component can cover anything possible from whole applications, to plugins, down to elementary classes. This is simply to broad for a general classification standard.

What do mainstream component models ?

Mainstream component models use very flexible or broad categories and require IDLs. For example:

  • Microsoft's COM use very flexible classification ids
  • CORBA's CMM has only 4 component categories (service, session, process, entity).

I doubt that these categories suit your needs.

Where to start for your own categorization ?

You'll need to define the axes to use to break down your categories, and this will depend on your specific objective:

  • If your objective is to categorize complex exchangeable data objects, you could look at the MIME type for which there is a global IANA reference.
  • If your objective is more to group components by purpose, to find more easy suitable reusable components in a catalog, you could use the layering model of your software architecture. For example with a clean architecture, you would start your classification with the main layer elements (e.g. entities, use-case/transactions, controllers, gateways, presenters,...) and subdivide them further (e.g. data-gateways, service-gateways, ...).

Your few examples suggest strongly the use of the second approach.

Edit: components for applications and resources

In your edit, you narrows down the classification to applications and ressources. Your examples for the latter seem to target more services (e.g. DBMS, API) than resource themselves (e.g. the data or the files).

There is still no general well accepted category standard available. Here some starting points:

  • GAMP 5 software classification: this standard is for pharmaceutical industry, where automation is controlled with the strength required to ensure security of your medication's production process.
  • Software asset management products come with custom categories. One nice example here, but there are certainly others available. Beware however that such proprietary lists might be protected by copyright, even if publicly available.
  • Similarly, marketing companies work with well defined software categories (for example: IDC software taxonomy). But again, this is proprietary material in which these companies have invested research, so not reusable at will.
  • Finally there's the European CPV classification for public procurement. This is a huge list with codes. The codes starting with 48 as two first digits propose a detailed of software categories (the code is a hierarchical decimal numbering system, explained on their website).
  • Thank you for your research. I have rephrased the project goal a little : the component diagram is at the system level, meaning that each "component" is normally an application or one of the resources it consumes (database, HTTP API, file...). I got inspired by the mime types indirectly, but like you said they describe data formats and not "application types". – Michael Técourt Mar 20 '17 at 12:09
  • @MichaelTecourt I've updated my answer accordingly – Christophe Mar 20 '17 at 20:10

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