Feeds

Building cohesion into programming

Time is of the essence

Security and trust: The backbone of doing business over the internet

There are many reasons for getting cohesive.

The principle of locality, which is normally considered with respect to locality of reference when using resources such as memory, can also apply to the organisation of APIs and classes and the partitioning of packages, components and header files. This criterion for cohesion is based on the idea that things that are used together belong together.

Popular as the practice appears to be, it makes little sense to bundle all of your exception classes into a single package named exceptions or all of your compile-time constants in a single header file named "constants.h".

The cohesion is coincidental and doesn't reflect how the code is used or what it means: If usage of a particular class can result in a specific exception, why is the exception not defined close to the class? If you need a particular constant, such as a service name, why should that also bring in unrelated constants, such as a default buffer length?

It turns out that there is in another criterion that can be used to arrive at the same conclusion in this case: stability. Or, put another way, put things together that change together. The change in question is not runtime change but development-time change: the change that code endures over the software lifecycle.

The other side of the partitioning coin from cohesion is coupling, and stability also applies here: a unit (function, class, header, package, layer, etc) should ideally depend on units that are more, not less, stable than itself. Put simply: prefer to build on solid ground.

In the case of the exceptions package, all the feature packages whose classes need to throw exceptions that are defined in the exceptions package depend on the exceptions package, as do the users of the feature packages. This is likely to make the exceptions package one of the most, if not the most, heavily depended upon packages in a system.

Unfortunately, it is also likely to be one of the least stable: any new exception for a feature package will affect the exceptions package, as will the addition of any new feature package that needs new exception types. This conceptual instability can manifest itself concretely if the compiled classes for lower layers are deployed separately from those that are higher up, i.e. placing the code for application features in one JAR file and the code for so-called utility classes, such as exceptions, in another.

The same problem exists for a "constants.h" header, but the churn problem shows up sooner during the compilation–link cycle: every time the header file is modified, a rebuild is triggered, regardless of whether or not an including source file depends on the constant in question. Changing a default buffer length will still cause a rebuild for files whose only interest is in a service name. So the lack of cohesion, from the perspective of common use, makes changes more likely: it reinforces the lack of cohesion from the perspective of stability.

The solution in both cases is to split up the package and the header and relocate their constituent parts according to the features they relate to.

In the case of the constants, there is one more refinement that can further reduce coupling and isolate change... but we'll discuss that another day.

Security and trust: The backbone of doing business over the internet

More from The Register

next story
New 'Cosmos' browser surfs the net by TXT alone
No data plan? No WiFi? No worries ... except sluggish download speed
'Windows 9' LEAK: Microsoft's playing catchup with Linux
Multiple desktops and live tiles in restored Start button star in new vids
iOS 8 release: WebGL now runs everywhere. Hurrah for 3D graphics!
HTML 5's pretty neat ... when your browser supports it
Mathematica hits the Web
Wolfram embraces the cloud, promies private cloud cut of its number-cruncher
Google extends app refund window to two hours
You now have 120 minutes to finish that game instead of 15
Intel: Hey, enterprises, drop everything and DO HADOOP
Big Data analytics projected to run on more servers than any other app
Mozilla shutters Labs, tells nobody it's been dead for five months
Staffer's blog reveals all as projects languish on GitHub
SUSE Linux owner Attachmate gobbled by Micro Focus for $2.3bn
Merger will lead to mainframe and COBOL powerhouse
iOS 8 Healthkit gets a bug SO Apple KILLS it. That's real healthcare!
Not fit for purpose on day of launch, says Cupertino
prev story

Whitepapers

Providing a secure and efficient Helpdesk
A single remote control platform for user support is be key to providing an efficient helpdesk. Retain full control over the way in which screen and keystroke data is transmitted.
WIN a very cool portable ZX Spectrum
Win a one-off portable Spectrum built by legendary hardware hacker Ben Heck
Saudi Petroleum chooses Tegile storage solution
A storage solution that addresses company growth and performance for business-critical applications of caseware archive and search along with other key operational systems.
Protecting users from Firesheep and other Sidejacking attacks with SSL
Discussing the vulnerabilities inherent in Wi-Fi networks, and how using TLS/SSL for your entire site will assure security.
Security for virtualized datacentres
Legacy security solutions are inefficient due to the architectural differences between physical and virtual environments.