The main quality aspect is that the frameworks provide the required functionality. This is discussed in the previous chapter. However, this chapter deals with further quality issues of the framework. Table 3 shows a summary of this evaluation part. Afterwards the evaluation is discussed in detail.
Requirement | CAB/SCSF May 2007 | Spring .NET Version 1.1 | SharpDevelop Version 2.1 |
---|---|---|---|
Framework composition | (o) | (+) | (+) |
Framework dependencies | (o) | (+) | (-) |
Evolution | (+) | (+) | (-) |
Documentation | |||
Purpose of the framework | (+) | (+) | (+) |
How to use the framework | (+) | (+) | (o) |
Detailed design of the framework | (+) | (o) | (o) |
Examples | (+) | (+) | (o) |
Table 3: Shows the evaluation of further quality issues.
It is common that frameworks must be composed with other frameworks to
get all the functionality which is required for the application. Frameworks
are often designed that they are in full control. Problems can occur if two
composed frameworks require both full control over the application [BMMB97,
p. 11]. In case of the Test Suite all investigated frameworks are designed
for working with the .NET Framework. Thus, no issues occur if the frameworks
are composed together with the .NET Framework. The situation changes if
other frameworks, like a persistence framework, are added.
In CAB and Spring .NET the framework takes over the control during
Dependency Injection. All the necessary objects for the Dependency Injection
are created by the framework. This can be an issue if the frameworks are
composed with other frameworks. For example, a persistence framework is
usually responsible for retrieving the persisted data and creating the
necessary objects which are filled with this data. In this case, both
frameworks want to create the same objects. A solution is that these objects
are not created by Dependency Injection. Instead, the objects retrieve the
necessary services via the Service Locator implementation. In Spring .NET
the situation looks a bit better as the framework already supports some
additional frameworks (e.g. NHibernate) out of the box.
SharpDevelop is not affected by this requirement because it does not
provide Dependency Injection.
A characteristic of frameworks is that beside code reuse they also define the application design. The application developer can concentrate on the implementation without worrying too much about creating a good object-oriented design. However, the drawback is that a framework is closely coupled to the application.
As a framework evolves, applications have to evolve with it. That makes loose coupling all the more important; otherwise even a minor change to the framework will have major repercussions [GHJV95, p. 27].
Dependency Injection helps to minimize or completely remove the
dependencies between the framework and the application. The investigated
frameworks, which support decoupling, use this pattern. An introduction in
Dependency Injection can be found in
chapter 4.2.
The Composite UI Application Block uses the Object Builder for Dependency
Injection. Nevertheless, it does not completely decouple the modules from
the framework since the modules use Attributes
to control the injection. The
Attributes
are part of the framework. Therefore a reference to the framework
is necessary. Other dependencies arise through sub classing of the ModuleInit
class and the use of own sub
WorkItems
. Additionally, the
Dependency Injection implementation is not able to inject primitive types.
If a service has to be configured with primitive types, it has to be
manually instantiated and passed to the Service Locator. The use of the
Service Locator also requires a reference to the framework assembly. With
all these dependencies to the framework they are still lower as without
using Dependency Injection at all.
Spring .NET provides a powerful Dependency Injection mechanism that
allows the complete decoupling of the modules from the framework. One
exception is the use of loosely coupled events. The modules which are using
them require access to the IApplicationContext
and consequently, a reference
to a Spring .NET assembly is necessary. Another drawback is the high amount
of configuration which is necessary for the complete decoupling of the
components.
SharpDevelop does not support Dependency Injection and thus, the add-ins
are closely coupled to the SharpDevelop core.
The number of breaking changes during the framework evolution is an
important quality metric. Braking changes are all modifications in a
framework that require the application to be modified too. If many breaking
changes are introduced in a framework the effort for updating the
applications to a new framework version is high. This metric is very
difficult to define. One solution is to have a look at the past years of the
framework and use this data to predict the future.
Since CAB was released in December 2005 no chances were made until
September 2007. Microsoft has introduced new features with the Smart Client
Software Factory, but the CAB framework itself was not updated by SCSF. The
fact, that the framework did not need to be changed since its release,
approves the high quality of the framework.
In Spring .NET the breaking changes of the version 1.0 release in
September 2005 until the version 1.1 RC1 release in August 2007 are minimal10.
It shows also here that Spring .NET is a well designed framework. The
conclusion is further supported as version 1.1 introduces lots of new
functionality without the need for changing the API.
SharpDevelop is not intended to be a framework. That is why the stability
of the interfaces is not that important than in the other solutions. An
example for a breaking change with high impact is the elimination of the
ServiceManager
. The book "Dissecting a C# Application - Inside SharpDevelop"
that was first printed in February 2003 describes the ServiceManager
[HKS03,
p. 109]. In the version 2.1 the ServiceManager
does not exist anymore.
Johnson discusses the amount of documentation that is necessary for a user to understand a framework [Johnson92]. He states that the documentation should contain:
The purpose of all investigated solutions is well documented. The information on using the framework is useful in CAB and Spring .NET but lacks with SharpDevelop. This results from the fact that SharpDevelop is not intended to be used as an application framework. The detailed design of the framework is only sufficiently explained for CAB. The documentation of Spring .NET shows every possible usage scenarios of the framework but does not explain the internal design in detail. The SharpDevelop team has devoted a book to the design decisions they made in the application [HKS03]. However, the book is outdated today and does not reflect the current state of SharpDevelop. CAB and Spring .NET ships useful examples which are also documented. In the case of SharpDevelop just a few examples exist regarding the usage of the core to build own applications. These examples are not in the official documentation of SharpDevelop.
10 Breaking changes of Spring .NET 1.1: http://www.springframework.net/BreakingChanges-1.1.txt