On Interface, Implementation, and Reuse
A common technique in software development, but particularly in distributed software development, is the “separation of interface from implementation”, whereby software components are developed to have dependencies only upon the interfaces (the connectors, in architectural terms) of other components, and not their implementations. The purpose of this technique is to isolate the impact of a change of implementation to just the changed component, thereby reducing coupling between components. The technique is so pervasively referenced and evangelized, that it’s practically axiomatic.
Unfortunately, it’s not commonly practiced.
Many who claim that they’re using this technique will tell you that the use of a description language, such as IDL or more commonly nowadays, WSDL, does this for them. It does not.
As mentioned, the purpose of the technique is to isolate the impact of implementation changes. Yet this WSDL contract for a new home buyers database places extreme restrictions on how the implementation can vary because it is so specific to, well, a new home buyers database. Need an interface to an historical database of home purchases, or one to a database of recent automobile sales? Too bad, you need a new interface, and therefore new code to use that service. So much for that separation of concerns!
The lesson here, I suggest, is the following;
True separation of interface from implementation requires designing broadly reusable interfaces.