-
Notifications
You must be signed in to change notification settings - Fork 15
/
design_rationale.txt
71 lines (57 loc) · 2.81 KB
/
design_rationale.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
=ElementSet vs. Array
Subject:
Use a special array-like class "ElementSet" with the following properties:
* can call methods of elements by . notation
* can use all set and enumerable methods of Array
* enforce constraints regarding type of elements
* auto register/unregister with counterpart of an association
Dependencies:
* Without the constraint and register/unregister functionality of the ElementSet,
the API of model elements built by MetamodelBuilder has to be different:
instead of "e.myelements << newel" would be "e.addMyelements(newel)"
However this can also be an advantage (see Metamodel Many Assoc API)
A1. ElementSet:
+ nice notation for calling methods of elements (.)
+ nice notation for adding/removing elements from a model element
(e.myelements << newel; e.myelements.delete newel)
- complicated to realize
if ElementSet inherits from Array:
constraints/registration can not be garanteed for all add/remove operations
input and output of Array methods must be wrapped into ElementSet objects
if ElementSet delegates to an Array:
all (relevant) methods have to be delegated (methods from including
Enumerable do not automatically return ElementSet objects)
- dot notation for calling methods of elements my lead to errors which are difficult
to find
A2. Array:
+ a separate operator like >> makes calling methods of elements more explicit
+ very easy to implement
+ easy to understand by users (no "magic" going on)
Decision: (2006-06-08)
A2. Array
Simplicity of implementation and ease of use are more important than a nice notation
= Metamodel Many Assoc API
Subject:
How to implement the API to deal with to-many associations of model elements.
One option is an array like object which is held by the model element for each to-many
association and which is given to the user for modification (external array).
The other option is an internal array which is only accessed via add and remove
methods
Dependencies:
If an external array is used, this array must check the association's constraints
and register/unregister with the other side of the association.
(see ElementSet vs. Array)
A1.External Array
+ nice API (e.myassocs << newel; e. myassocs.delete newel)
+ this is a Rails like API
- a reference to the array might be stored somewhere else in the program and
accidentially be modified, this would modify the model element it belongs to
as well as register/unregister with other model elements leading to errors
which are hard to find
- an external array is complicated to implement (see ElementSet vs. Array)
A2.Internal Array
+ easy to understand for non Ruby/Rails aware users
+ simple implementation
Decision: (2006-06-09)
A2. Internal Array
Simplicity of implementation and ease of use are more important than a nice notation