3.1 Clafer vs the Three Problems
3.1.2 Solving Problem 1: Merging Feature and Class Models
Let us model the running example in Clafer. In general, a Clafer model consists of three types of constructs: clafers, constraints, and goals. In this dissertation, we are only con- cerned with clafers and constraints; goals are discussed elsewhere [99]. Each line in Fig.3.2
declares a new clafer (lines 1-7) or a constraint (in square brackets, line 8). Clafers can be arbitrarily nested (in the containment hierarchy) using indentation: claferoptions is at the top level; clafers size (line 2), cache, and the constraint are nested under options; clafers smalland large are nested undersize; etc. Below we discuss the Clafer model step by step. AppendixC.1 provides the entire model of the running example for reference.
Feature Modeling
The Clafer model in Fig.3.2 corresponds to the model of display options in Fig.2.2c. The clafer options is abstract (cf. keyword abstract)—it has no direct instances, that is, all its instances are instances of some other concrete (i.e., non-abstract) clafer extending it (similar to abstract class in UML). One of the applications of abstract clafers is to support reuse, as we will show shortly.
The clafer options contains a hierarchy of features and a constraint. Each clafer can contain any number of children clafers and constraints, shown by indentation. Clafers can be preceded by group cardinality, which constrains the number of instances of children clafers. For example, the keyword xor means that size allows either small or large but not both (nor none of the two) as a child instance.
Clafers are constrained by multiplicity constraints: a multiplicity is an interval m..n, where m ∈ N, n ∈ N ∪ {∗}, m ≤ n, assuming that i < ∗ for all i ∈ N. A clafer can only have the number of instances l from this interval: m ≤ l ≤ n. Besides direct notation
m..n, some syntactic sugar exists. For example, the clafercacheis followed by the question mark? (meaning 0..1), i.e.,cacheis optional. By default the multiplicity for clafers is 1..1, so size is mandatory; for top-level abstract clafers it is 0..*, so there is no restriction on options. As the examples will show, such a design choice smoothly integrates feature and class models.
Similarly to feature models, Clafer models have an important property: a child clafer cannot exist unless its parent also exists. The clafer size→ int corresponds to a feature with an attribute of type integer; it also nests another clafer fixed (cf. Fig.2.2b). If cache is eliminated, then its children size→int and fixed are eliminated too.
Constraints
Constraints express dependencies among clafers or restrict string and integer values. For example, the constraint in line 8 requires that a small display withcache must have cache of fixedsize. The clafersmallis found withinsize; the full path inserted by the compiler will be this.size.small. We designed constraints after Alloy; its notation is elegant, concise, and expressive enough to restrict both feature and class models. We fully define the constraint language in Appendix B.2.
Each clafer introduces a local namespace. For example, the two different clafers named size exist in different namespaces (one is withinoptions, and one withincache). In general, names are path expressions, used for navigation like in OCL or Alloy. Clafer has name resolution rules; they are important when resolving clafer names used in constraints and clafer definitions. A name is resolved in the context of a clafer using the following rules. First, it is checked whether it is a special reserved name, such as this. Second, it is looked up in descendants in the containment hierarchy in a breadth-first-search manner. If it is not found, the algorithm searches within the ancestor clafers. Otherwise, the name is looked up in all top-level definitions. If the name cannot be resolved or is ambiguous within one rule, an error is reported.
Class-Based Meta-Modeling
Figure3.3shows a component meta-model (from Fig.2.2b) encoded in Clafer. Claferversion (line 2) corresponds to the attribute of the class comp in Fig.2.2b; and clafer server (line 7) corresponds to the unidirectional association pointing to the classECUin Fig.2.2b. All concrete clafers are contained by their parents (the synthetic root is a parent of top-level clafers). Clafers declared using the arrow notation (versionandserver) are reference clafers,
1 abstract comp 2 version→int 3
4 abstract ECU : comp 5
6 abstract display : comp 7 server→ECU
8 ‘options// shorthand for options : options 9 [ version≥server.version ]
Figure 3.3: Component meta-model in Clafer OOM Concepts Clafer Concepts
class
clafer property
reified association
single inheritance single inheritance containment clafer nesting unidirectional association reference clafer
bag-valued bag
set-valued set
multiplicity multiplicity
Table 3.1: Corresponding concepts in OOM and Clafer
i.e., they hold references to instances (note that primitive types are clafers, too). All other clafers are called basic clafers—they have no references. Table 3.1 summarizes OOM and Clafer constructs. Although association reification is a transformation in UML, in Clafer it is captured by the concept of clafer, as associations are always reified.
Clafer supports single inheritance. If clafer A extends clafer B (written A : B), then every instance of A is also an instance of B. In Fig.3.3, clafer ECU inherits version from comp. The claferdisplay additionally extends compby adding two clafers and a constraint stating that display’s version cannot be lower than server’s version. Inheritance in Clafer is disjoint by default.
Quotation (see ‘options in Fig.3.3) is a syntactic sugar for inheritance. Syntactically, quotation ‘A expands to A : A. It introduces a clafer that extends another clafer (defined elsewhere in the model) and reuses its name. In the running example, quotation will
1 abstract plaECU : ECU 2 plaDisplay : display 1..2 3 [ !cache 4 server = parent ] 5 6 ECU1 : plaECU 7 8 ECU2 : plaECU ? 9 master→ECU1
Figure 3.4: Architectural template in Clafer
effectively includeoptions from Fig.3.2 as a part of display in Fig.3.3.
While inheritance is about sharing a supertype, reference clafers enable sharing in- stances. The reference claferserver will point to someECUinstance. In general, there may be several displays that will reference the same ECUinstance as a server.
Mixing class and feature models in Clafer is done via inheritance or reference clafers. If a clafer has a supertype, the supertype can be any clafer, regardless of whether it plays the role of a feature or a class. Similarly, any clafer can be the target of a reference clafer. The concept of clafer is flexible. It can model (reified) unidirectional associations, set- and bag-valued collections, and containment among clafers, which mitigates the problems discussed in Sect.2.2.