<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Challenges in the Evolution of Metamodels: Smells and Anti-Patterns of a Historically-Grown Metamodel</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Misha Strittmatter</string-name>
          <email>strittmatter@kit.edu</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Georg Hinkel</string-name>
          <email>hinkel@fzi.de</email>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Michael Langhammer</string-name>
          <email>langhammer@kit.edu</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Reiner Jung</string-name>
          <email>reiner.jung@email.uni-</email>
          <email>reiner.jung@email.unikiel.de</email>
          <xref ref-type="aff" rid="aff2">2</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Robert Heinrich</string-name>
          <email>heinrich@kit.edu</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Chair for Software Design and</institution>
          ,
          <addr-line>Quality (SDQ)</addr-line>
          ,
          <institution>Karlsruhe Institute of, Technology</institution>
          ,
          <addr-line>Karlsruhe</addr-line>
          ,
          <country country="DE">Germany</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Software Engineering Division, FZI Research Center of, Information Technologies</institution>
          ,
          <addr-line>Karlsruhe</addr-line>
          ,
          <country country="DE">Germany</country>
        </aff>
        <aff id="aff2">
          <label>2</label>
          <institution>Software Engineering Group, Christian-Albrechts-University</institution>
          ,
          <addr-line>Kiel, Kiel</addr-line>
          ,
          <country country="DE">Germany</country>
        </aff>
      </contrib-group>
      <fpage>30</fpage>
      <lpage>39</lpage>
      <abstract>
        <p>In model-driven engineering, modeling languages are developed to serve as basis for system design, simulation and code generation. Like any software artifact, modeling languages evolve over time. If, however, the metamodel that de nes the language is badly designed, the e ort needed for its maintenance is unnecessarily increased. In this paper, we present bad smells and anti-patterns that we discovered in a thorough metamodel review of the Palladio Component Model (PCM). The PCM is a good representative for big and old metamodels that have grown over time. Thus, these results are meaningful, as they re ect the types of smells that accumulate in such metamodels over time. Related work deals mainly with automatically detectable bad smells, anti-patterns and defects. However, there are smells and anti-patterns, which cannot be detected automatically. They should not be neglected. Thus, in this paper, we focus on both: automatically and non-automatically detectable smells.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>metamodel smells; metamodel maintainability; metamodel
anti-patterns; Palladio Component Model</p>
    </sec>
    <sec id="sec-2">
      <title>1. INTRODUCTION</title>
      <p>Model-driven engineering uses domain-speci c modeling
languages (DSMLs) to express abstractions of reappearing
domain concepts. DSMLs can then be used to design
systems. The resulting models (instances of DSMLs) can be
analyzed and used for simulation. Depending on the DSML,
its instances can be used for purposes ranging from stub
generation to the generation of fully functional code. DSMLs
are de ned by metamodels.</p>
      <p>The evolution of metamodels is a big challenge, as they
tend to be central artifacts with many tools that depend
on them. A change in a metamodel may cause many errors
in dependent code. Thus, it is important that metamodels
allow the addition of new features by creating metamodel
extensions (which we will refer to as external extensibility ).
Some bad smells in metamodels make external extensions
impossible. Other bad smells degrade a metamodels general
maintainability.</p>
      <p>
        In this paper, we present the results of a thorough
metamodel review of the PCM in the form of a list of bad smells.
The PCM [
        <xref ref-type="bibr" rid="ref26">26</xref>
        ] is a metamodel to describe component-based
software architectures with a focus on their performance
properties. It is implemented in EMF's Ecore [
        <xref ref-type="bibr" rid="ref29">29</xref>
        ], which
is an implementation of EMOF [
        <xref ref-type="bibr" rid="ref24">24</xref>
        ]. The metamodel is
approximately 10 years old and has been extended by features
over time. While later features have been extended
externally, earlier additions were made intrusively. Thus, the
PCM is a representative specimen of a big, old and grown
over time metamodel. That is the reason why we think the
results of our review are important to the community. They
show what type of smells typically accumulate in
metamodels over time.
      </p>
      <p>Related work mainly focuses on the automatic detection
of metamodel smells and simple defects of the metamodel.
Being able to detect these problems automatically is
important. However, smells and anti-patterns that cannot be
automatically detected should not be ignored. Thus,
besides four bad smells that can be automatically detected,
we also present 6 smells which can only be detected
manually. This paper does not cover any metamodel defects,
which break conformance to the meta-metamodel
(comparable to compiler errors in programming). These defects are
usually taken care of by the modeling frameworks validation
functionality.</p>
      <p>This paper is structured as follows: Section 2 gives
foundational information about metamodels, their evolution and
maintainability, anti-patterns and bad smells. Section 3
presents the state of the art in evaluating metamodel
quality and detecting bad smells in metamodels. Section 4 will
brie y give background information and present the internal
structure of the PCM. Section 4 will show how the PCM has
developed over the year. Section 5 contains the list of bad
smells in the PCM. Section 6 concludes the paper.</p>
    </sec>
    <sec id="sec-3">
      <title>FOUNDATIONS</title>
      <p>
        In this paper, we are concerned with Essential
Meta-Object Facility (EMOF)-conforming metamodels [
        <xref ref-type="bibr" rid="ref24">24</xref>
        ] (e.g.
instances of the EMF's Ecore meta-metamodel). A metamodel
de nes and constrains the set of its instances (i.e. models).
In the sense of EMOF, a metamodel consists of metaclasses,
which in turn contain relations and attributes. If the
elements of a model conform to the de nitions in the
metamodel, the model is an instance of the metamodel.
EMOFconforming metamodels are similar to UML class diagrams.
The di erences are that they have to be complete and have
to form a containment tree.
      </p>
      <p>
        The relations that can be de ned in a metamodel connect
two metaclasses. Attributes of metaclasses have only
primitive types. Metaclasses are able to inherit from each other.
A special case of a relation is the containment relation. Each
element of a model, except its roots, has to be contained
in another element. A metamodel can be subdivided into
packages. A metamodel may also reference metaclasses of
another metamodels. Constraints can be de ned (e.g. using
the Object Constraint Language (OCL) [
        <xref ref-type="bibr" rid="ref25">25</xref>
        ]).
      </p>
      <p>
        Metamodels evolve because their languages evolve. New
features have to be added, concepts have to be adapted,
and bugs have to be xed. A more detailed classi cation of
metamodel evolution can be found in [
        <xref ref-type="bibr" rid="ref31">31</xref>
        ]. In our experience
with the PCM, the biggest driver is the inclusion of new
features.
      </p>
      <p>
        How easy it is to evolve a metamodel can be considered
the maintainability of a metamodel. The maintainability is
in uenced directly by a metamodel's complexity and
understandability. Understandability is not completely derived
from complexity, as it is possible to metamodel a simple
concept in a way which is not intuitive. The concepts of
cohesion [
        <xref ref-type="bibr" rid="ref36">36</xref>
        ] and coupling [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ] can be transferred from
objectoriented software development. The cohesion of a module
is described as how related its classes are. Coupling of one
module to another expresses how dependent the rst module
is on the second. Both measures are heuristics for
maintainability. A high cohesion is bene cial, as related classes tend
to evolve together. A high coupling between packages is
detrimental, because modi cations may have a bigger
impact on dependents.
      </p>
      <p>
        In object-oriented software development, a bad smell [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ]
is considered an indicator for a possible problem in the
software's design or code. An anti-pattern was originally
dened as being \... just like pattern, except that instead of
a solution it gives something that looks super cially like a
solution, but is none." [
        <xref ref-type="bibr" rid="ref27">27</xref>
        ]. However, the meaning of
antipatterns changed over time to mean a recurring pattern that
has negative consequences [
        <xref ref-type="bibr" rid="ref14 ref28">28, 14</xref>
        ], regardless if it was
purposely used or not. When transferring these terms to the
domain of metamodeling, some bad smells can be de ned as
anti-patterns [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]. Other bad smells may be indicated by
metrics [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]. Some are only detectable by manual investigation.
In the following, we will refer to bad smells in metamodels
as metamodel smells or simply smells. Metamodel smells
may have various negative e ects on metamodel
maintainability, which we will explain in this paper. In our list of
smells, we include automatically detectable smells, but even
more importantly smells which can only be reliably detected
manually. As the PCM is a valid metamodel,
metamodeling errors (which prevent the generation of the model code)
will not appear in our list. For each smell we identi ed, we
explain the characteristics of this smell, its consequences,
reasons why they appeared in the PCM, how we think they
can be best corrected, whether we can automatically detect
them and where they occurred in PCM.
      </p>
    </sec>
    <sec id="sec-4">
      <title>3. STATE OF THE ART</title>
      <p>
        EMF Refactor [
        <xref ref-type="bibr" rid="ref1 ref2">2, 1</xref>
        ] is a tool that can be used to
automatically detect bad smells and perform refactorings in
Ecore-based metamodels and UML models. They detect
bad smells either by a violation of a speci c metric or by
the detection of an anti-pattern. For Ecore they feature
automated detection of the following anti-patterns1: Large
EClass, Speculative Generality EClass, Unnamed EClass.
They feature an even longer list for UML anti-patterns. Of
these, some may also be applicable to Ecore metamodels.
      </p>
      <p>
        Elaasar [
        <xref ref-type="bibr" rid="ref7 ref8">7, 8</xref>
        ] developed an approach for automated
detection of patterns and anti-pattern in MOF-based models. His
approach provides a ready to use catalog with patterns
speci cations but also supports the creation of new pattern
speci cations by the user. His MOF anti-patterns are grouped
in the categories well-formedness, semantic and convention.
      </p>
      <p>
        Lopez et al. propose a tool and language to check for
properties of metamodels [
        <xref ref-type="bibr" rid="ref20">20</xref>
        ]. In their paper, they also provide
a catalog of properties, which they categorize in: design
aws, best practices, naming conventions and metrics. They
check for breaches of xed thresholds for the following
metrics: number of attributes per class, degree of fan-in and
-out, depth of inheritance tree and the number of direct
subclasses.
      </p>
      <p>
        Vepa et al. present a repository for metamodels, models,
and transformations [
        <xref ref-type="bibr" rid="ref35">35</xref>
        ]. The authors apply metrics that
were originally designed for class diagrams onto metamodels
from the repository. For some of the metrics, Vepa et al.
provide a rationale how they relate to metamodel quality.
      </p>
      <p>
        Di Rocco et al. [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ] applied metrics onto a large set of
metamodels. Besides the usual size metrics, they also feature the
number of isolated metaclasses and the number of concrete
immediately featureless metaclasses. Further, they searched
for correlations of the metrics among each other. E.g., they
found that the number of metaclasses with superclass is
positively correlated with number of metaclasses without
features. Based on the characteristics they draw conclusions
about general characteristics of metamodels. Their
longterm goal is to draw conclusions from metamodel
characteristics concerning the impact onto tools and transformations
that are based on the metamodel.
      </p>
      <p>
        Gomez et al. [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ] propose an approach, which aims at
evaluating the correctness and expressiveness of a metamodel.
I.e. weather it allows invalid instances (correctness) and is
it able to express all instances it is supposed to
(expressiveness). Their approach automatically generates a (preferably
small) set of instances to evaluate these two criteria.
      </p>
      <p>
        Garc a et al. [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ] developed a set of domain speci c
metamodel quality metrics for multi-agent systems modeling
languages. They propose three metrics: availability, speci city
and expressiveness. These metrics take domain knowledge
into account, e.g., the \number of necessary concepts" or
the \number of model elements necessary for modeling the
1https://www.eclipse.org/emf-refactor/index.php
system of the problem domain".
      </p>
      <p>
        There is much work on quality metrics for object-oriented
design and UML class diagrams [
        <xref ref-type="bibr" rid="ref12 ref21 ref22 ref5">5, 22, 21, 12</xref>
        ]. Further,
there are publications that present empirical analyses of
object-oriented design metrics [
        <xref ref-type="bibr" rid="ref3 ref34">3, 34</xref>
        ]. E.g. Subramanyam
found that the correlation between metrics and bug
detection varied when applied to di erent programming languages
and observed interactions between metrics. The purpose
and usage of object-oriented design and class diagrams is
very di erent compared to metamodels, thus their bene t
cannot be assumed for metamodels.
      </p>
    </sec>
    <sec id="sec-5">
      <title>THE PALLADIO COMPONENT MODEL</title>
      <p>
        The Palladio approach [
        <xref ref-type="bibr" rid="ref26">26</xref>
        ] is an approach to
componentbased software engineering. At its core is the PCM, a
metamodel, which de nes a language to express component-based
software architectures and abstractions of several quality
aspects. In this section, we present insights into the structure
of the PCM.
      </p>
      <p>The PCM is separated in di erent hierarchical packages.
The root package is called pcm and directly or indirectly
contains the remaining packages. In this paper, we consider
packages, that are directly contained in the root packages as
rst level packages. Packages contained in rst level
packages are considered as second level packages and so on. The
containment hierarchy of the packages is depicted in
Figure 1, while dependencies between the packages implied by
inheritance of classes within the packages are depicted in
Figure 5.</p>
      <p>pcm
core
qosannotations
entity
composition
qos_performance
qos_reliability
resourcetype
reliability
repository
seff
seff_performance
seff_reliability
system
resourceenvironment
allocation
subsystem
usagemodel
parameter
protocol</p>
      <p>
        In [
        <xref ref-type="bibr" rid="ref32">32</xref>
        ], we identi ed di erent main concerns of the PCM,
which can be seen in Figure 2. The gure shows
dependencies how they should be, not how they actually are. As one
can see, in these two gures, the packages are mainly sliced
as the concerns. For instance, the repository package
contains all classes that are necessary to build a Repository
with its DataTypes and ComponentTypeHierarchy.
However, some packages contain information for multiple
concerns.
      </p>
      <p>Legend</p>
      <p>Usage
Model</p>
      <p>Concern
Dependency</p>
      <p>DataTypes
Component
Type Hierarchy Repository</p>
      <p>Variable
Characterization</p>
      <p>SEFF</p>
      <p>Entity
Composition</p>
      <p>Environment
Allocation
Resource</p>
      <p>Types
RDSEFF</p>
      <p>Resource</p>
      <p>Environment</p>
      <p>Performance</p>
      <p>Reliability
Starting in August 2006, the PCM has a long evolution
history. Since then, many new features have been added.
Although Palladio initially was built for performance
prediction, it now also supports to simulate reliability, data
consistency, energy consumption and maintainability. At the same
time, besides the original call characteristics, a system can
now be speci ed in an event-based manner and PCM has
built-in support for extensions in the form of stereotypes.</p>
      <p>Total Number of Classes</p>
      <p>Many of these perfective changes have had a footprint to
the metamodel. Today, the version control system registers
more than 120 revisions of the core metamodel plus several
revisions for underlying shared functionality it is using. To
give an impression on the evolution of the metamodel, we
have depicted the total number of classes between spring
2007 and fall 2012 in Figure 3. Most changes to the PCM
were mad in this period and the metamodel size in terms of
number of classes has more than doubled.</p>
    </sec>
    <sec id="sec-6">
      <title>METAMODEL SMELLS</title>
      <p>In this Section, we will present the list of metamodel
smells we found in the most recent version of the PCM.
This version of the metamodel was released with the
Palladio Bench 4.0. For each metamodel smell, the following
aspects will be elaborated: general description, its
consequences, reasons for its forming, or even rationale why it
might have been purposefully used, possible resolutions, if
the smell is automatically detectable as well as brief
mention of its occurrences in the PCM. In a smell's description,
we will also brie y discuss the relation of a smell to
objectoriented design and programming (OO).
5.1</p>
    </sec>
    <sec id="sec-7">
      <title>Redundant Container Relation</title>
      <p>Description: Containment relations are necessary to be
able to specify entities that are more complex and they guide
serialization. To navigate models, it can be necessary to
traverse from a contained element to the containing element.
For this purpose, the container reference can be used. In
EMF, this feature is provided by a generic and implicit
reference eContainer. However, it is also possible to de ne an
explicit container reference utilizing the concept of opposite
references.</p>
      <p>This smell does not exist in OO, as there are in general no
explicit containers. Objects are contained in the heap
memory and are merely referenced by other objects. If no more
references to an object exist, the object is eventually deleted.
In metamodeling and modeling on the other hand, an
EObject must have a container. If that container is deleted, all
contained elements are also deleted and all references to the
deleted elements are unset.</p>
      <p>Consequence: This smell has several negative
implications. First, it introduces redundancy, as the implicit
eContainer reference is always present and an explicit container
reference is a duplication. Second, it increases metamodel
complexity due to this duplication. In case a class is used in
di erent containments, multiple explicit container references
exist. These references are all mutually exclusive, but this
cannot be declared with EMF itself. Furthermore, the
opposite references must be declared as optional, which
weakens their meaning. For example, the PCMRandomVariable
of the PCM metamodel is used in 17 contexts. Therefore,
the class has 17 opposite references, but only one is used
by an instance. Third, the explicit container reference can
harm reuse and evolution of metamodels. In case a
container class is added or removed, this always also requires
the adaption of the contained class. In case di erent
aspects and partitions of metamodels are stored separately,
a cyclic reference between the metamodel of the
containing class and the contained class is necessary. This hinders
reuse, as both metamodels must be present. However, using
an implicit eContainer reference, the metamodel with the
contained class can be reused in other contexts.</p>
      <p>Reason and Rationale: Some may argue that container
references allow ensuring static type safety. However, this
only applies for cases with only one container reference and
realized in Java directly. In case of multiple containing
classes, the static type safety property is weakened, as the
containing class type cannot be determined statically.
Instead, at runtime each property must be checked which is
similar to testing the type of the containing class, but it is
obfuscated that this is indeed a type check.</p>
      <p>In some UML metamodels, associations are used where
both ends are named, and one end is declared as composite.
If this property of the UML metamodel must be preserved,
an explicit container reference cannot be omitted. However,
such naming can exist only for documentary reasons, which
allows ignoring them for the EMF mapping of the UML
metamodel.</p>
      <p>Correction: The explicit container reference can be
removed and its usage in code can be replaced by accessing the
eContainer reference. If only the explicit container reference
was used before, the eContainer reference can be safely cast
to that container. If, however, the explicit container
reference is checked for null, the eContainer reference has to be
checked for the type of the expected container.</p>
      <p>Automatic Detection: Opposite references for containment
references can be detected automatically.</p>
      <p>Occurrences: In the PCM, 85 explicit container references
can be found with 17 of these references originating from the
aforementioned PCMRandomVariable.
5.2</p>
    </sec>
    <sec id="sec-8">
      <title>Obligatory Container Relation</title>
      <p>Description: This smell is a special case of the redundant
container relation smell (Section 5.1). If a containment
relation has an opposite reference that has a lower bound of
1, we call it an obligatory container relation. This is
illustrated in Figure 4. Class C1 contains A and the container
relation is obligatory. As with the redundant container
relation smell, this smell is not relevant in OO, as there is no
explicit containment.</p>
      <p>C1
C2
1
*</p>
      <p>A
*</p>
      <p>Consequence: A cannot be used in any other context. E.g.,
although C2 has a containment relation to A, an instance of
C2 can never contain any instances of A, as the container
relation to an instance of C1 has to be set. In such cases,
the EMF framework does not even allow code generation.</p>
      <p>Reason and Rationale: There are some reasons to use an
obligatory container relation. It ensures type safety when
navigating to the container. It is also possible, that the
developers want to restrict reuse explicitly. However, in most
circumstances the developers were most likely unaware of
these consequences. Obligatory container relations can also
be the result of translation from another format or language
(e.g., UML) by a transformation.</p>
      <p>Correction: To x this smell, remove the container
relation (this will also resolve the redundant container smell).
As the class could only be in one type of container, the
eContainer can be safely cast to that container class.</p>
      <p>Automatic Detection: Obligatory container relations can
easily be detected. However, manual evaluation is still
required, as in some cases they may be intended by the
developer.</p>
      <p>Occurrences: In the PCM, many container relations are
obligatory. We suspect this to be the result of the
transformation from Rational Software Architect.
5.3</p>
    </sec>
    <sec id="sec-9">
      <title>Concern Scattered in Package Hierarchy</title>
      <p>Description: The package hierarchy of a metamodel is
mainly for logical partitioning of its content. We consider
it a bad smell, if the classes that constitute a feature or
concern of the language are spread over multiple packages.
Even crosscutting concerns can be modularized in a more
meaningful way.</p>
      <p>In OO, there are issues similar to this smell, e.g., when
cohesive classes are scattered over packages or assemblies.
However, to our knowledge, there is no explicit smell that
covers the problem on this level. OO smells are more
concerned with the internals of packages: relations between
classes and the internals of classes and methods.</p>
      <p>Consequence: This bad smell has negative consequences
on the understandability and thus maintainability of
metamodels. When a developer tries to understand a metamodel,
he examines its packages and from their content and
documentation (if there is any) tries to conclude its purpose. If
a concern is scattered, the purpose of the package cannot
be fully comprehended without tracing relations that leave
the package. The smell may also increase coupling between
a ected packages and reduce relative cohesion within the
packages.</p>
      <p>Reason and Rationale: We suspect that this smell occurs
mostly, when new concerns are implemented in an already
existent metamodel. The new concern is related to the
concerns of multiple other packages. Parts of the new concern
are then placed in the packages of the related concerns and
so the new concern is ripped apart.</p>
      <p>Correction: A better approach would be to place the new
concern in its own package. The package should further
contain sub-packages for each related concern, which then
contain the classes that are related to these concerns. The
package of the new concern should be placed meaningfully.
If it is a rst order concern, it should be placed below the
root package. If it is a subconcern, its package should be
placed as a subpackage of the parent concern. If it is a
crosscutting concern, it should be placed on the same level,
as the concerns it is intersecting with.</p>
      <p>
        Moving classes can be done through refactorings. Even
the code, which depends on the classes, may be
automatically xed. A mere moving of a ected classes may lead
to other bad smells, if the dependencies are not modi ed.
The new dependencies between packages may lead to
package dependency cycles (see Section 5.5) and violations of
the dependency inversion principle on the package level (see
Section 5.6). This is not the fault of consolidating a concern,
but of dependencies that were improper in the rst place.
An explicit reference structure (e.g., [
        <xref ref-type="bibr" rid="ref30 ref33">33, 30</xref>
        ]) can help in
structuring packages and directing their properties properly.
      </p>
      <p>Automatic Detection: This bad smell is not automatically
detectable. An algorithm is not able to automatically infer
the semantics of parts of the metamodel.</p>
      <p>
        Occurrences: It is di cult to nail down the exact number
of occurrences in the PCM, as this depends on how
negrained its concerns are identi ed. Looking at quite
coarsegrained concerns, there are at least six occurrences of this
smell in the PCM [
        <xref ref-type="bibr" rid="ref32">32</xref>
        ]. The following concerns are a ected:
resource interfaces, middleware infrastructure, performance,
repository (especially interfaces), event communication and
reliability.
5.4
      </p>
    </sec>
    <sec id="sec-10">
      <title>Multiple Concerns in Package</title>
      <p>Description: Conversely to the scattered concern smell,
we also consider it a smell, if a package contains the classes
of multiple concerns. The relation of this smell to OO is
analog to the scattered concern smell. Insu cient
modularization on the package level is an issue in OO. However, we
are not aware of an explicit smell de nition.</p>
      <p>Consequence: Having multiple concerns in one package,
increases the e ort to understand the package, because the
developer has to identify the contained concerns and their
respective classes. Simply put, the package is needlessly
complex. This bad smell might also decrease the cohesion
within the package.</p>
      <p>Reason and Rationale: We suspect that this smell has two
explanations. Developers tend to place classes in packages,
which hold their container or represent a closely related
concern. It is just more convenient to use the existing package
hierarchy than to think of a new structure yourself.</p>
      <p>Correction: How to modularize and package concerns is
already well explained in the resolution part for the
scattered concern smell (see Section 5.3). As already suggested,
new concerns should be placed in their own package. If a
concern is a subconcern, then its package should be placed
as a subpackage.</p>
      <p>Automatic Detection: This bad smell is not automatically
detectable. An algorithm is not able to automatically infer
the semantics of parts of the metamodel.</p>
      <p>
        Occurrences: There are at least two occurrences of this
smell in the PCM [
        <xref ref-type="bibr" rid="ref32">32</xref>
        ]. The following concerns are a ected:
data types and the abstract component type hierarchy, which
both are located in the repository package.
5.5
      </p>
    </sec>
    <sec id="sec-11">
      <title>Package Dependency Cycles</title>
      <p>Description: When creating a metaclass, one of the most
important choices is the selection of appropriate base classes,
from which some functionality can be reused. However,
inheritance is a white-box technique. Therefore, one needs
to fully understand the base classes. Hence, a closer look
into the containing packages is required. This dependency
between packages implied by inheritance can be shown
visualized as a graph. We depicted this graph for the latest
PCM version in Figure 5. This graph may contain cycles
(shown in red).</p>
      <p>In OO, having dependency cycles in assemblies is
considered a bad practice, or is even treated as an error on some
platforms. However, there is not so much emphasis placed
on dependency cycles on the package level.</p>
      <p>Consequence: A consequence of such a circular
dependency may be that to fully understand a package contained
in such a circle, a developer has to understand all packages
contained in this circle. This challenges the appropriateness
of the package structure.</p>
      <p>Especially if the cycle is formed from inheritance
dependencies, the maintainability of the metamodel may su er.
Changes made to the metamodel propagate down the class
hierarchy and thus into other packages where they should
not.</p>
      <p>Reason and Rationale: PCM makes extensive use of
multiple inheritance and the inheritance hierarchy of some
metaclasses is quite high. Therefore, it may have become di cult
to keep an eye on package dependencies.</p>
      <p>Correction: In situations when developers have lost an
overview of the package dependencies, we think that an
overview such as in Figure 5 can already be helpful to avoid
this anti-pattern.</p>
      <p>Automatic Detection: A circular dependency can be
detected automatically (in fact, Figure 5 is entirely generated
by a tool) and could be even automatically resolved by
merging the a ected packages. However, we think a manual
inspection can be more bene cial in such a scenario.</p>
      <p>Occurrences: The occurrences of this pattern in the latest
version of Palladio is shown in Figure 5.
5.6</p>
    </sec>
    <sec id="sec-12">
      <title>Dependency Inversion Principle Violated</title>
      <p>
        Description: The dependency inversion principle [
        <xref ref-type="bibr" rid="ref23">23</xref>
        ] is
a design principle from OO. When translated to
metamodeling it states that high-level classes should not depend on
low-level classes (high- and low-level regarding the level of
abstraction). Both may depend on abstractions. The same
can be said about packages and even metamodels, when the
dependencies of a package or metamodel are regarded as the
combined dependencies of their elements.
      </p>
      <p>Part a) of Figure 6 shows a violation of the principle on the
class level. Package H contains high-level concepts, relative
to which the content from the package L is low-level. Class A
has a dependency (relation, inheritance or containment) to
K. Thus, a high-level class is dependent on a low-level one.
Class K contains further information about A (indicated by
the data attribute). Although it is illustrated as a single
attribute, this information may come in the form of attributes,
relations and containments.</p>
      <p>Consequence: A violation of the dependency inversion
principle may have detrimental e ects on the
maintainability of a metamodel. During evolution, modi cations of a
concern may in uence a more high-level concern. Such
violations do also hinder understanding. When a developer
tries to understand a concern, he may trace the outgoing
relations to more low-level concerns. Thus, he may
examine concerns which are not necessary for understanding the
high-level concern or even irrelevant to his intent.</p>
      <p>Reason and Rationale: In our opinion, these violations
stem from the integration of features. It is most
convenient for a developer to extend an existing class hierarchy by
adding dependencies that point to the new content.
However, there is a di erence between object-oriented design and
metamodels. In OO, it is easier and more natural to
introduce new abstraction layers. In metamodels, on the other
hand, interfaces cannot be used in a similar way, because
usually it is not similar functionality that is added, but new
and di erent data. At rst glance, it seems to be a good
solution just to create a new subclass, which adds the needed
information. However, when multiple new features are
implemented this way, they cannot be combined. Therefore,
in metamodeling, it can be reasonable to violate the
dependency inversion principle in certain cases. A possible rule
would be to do so for core features of the language. A
feature can be considered a core feature, if it is useful in every
use case of the language and for every possible type of user.
Core features should be integrated intrusively into the
metamodel with a violation of dependency inversion principle.
This has the following advantages: type safety, adherence
to cardinality and retrieval in O(1) (constant time).</p>
      <p>Correction: When implementing non-core features, the
dependency inversion principle should be used. In Figure 6,
we point out two possible options.</p>
      <p>In b), the new abstract class B is created as well as a
conb)
A</p>
      <p>B
c)</p>
      <p>A</p>
      <p>K
data</p>
      <p>K
data</p>
      <sec id="sec-12-1">
        <title>High-Level</title>
      </sec>
      <sec id="sec-12-2">
        <title>Concepts</title>
      </sec>
      <sec id="sec-12-3">
        <title>Low-Level</title>
      </sec>
      <sec id="sec-12-4">
        <title>Concepts</title>
        <p>K
data
tainment from A to B. Class K then inherits from B. Thus,
the dependency is reversed and now goes from L to H. This
solution has some bene ts. The instances of K are
contained in instances of A. This enables direct navigation and
thus retrieval in constant time. In addition, the cardinality
can be controlled directly without having to specify complex
constraints. However, type safety is not guaranteed, as the
extended data is not placed in B but in K. This solution has
to be enabled in the initial development, as the class B is
required. This is no issue, if K is also already created during
the initial development or if the future extension of K can
be foreseen. The main disadvantage of this solution is that
H has to be modi ed, if this solution should be implemented
in hindsight.</p>
        <p>
          In c), an alternate solution is shown which does not
require modi cation of H. By either stereotype application [
          <xref ref-type="bibr" rid="ref17 ref18">18,
17</xref>
          ], aspect-oriented extension [
          <xref ref-type="bibr" rid="ref15 ref16">15, 16</xref>
          ] or plain referencing,
instances of K can be associated with instances of A.
Compared to b) this has the disadvantage, that the look-up is in
O(k), where k is the number of instances of K.
        </p>
        <p>Automatic Detection: This smell is not automatically
detectable. An algorithm is not able to deduce if concepts are
higher- or lower-leveled compared to others.</p>
        <p>Occurrences: Within the PCM is at least one serious
occurrence of this smell with regard to the inheritance
hierarchy. The superclass that represents entities that require and
provide interfaces, inherits from a superclass which
represents entities which require and provide resource interfaces.
While the usage of interfaces is a core feature of the PCM,
resource interfaces are not. Regarding violations with
references, there are countless occurrences. They stem from
the intrusive integration of features into more abstract
concepts.
5.7</p>
      </sec>
    </sec>
    <sec id="sec-13">
      <title>Dead Class</title>
      <p>Description: As a result of a refactoring, in some cases
a class is no longer required as its responsibilities are taken
care of by another class. Sometimes, although the references
to the class are deleted, the class itself is not. In OO, this
smell falls under the category of dead code or oxbow code.</p>
      <p>Consequence: This has a negative impact on
understandability since the class has to be considered, even though it
cannot be contained in the rest of the model. Furthermore,
developers may have a hard time trying to understand how
the class is used. When they nally nd out that it is not
used at all, this has an impact on their opinion of the
metamodel.</p>
      <p>Reason and Rationale: The pattern is mainly a result of
bad metamodel reuse. As the metamodel gets large, it is
no longer obvious in which places a class is used. Thus,
when the class is no longer required in one speci c scenario,
it still may be required in another. However, as developers
do not check whether the class is used in some other place,
the class may be left behind with no usage elsewhere in the
metamodel.</p>
      <p>Correction: This problem can be avoided if developers
make sure that classes they no longer need are either still
used elsewhere or deleted.</p>
      <p>Automatic Detection: It is possible to statically detect
that a class cannot be contained in another class. However,
a manual assessment is then required to decide whether this
class is dead, as for root container classes, it is viable (though
not obligatory) to be uncontainable.</p>
      <p>Occurrences: A static analysis of PCM delivers in
total nine uncontainable classes. From these, the classes
UsageModel, Repository, ResourceRepository, System,
ResourceEnvironment and Allocation represent view types
and therefore serve as model roots. Thus, it is perfectly
valid for them to be uncontainable. The class DummyClass
has been introduced to overcome a technical limitation in
the QVT-O compiler, but this is a rather di erent issue (the
purpose of this class is hardly documented, but developers
trying to understand PCM would not expect any reasonable
semantics from a class named like this). However, over the
history, two classes have been left over from refactoring
operations, CharacterisedVariable and
ResourceInterfaceProvidingRequiringEntity. For both of these cases, it is
not obvious that they are no longer needed, so developers
may try to nd usages and fail to do so.
5.8</p>
    </sec>
    <sec id="sec-14">
      <title>Concrete Abstract Class</title>
      <p>Description: This smell is concerned with classes that
should be abstract, but are not. Usually, in a class
hierarchy, a class with subtypes is abstract. However, not every
occurrence is necessarily bad design, as sometimes even a
concrete class might have concrete subclasses.</p>
      <p>In OO, having a concrete abstract class is also a problem.
However, we are not aware of an existing smell de nition.</p>
      <p>Consequence: However, if a class that should be abstract
is not declared as such, this has a negative impact on the
metamodels correctness and understandability. Due to the
fact, that an instance of the metamodel may validly contain
direct instances of a class that should not have any instances,
the metamodel is less correct. Usually this problem is
hidden by self-built model editors, which just do not o er any
possibility to create direct instances of the a ected class.
However, using fully generated model editors (like the EMF
tree editors), this problem does manifest. Further, the
understandability of the metamodel is slightly reduced by this
smell. A developer, who investigates the metamodel,
cannot instantly identify the class as abstract and has to re ect.</p>
      <p>Reason and Rationale: We expect this smell to appear
mainly because of carelessness mistakes.</p>
      <p>Correction: The correction of this smell is trivial. The
a ected class just has to be declared as abstract.</p>
      <p>
        Automatic Detection: Occurrences of this smell can only
partly be detected automatically. When a concrete class has
subclasses, it might be a true case of this smell [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]. If any of
the subclasses are abstract, it is even more likely that there
is an issue. However, manual evaluation is still required, as it
might be the case that the superclass is validly concrete. In
constellations, where all subclasses of the concrete abstract
class are in external metamodels, the smell is not detectable
if the external metamodels are not analyzed. This smell
might lead to wrongful detections of the dead class smell
(5.7). This is the case when the class and its superclasses
are never used within the metamodel but carry the
information of an abstract concept that should be specialized in an
external metamodel.
      </p>
      <p>Occurrences: Within the PCM, the CallReturnAction
class from the SEFF package is a true occurrence of the
concrete abstract class smell. It is a concrete superclass and
cannot be instantiated by the custom build graphical model
editors of the PCM bench. This class cannot be
meaningfully instantiated, as it or its superclasses have no container.
However, it can still be confusing for a developer.
5.9</p>
    </sec>
    <sec id="sec-15">
      <title>Duplicate Features in Sibling Classes</title>
      <p>Description: In metamodels, classes represent concepts
and inheritance is used to specialize concepts by providing a
more comprehensive speci cation. For example, an abstract
component type only describes that a component type has
an interface. This class can be specialized into a component
type that allows having internal components. In case a class
has multiple children, of which some realize the same feature,
this can be seen as a redundancy in the model.</p>
      <p>
        In OO, one could argue that this issue falls under the
duplicate code smell [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ].
      </p>
      <p>Consequence: Redundant declarations harm
maintainability, as they must be maintained equally in all classes. If one
class is overlooked, the metamodel degrades, which hinders
long time evolution of the metamodel. They also have a
negative impact on implementing transformations, as for each
sibling class, the transformation rule must be able to support
the feature. This is necessary, as from a syntactic viewpoint
on the model these features are di erent.</p>
      <p>Reason and Rationale: Duplicated features can appear
when metamodels are altered iteratively. In that case, one
of the sibling classes is extended with a speci c feature, and
later another sibling is extended in the same way. Through
this process, more and more classes have a semantically
identical feature, but they are declared syntactically as di erent
features. While in some cases this situation may be the
effect of limited time, carelessness, or overlooked, it can also
be made intentional. The latter case occurs when not all
siblings require the feature.</p>
      <p>
        Correction: To mitigate the issue of duplicate features,
in OO, a refactoring would move the feature up to the
parent class in case all siblings have the feature [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ]. However,
this can be in violation with the underlying semantics of the
concepts, which are expressed in the classes. Furthermore,
the pull up cannot be used in cases where not all, but some
siblings declare the same feature. An alternative strategy
is to de ne an interface that provides the feature in
question and inherit the interface by all siblings that require the
particular feature. The strategy has two advantages. First,
the meaning of the feature is encapsulated in its own
concept. Second, the interface can be used in transformations.
Therefore, the transformation must only test whether the
interface exists instead of testing multiple classes.
      </p>
      <p>Automatic Detection: An automatic detection of
duplications based on name and type is unreliable, as the
detection is based only on syntactic properties. Therefore,
the detection may result false positives and false negatives.
First, there could be identical typed and named features
that do not represent the same relationship. Second,
features may be named di erently, but still represent the same
idea. Therefore, manual intervention is required.</p>
      <p>Occurrences: In the PCM, the classes
OperationSignature, InfrastructureSignature and EventType have all
a property returnType with the same intended semantic.
These could be extracted into an IValueReturning
interface, which is inherited by the three classes.
5.10</p>
    </sec>
    <sec id="sec-16">
      <title>Classification by Enum</title>
      <p>Description: If an enum is used as an alternate way to
classify a class, we consider it a bad smell. This should not
be confused with using an enum to model a mere property.</p>
      <p>Using an enum for classi cation is one possible solution
of how to model multiple orthogonal classi cations. Part a)
of Figure 7 illustrates the problem. It should be possible to
classify the class Base as either A1 or A2 and additionally
either as B1 or B2. This is not possible by just using an
inheritance hierarchy of the depth of just one. Part b) of
Figure 7 shows a solution by using an enum for the second
classi cation dimension.</p>
      <sec id="sec-16-1">
        <title>Base</title>
      </sec>
      <sec id="sec-16-2">
        <title>Base</title>
        <p>a)
A1 A2
a1 a2</p>
      </sec>
      <sec id="sec-16-3">
        <title>Aspect A</title>
        <p>B1 B2
b1 b2</p>
      </sec>
      <sec id="sec-16-4">
        <title>Aspect B</title>
      </sec>
      <sec id="sec-16-5">
        <title>Base</title>
      </sec>
      <sec id="sec-16-6">
        <title>BType</title>
        <p>b1
b2
A1
a1
A2
a2</p>
      </sec>
      <sec id="sec-16-7">
        <title>BType</title>
        <p>«enum»
B1
B2
b)
A1</p>
        <p>B1</p>
        <p>The naive solution to modeling orthogonal classi cations
is shown in Figure 8. There, every possible combination is
explicitly modeled by inheritance. This obviously has
several disadvantages. It produces high amounts of classes.
Although, a single classi cation dimension is externally
extensible, it is not possible to develop independent extensions,
as every combination of every dimension has to be modeled.</p>
        <p>In OO, classi cation by enum is also a problematic
solution to the problem of orthogonal classi cation dimensions.
However, we are not aware of any bad smell de nition.</p>
        <p>Consequence: Using an enum for additional classi
cations makes the classi cation impossible to extend
externally. Further, in contrast to classi cation by inheritance, it
is not possible to add features to parts of the classi cation
selectively. This might lead to the developer adding features
to the base class, which are only used for speci c values of
the enum. By doing that, the complexity of the class
increases unnecessarily and its understandability su ers. This
is shown in part b) of Figure 7.</p>
        <p>Reason and Rationale: As already stated, using an enum
for classi cation is one possible solution of how to model
multiple orthogonal classi cations. In most situations,
however, it is not a very suited one. Developers use it because
of lack of knowledge of more appropriate solutions. In
addition, it looks simple and little intrusive compared to the
naive approach (see Figure 8). If, however, the developer
wants one classi cation to be closed for extension and it
does not carry any new features that vary for its subtypes,
classi cation by enum can be legitimately used.</p>
        <p>
          Correction: There are two ways to resolve this smell. If
the classi cation is already known when the metamodel is
initially implemented, or it is possible to modify the
metamodel, the composition over inheritance principle [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ] should
be applied. This is shown in part a) of Figure 9. If not,
stereotypization should be applied. This is shown in part b)
of Figure 9.
        </p>
        <p>Automatic Detection: This smell is not automatically
detectable. One could scan for each usage of an enum.
However, not every usage is a classi cation. Therefore, each
enum usage has to be checked manually.</p>
      </sec>
      <sec id="sec-16-8">
        <title>Base B</title>
      </sec>
      <sec id="sec-16-9">
        <title>Base</title>
        <p>A1</p>
        <p>A2
a)</p>
        <p>B1
B2
b)
A
B</p>
        <p>A1
B1</p>
        <p>A2
B2
Occurrences: In the PCM, the classi cation by enum
occurs in the class ImplementationComponentType. It
contains an enum that declares its component type: business
component or infrastructure component. This classi cation
is orthogonal to the classi cation of atomic vs. composite,
which is implemented by inheritance. This enum makes it
impossible to add further component types without
intrusively modifying the PCM.</p>
      </sec>
    </sec>
    <sec id="sec-17">
      <title>CONCLUSION</title>
      <p>Within this paper, we presented a list of metamodel smells
we found in the current version of the PCM. We identi ed
10 di erent types of smells. Simple metamodel errors (which
cause validation errors and prohibit code generation) are not
included, as the PCM is already in operation and thus does
not contain any.</p>
      <p>Two of the presented smells are exclusive to
metamodels. The remaining eight smells also represent issues in OO.
However, there are di erences in the usage of metamodeling,
OO design and code. Therefore, in OO there is not as much
emphasis on the smells which were presented here.</p>
      <p>The smells presented in this paper are speci c to
languages that are similar to EMOF. All smells are concerned
with the following basic concepts: classes, relations and
attributes. Some smells are concerned with more speci c
meta-language features: explicit containments (5.1, 5.2),
modularization (5.3, 5.4, 5.5), inheritance (5.8, 5.9) and
enums (5.10).</p>
      <p>Four of the smells might be detected by scanning for
antipatterns. However, all of them still have to be reviewed,
as there are circumstances where an occurrence is not
necessarily bad design. The remaining six smells can only be
detected by manual review.</p>
      <p>For each smell, we explain how it might come into
being. Some smells are built in by mere carelessness or lack of
knowledge. Therefore, knowledge of these metamodel smells
is very valuable for metamodel developers. Other smells,
however, do only manifest with time, when multiple
evolution steps have been performed (some of them in a
shortsighted manner).</p>
      <p>For each smell, we explained the e ects we observed and
further consequences that we expected. Some smells add
unnecessary complexity. Others simply impair
understandability by obfuscating design decisions or the intended structure
of the metamodel. Some have negative e ects on coupling
and cohesion of packages. Thus, these metamodel smells
have detrimental e ects on metamodel maintainability. The
consequences are even worse, if the metamodel is long living,
is evolved and the smells accumulate without being xed.
Metamodels tend to live in metamodel-centric software
systems. Many tools, like editors, analyzers and simulators,
are built upon them. If the metamodel is changed, all tools
have to be xed. The e ort caused by resolving smells in
the metamodel increases over time, as new dependencies pile
up. Thus, smells should be xed as early as possible.</p>
      <p>Future work includes inspecting further metamodels also
including less mature ones. Further, results from smell and
error detection tool could be incorporated and analyzed.</p>
    </sec>
    <sec id="sec-18">
      <title>ACKNOWLEDGMENTS</title>
      <p>This work was supported by the Helmholtz Association of
German Research Centers and the DFG (German Research
Foundation) under the Priority Program SPP1593: Design
For Future { Managed Software Evolution. We would like to
thank Anne Koziolek, Richard Rhinelander, Kiana Rostami,
Dominik Werle, Kateryna Yurchenko and the anonymous
peer-reviewers for their valuable input.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>T.</given-names>
            <surname>Arendt</surname>
          </string-name>
          and
          <string-name>
            <given-names>G.</given-names>
            <surname>Taentzer.</surname>
          </string-name>
          \
          <article-title>A tool environment for quality assurance based on the Eclipse Modeling Framework"</article-title>
          .
          <source>In: Automated Software Engineering 20.2</source>
          (
          <issue>2013</issue>
          ), pp.
          <volume>141</volume>
          {
          <fpage>184</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>T.</given-names>
            <surname>Arendt</surname>
          </string-name>
          et al. \
          <article-title>De ning and checking model smells: A quality assurance task for models based on the eclipse modeling framework"</article-title>
          .
          <source>In: BENEVOL workshop</source>
          .
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>V.</given-names>
            <surname>Basili</surname>
          </string-name>
          et al. \
          <article-title>A validation of object-oriented design metrics as quality indicators"</article-title>
          .
          <source>In: Software Engineering, IEEE Transactions on 22.10 (Oct</source>
          .
          <year>1996</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>P.</given-names>
            <surname>Bourque</surname>
          </string-name>
          et al.
          <article-title>Guide to the software engineering body of knowledge</article-title>
          . IEEE,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>S. R.</given-names>
            <surname>Chidamber</surname>
          </string-name>
          and
          <string-name>
            <given-names>C. F.</given-names>
            <surname>Kemerer</surname>
          </string-name>
          . \
          <article-title>Towards a Metrics Suite for Object Oriented Design"</article-title>
          .
          <source>In: SIGPLAN Not</source>
          .
          <volume>26</volume>
          .11 (
          <issue>Nov</issue>
          .
          <year>1991</year>
          ), pp.
          <volume>197</volume>
          {
          <fpage>211</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>J.</given-names>
            <surname>Di</surname>
          </string-name>
          Rocco et al. \
          <article-title>Mining Metrics for Understanding Metamodel Characteristics"</article-title>
          .
          <source>In: Workshop on Modeling in Software Engineering. ACM</source>
          ,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>M.</given-names>
            <surname>Elaasar</surname>
          </string-name>
          . \
          <article-title>An approach to design pattern and antipattern detection in mof-based modeling languages"</article-title>
          .
          <source>PhD thesis</source>
          . Carleton University Ottawa,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>M.</given-names>
            <surname>Elaasar</surname>
          </string-name>
          et al. \
          <article-title>Domain-Speci c Model Veri cation with QVT"</article-title>
          .
          <source>In: ECMFA</source>
          . Springer,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>M.</given-names>
            <surname>Fowler</surname>
          </string-name>
          et al.
          <source>Refactoring: Improving the Design of Existing Code. Addison-Wesley</source>
          ,
          <year>1999</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>E.</given-names>
            <surname>Freeman</surname>
          </string-name>
          et al.
          <article-title>Head First Design Patterns</article-title>
          . Head
          <string-name>
            <surname>First. O'Reilly Media</surname>
          </string-name>
          ,
          <year>2004</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>I.</given-names>
            <surname>Garc</surname>
          </string-name>
          a-Magarin~o et al. \
          <article-title>An evaluation framework for MAS modeling languages based on metamodel metrics"</article-title>
          . In:
          <string-name>
            <surname>Agent-Oriented Software Engineering</surname>
          </string-name>
          (
          <year>2009</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>M.</given-names>
            <surname>Genero</surname>
          </string-name>
          et al. \
          <article-title>Building measure-based prediction models for UML class diagram maintainability"</article-title>
          .
          <source>English. In: Empirical Software Engineering</source>
          <volume>12</volume>
          (5
          <year>2007</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>J. J. C.</given-names>
            <surname>Gomez</surname>
          </string-name>
          et al. \
          <article-title>Searching the Boundaries of a Modeling Space to Test Metamodels"</article-title>
          .
          <source>In: Software Testing, Veri cation, and Validation</source>
          , 2008 International Conference on (
          <year>2012</year>
          ), pp.
          <volume>131</volume>
          {
          <fpage>140</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>K.</given-names>
            <surname>Julisch</surname>
          </string-name>
          . \
          <article-title>Understanding and overcoming cyber security anti-patterns"</article-title>
          .
          <source>In: Computer Networks 57.10</source>
          (
          <year>2013</year>
          ), pp.
          <volume>2206</volume>
          {
          <fpage>2211</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>R.</given-names>
            <surname>Jung</surname>
          </string-name>
          et al. \
          <article-title>A Method for Aspect-oriented MetaModel Evolution"</article-title>
          .
          <source>In: Proceedings of the 2Nd Workshop on View-Based, Aspect-Oriented and Orthographic Software Modelling. VAO '14</source>
          . York, United Kingdom: ACM,
          <year>July 2014</year>
          ,
          <volume>19</volume>
          :
          <fpage>19</fpage>
          {
          <fpage>19</fpage>
          :
          <fpage>22</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <given-names>R.</given-names>
            <surname>Jung</surname>
          </string-name>
          et al. \
          <article-title>GECO: A Generator Composition Approach for Aspect-Oriented DSLs"</article-title>
          .
          <source>In: Theory and Practice of Model Transformations: 9th International Conference on Model Transformation</source>
          ,
          <string-name>
            <surname>ICMT</surname>
          </string-name>
          <year>2016</year>
          . Springer International Publishing,
          <year>2016</year>
          , pp.
          <volume>141</volume>
          {
          <fpage>156</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <surname>M. E. Kramer</surname>
          </string-name>
          et al. \
          <article-title>Extending the Palladio Component Model using Pro les and Stereotypes"</article-title>
          .
          <source>In: Palladio Days</source>
          <year>2012</year>
          . Ed. by
          <string-name>
            <given-names>S.</given-names>
            <surname>Becker</surname>
          </string-name>
          et al.
          <source>Karlsruhe Reports in Informatics ;</source>
          <year>2012</year>
          ,
          <fpage>21</fpage>
          . Karlsruhe: KIT, Faculty of Informatics,
          <year>2012</year>
          , pp.
          <volume>7</volume>
          {
          <fpage>15</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18]
          <string-name>
            <given-names>P.</given-names>
            <surname>Langer</surname>
          </string-name>
          et al. \
          <article-title>EMF Pro les: A Lightweight Extension Approach for EMF Models"</article-title>
          .
          <source>In: Journal of Object Technology 11.1</source>
          (
          <issue>2012</issue>
          ),
          <volume>8</volume>
          :1{
          <fpage>29</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [19]
          <string-name>
            <given-names>K.</given-names>
            <surname>Lano</surname>
          </string-name>
          and
          <string-name>
            <given-names>S. K.</given-names>
            <surname>Rahimi</surname>
          </string-name>
          . \
          <article-title>Case study: Class diagram restructuring"</article-title>
          .
          <source>In: Proceedings Sixth Transformation Tool Contest</source>
          ,
          <string-name>
            <surname>TTC</surname>
          </string-name>
          <year>2013</year>
          , Budapest, Hungary,
          <fpage>19</fpage>
          -
          <lpage>20</lpage>
          June,
          <year>2013</year>
          .
          <year>2013</year>
          , pp.
          <volume>8</volume>
          {
          <fpage>15</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          [20]
          <string-name>
            <given-names>J. J.</given-names>
            <surname>Lopez-Fernandez</surname>
          </string-name>
          et al. \
          <article-title>Assessing the Quality of Meta-models"</article-title>
          .
          <source>In: Proceedings of the 11th Workshop on Model Driven Engineering, Veri cation and Validation (MoDeVVa)</source>
          .
          <year>2014</year>
          , p.
          <fpage>3</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          [21]
          <string-name>
            <given-names>M.</given-names>
            <surname>Manso</surname>
          </string-name>
          et al. \
          <article-title>No-redundant Metrics for UML Class Diagram Structural Complexity"</article-title>
          .
          <source>In: Advanced Information Systems Engineering</source>
          . Vol.
          <volume>2681</volume>
          . Lecture Notes in Computer Science. Springer Berlin Heidelberg,
          <year>2003</year>
          , pp.
          <volume>127</volume>
          {
          <fpage>142</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          [22]
          <string-name>
            <given-names>M.</given-names>
            <surname>Marchesi</surname>
          </string-name>
          . \
          <article-title>OOA metrics for the Uni ed Modeling Language"</article-title>
          .
          <source>In: Proceedings of the Second Euromicro Conference on Software Maintenance and Reengineering. Mar</source>
          .
          <year>1998</year>
          , pp.
          <volume>67</volume>
          {
          <fpage>73</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          [23]
          <string-name>
            <given-names>R.</given-names>
            <surname>Martin</surname>
          </string-name>
          .
          <source>Agile Software Development: Principles, Patterns, and Practices. PH</source>
          ,
          <year>2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref24">
        <mixed-citation>
          [24]
          <string-name>
            <given-names>Object</given-names>
            <surname>Management</surname>
          </string-name>
          <article-title>Group (OMG)</article-title>
          .
          <source>MOF 2.4.2 Core Speci cation (formal/2014-04-03)</source>
          .
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref25">
        <mixed-citation>
          [25]
          <string-name>
            <given-names>Object</given-names>
            <surname>Management</surname>
          </string-name>
          <article-title>Group (OMG). Object Constraint Language</article-title>
          ,
          <year>v2</year>
          .0 (
          <issue>formal</issue>
          /06-05-01).
          <year>2006</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref26">
        <mixed-citation>
          [26]
          <string-name>
            <given-names>R. H.</given-names>
            <surname>Reussner</surname>
          </string-name>
          et al.
          <article-title>Modeling and Simulating Software Architectures { The Palladio Approach</article-title>
          . to appear. Cambridge, MA: MIT Press, Oct.
          <year>2016</year>
          . 408 pp.
        </mixed-citation>
      </ref>
      <ref id="ref27">
        <mixed-citation>
          [27]
          <string-name>
            <given-names>L.</given-names>
            <surname>Rising</surname>
          </string-name>
          .
          <article-title>The Patterns Handbook: Techniques, Strategies, and</article-title>
          <string-name>
            <surname>Applications. SIGS</surname>
          </string-name>
          ,
          <year>1998</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref28">
        <mixed-citation>
          [28]
          <string-name>
            <given-names>C. U.</given-names>
            <surname>Smith</surname>
          </string-name>
          and
          <string-name>
            <surname>L. G. Williams. \</surname>
          </string-name>
          <article-title>Software performance antipatterns"</article-title>
          .
          <source>In: Workshop on Software and Performance</source>
          .
          <year>2000</year>
          , pp.
          <volume>127</volume>
          {
          <fpage>136</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref29">
        <mixed-citation>
          [29]
          <string-name>
            <given-names>D.</given-names>
            <surname>Steinberg</surname>
          </string-name>
          et al.
          <source>EMF: Eclipse Modeling Framework. second revised. Eclipse series. Addison-Wesley Longman</source>
          , Amsterdam, Dec.
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref30">
        <mixed-citation>
          [30]
          <string-name>
            <given-names>M.</given-names>
            <surname>Strittmatter</surname>
          </string-name>
          and
          <string-name>
            <given-names>R.</given-names>
            <surname>Heinrich</surname>
          </string-name>
          .
          <article-title>\A Reference Structure for Metamodels of Quality-Aware Domain-Speci c Languages"</article-title>
          .
          <source>In: 13th Working IEEE/IFIP Conference on Software Architecture. Apr</source>
          .
          <year>2016</year>
          , pp.
          <volume>268</volume>
          {
          <fpage>269</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref31">
        <mixed-citation>
          [31]
          <string-name>
            <given-names>M.</given-names>
            <surname>Strittmatter</surname>
          </string-name>
          and
          <string-name>
            <given-names>R.</given-names>
            <surname>Heinrich</surname>
          </string-name>
          . \
          <article-title>Challenges in the Evolution of Metamodels"</article-title>
          .
          <source>In: 3rd Collaborative Workshop on Evolution and Maintenance of Long-Living Software Systems</source>
          . Vol.
          <volume>36</volume>
          .
          <article-title>Softwaretechnik-Trends 1</article-title>
          .
          <year>2016</year>
          , pp.
          <volume>12</volume>
          {
          <fpage>15</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref32">
        <mixed-citation>
          [32]
          <string-name>
            <given-names>M.</given-names>
            <surname>Strittmatter</surname>
          </string-name>
          and
          <string-name>
            <given-names>M.</given-names>
            <surname>Langhammer</surname>
          </string-name>
          . \
          <article-title>Identifying Semantically Cohesive Modules within the Palladio Meta-Model"</article-title>
          .
          <source>In: Symposium on Software Performance. Universitatsbibliothek Stuttgart</source>
          , Nov.
          <year>2014</year>
          , pp.
          <volume>160</volume>
          {
          <fpage>176</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref33">
        <mixed-citation>
          [33]
          <string-name>
            <given-names>M.</given-names>
            <surname>Strittmatter</surname>
          </string-name>
          et al. \
          <article-title>A Modular Reference Structure for Component-based Architecture Description Languages"</article-title>
          . In:
          <article-title>Model-Driven Engineering for ComponentBased Systems</article-title>
          . CEUR,
          <year>2015</year>
          , pp.
          <volume>36</volume>
          {
          <fpage>41</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref34">
        <mixed-citation>
          [34]
          <string-name>
            <given-names>R.</given-names>
            <surname>Subramanyam</surname>
          </string-name>
          and
          <string-name>
            <given-names>M.</given-names>
            <surname>Krishnan</surname>
          </string-name>
          . \
          <article-title>Empirical analysis of CK metrics for object-oriented design complexity: implications for software defects"</article-title>
          .
          <source>In: IEEE Transactions on Software Engineering 29.4</source>
          (
          <year>2003</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref35">
        <mixed-citation>
          [35]
          <string-name>
            <given-names>E.</given-names>
            <surname>Vepa</surname>
          </string-name>
          et al. \
          <article-title>Measuring model repositories"</article-title>
          .
          <source>In: Proceedings of the 1st Workshop on Model Size Metrics</source>
          .
          <year>2006</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref36">
        <mixed-citation>
          [36]
          <string-name>
            <given-names>E.</given-names>
            <surname>Yourdon</surname>
          </string-name>
          and
          <string-name>
            <given-names>L. L.</given-names>
            <surname>Constantine</surname>
          </string-name>
          . Structured Design:
          <article-title>Fundamentals of a Discipline of Computer Program and Systems Design</article-title>
          . 1st.
          <string-name>
            <surname>Prentice-Hall</surname>
          </string-name>
          ,
          <year>1979</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>