SlideShare a Scribd company logo
Code-level Change Propagation in
Virtual Platform
Haider Ali : gushaial@student.gu.se
Gagandeep Singh: gusniga@student.gu.se
Pre-Developer Study Session
Variant-rich Software Systems
● Software Systems developed to reach different customers’ needs
● Different Variants of a same Software System
● Grammarly Example
Standard Variant Premium Variant
Variants Management Techniques
● Clone&own
○ Easy to use and adopt to
○ No feature location or clone detection
Bug in Spelling
● SPL (Software Product Line)
○ Reusable assets (Features) + Configurator
○ Low Maintenance
○ Expensive
Virtual Platform as a Variants Management Framework
● Conceptual Structures
○ Asset (Repository, Folders, Files, Classes, Methods)
○ Asset Tree
○ Traceability Databases
○ Features
○ Feature Model
● Clone Management with Versions
● Feature to asset mappings
● Facilitates migration from Clone&own to SPL
● Propagation of changes
Issues with change propagation in the Virtual Platform?
● Propagation is done by content replacement
● Support for non code based assets and non code related operations
○ Renaming files, Adding new files etc.
● No code-level change propagation
Our Artefact : Code-level change propagation operators
● Applies to only MethodType Assets
● Cater two different scenarios along with Feature Annotations
○ SynchronizeAsset Operator
■ Two-way Synchronization of changes between two assets of same type
■ Wraps the changes with the presence condition
■ Keeps track of the Variations Points
○ IntegrateAsset Operator
■ One-way Propagation of code-level changes
■ Deletion of the source asset from source Variant after propagation
■ Wraps the changes with the presence condition
public void init() {
this.updatePosition();
double angle = Math.random() * Math.PI / 4 - Math.PI / 2;
double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2);
}
public void init() {
this.updatePosition();
double angle = Math.random() * Math.PI / 4 - Math.PI / 2;
double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2);
}
Synchronize Operator (2-way propagation)
Target
Source
Synchronize Operator (2-way propagation)
public void init() {
this.updatePosition();
double angle = Math.random() * Math.PI / 4 - Math.PI / 2;
double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2);
this.updateDeltas(angle, speed);
}
public void init() {
this.setActive(true);
this.updatePosition();
if (Math.random() < 0.5) {
this.setX(AsteroidSprite.getWidth() >> 1);
this.setDeltaX(-this.getDeltaX());
}
}
Target
Source
Synchronize Operator (2-way propagation)
public void init() {
//&begin[Hierarchy Presence Condition]
this.setActive(true);
//&end[Hierarchy Presence Condition]
this.updatePosition();
//&begin[Marked as Variation Point due to deletion in target]
double angle = Math.random() * Math.PI / 4 - Math.PI / 2;
double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2);
//&end[Marked as Variation Point due to deletion in target]
//&begin[Hierarchy Presence Condition]
if (Math.random() < 0.5) {
this.setX(AsteroidSprite.getWidth() >> 1);
this.setDeltaX(-this.getDeltaX());
}
//&end[Hierarchy Presence Condition]
this.updateDeltas(angle, speed);
}
public void init() {
this.setActive(true);
this.updatePosition();
if (Math.random() < 0.5) {
this.setX(AsteroidSprite.getWidth() >> 1);
this.setDeltaX(-this.getDeltaX());
}
//&begin[Hierarchy Presence Condition]
this.updateDeltas(angle, speed);
//&end[Hierarchy Presence Condition]
}
public void init() {
this.updatePosition();
double angle = Math.random() * Math.PI / 4 - Math.PI / 2;
double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2);
this.updateDeltas(angle, speed);
}
public void init() {
this.setActive(true);
this.updatePosition();
if (Math.random() < 0.5) {
this.setX(AsteroidSprite.getWidth() >> 1);
this.setDeltaX(-this.getDeltaX());
}
}
Target
Source
Synchronize Operator (2-way propagation)
public void init() {
//&begin[Hierarchy Presence Condition]
this.setActive(true);
//&end[Hierarchy Presence Condition]
this.updatePosition();
//&begin[Marked as Variation Point due to deletion in target]
double angle = Math.random() * Math.PI / 4 - Math.PI / 2;
double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2);
//&end[Marked as Variation Point due to deletion in target]
//&begin[Hierarchy Presence Condition]
if (Math.random() < 0.5) {
this.setX(AsteroidSprite.getWidth() >> 1);
this.setDeltaX(-this.getDeltaX());
}
//&end[Hierarchy Presence Condition]
this.updateDeltas(angle, speed);
}
public void init() {
this.setActive(true);
this.updatePosition();
if (Math.random() < 0.5) {
this.setX(AsteroidSprite.getWidth() >> 1);
this.setDeltaX(-this.getDeltaX());
}
//&begin[Hierarchy Presence Condition]
this.updateDeltas(angle, speed);
//&end[Hierarchy Presence Condition]
}
public void init() {
this.updatePosition();
double angle = Math.random() * Math.PI / 4 - Math.PI / 2;
double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2);
this.updateDeltas(angle, speed);
}
public void init() {
this.setActive(true);
this.updatePosition();
if (Math.random() < 0.5) {
this.setX(AsteroidSprite.getWidth() >> 1);
this.setDeltaX(-this.getDeltaX());
}
}
Target
Source
{Split of common and
uncommon code in
separate blocks}
}
Integrate Operator (Source -> Target)
public void init() {
this.updatePosition();
double angle = Math.random() * Math.PI / 4 - Math.PI / 2;
double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2);
this.updateDeltas(angle, speed);
}
public void init() {
this.updatePosition();
double angle = Math.random() * Math.PI / 4 - Math.PI / 2;
double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2);
this.updateDeltas(angle, speed);
}
Source Target
public void init() {
this.setActive(true);
this.updatePosition();
double angle = Math.random() * Math.PI / 4 - Math.PI / 2;
double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2);
if (Math.random() < 0.5) {
this.setX(AsteroidSprite.getWidth() >> 1);
this.setDeltaX(-this.getDeltaX());
}
this.updateDeltas(angle, speed);
}
public void init() {
//&begin[Hierarchy Presence Condition]
this.setActive(true);
//&end[Hierarchy Presence Condition]
this.updatePosition();
double angle = Math.random() * Math.PI / 4 - Math.PI / 2;
double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2);
&begin[Hierarchy Presence Condition]
if (Math.random() < 0.5) {
this.setX(AsteroidSprite.getWidth() >> 1);
this.setDeltaX(-this.getDeltaX());
}
&end[Hierarchy Presence Condition]
this.updateDeltas(angle, speed);
}
Integrate Operator (Source -> Target)
public void init() {
this.updatePosition();
double angle = Math.random() * Math.PI / 4 - Math.PI / 2;
double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2);
this.updateDeltas(angle, speed);
}
public void init() {
this.updatePosition();
double angle = Math.random() * Math.PI / 4 - Math.PI / 2;
double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2);
this.updateDeltas(angle, speed);
}
Source Target
public void init() {
this.setActive(true);
this.updatePosition();
double angle = Math.random() * Math.PI / 4 - Math.PI / 2;
double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2);
if (Math.random() < 0.5) {
this.setX(AsteroidSprite.getWidth() >> 1);
this.setDeltaX(-this.getDeltaX());
}
this.updateDeltas(angle, speed);
}
public void init() {
//&begin[Hierarchy Presence Condition]
this.setActive(true);
//&end[Hierarchy Presence Condition]
this.updatePosition();
double angle = Math.random() * Math.PI / 4 - Math.PI / 2;
double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2);
&begin[Hierarchy Presence Condition]
if (Math.random() < 0.5) {
this.setX(AsteroidSprite.getWidth() >> 1);
this.setDeltaX(-this.getDeltaX());
}
&end[Hierarchy Presence Condition]
this.updateDeltas(angle, speed);
}
Integrate Operator (Source -> Target)
public void init() {
this.updatePosition();
double angle = Math.random() * Math.PI / 4 - Math.PI / 2;
double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2);
this.updateDeltas(angle, speed);
}
public void init() {
this.updatePosition();
double angle = Math.random() * Math.PI / 4 - Math.PI / 2;
double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2);
this.updateDeltas(angle, speed);
}
Source Target
public void init() {
//&begin[Hierarchy Presence Condition]
this.setActive(true);
//&end[Hierarchy Presence Condition]
this.updatePosition();
double angle = Math.random() * Math.PI / 4 - Math.PI / 2;
double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2);
&begin[Hierarchy Presence Condition]
if (Math.random() < 0.5) {
this.setX(AsteroidSprite.getWidth() >> 1);
this.setDeltaX(-this.getDeltaX());
}
&end[Hierarchy Presence Condition]
this.updateDeltas(angle, speed);
}
Integrate Operator (Source -> Target)
public void init() {
this.updatePosition();
double angle = Math.random() * Math.PI / 4 - Math.PI / 2;
double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2);
this.updateDeltas(angle, speed);
}
public void init() {
this.updatePosition();
double angle = Math.random() * Math.PI / 4 - Math.PI / 2;
double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2);
this.updateDeltas(angle, speed);
}
Source Target
Developer Study
● Control Groups
○ Manual Synchronization of two assets
○ Manual Integration of an asset in an other
○ Time each synchronization and integration task and note it down
○ Save the results for each task in a file
● Treatment groups
○ Synchronization using SynchronizeAsset operator
○ Integration using IntegrateAsset operator
○ Note down the times for each task
○ Save the results for each task in a file
● Feedback and results Questionnaire
Any Questions?

More Related Content

PPTX
Flink Batch Processing and Iterations
PPTX
Angular2 rxjs
PDF
Async JavaScript in ES7
PPTX
Introduction to rx java for android
PPTX
Michael Häusler – Everyday flink
PDF
Saving lives with rx java
PDF
Advanced Akka For Architects
PDF
Rxjs vienna
Flink Batch Processing and Iterations
Angular2 rxjs
Async JavaScript in ES7
Introduction to rx java for android
Michael Häusler – Everyday flink
Saving lives with rx java
Advanced Akka For Architects
Rxjs vienna

What's hot (20)

PDF
Metadata/Time-Date Tools (Toolkit_MTD)
PDF
Spark RDD-DF-SQL-DS-Spark Hadoop User Group Munich Meetup 2016
PDF
How to Think in RxJava Before Reacting
PDF
Grid gain paper
PDF
Reactive programming with RxJava
PDF
Machinelearning Spark Hadoop User Group Munich Meetup 2016
PDF
Reactive Programming for a demanding world: building event-driven and respons...
PDF
Rxjava meetup presentation
PDF
Advanced Java Practical File
PDF
Harnessing the Power of Java 8 Streams
PPT
Functional Programming Past Present Future
PDF
Parallel streams in java 8
KEY
PPTX
Rxjs ngvikings
PPT
9781305078444 ppt ch03
PPTX
Testing time and concurrency Rx
PPTX
PDF
Data in Motion: Streaming Static Data Efficiently
PDF
The Singleton Pattern In Java
PDF
Practical RxJava for Android
Metadata/Time-Date Tools (Toolkit_MTD)
Spark RDD-DF-SQL-DS-Spark Hadoop User Group Munich Meetup 2016
How to Think in RxJava Before Reacting
Grid gain paper
Reactive programming with RxJava
Machinelearning Spark Hadoop User Group Munich Meetup 2016
Reactive Programming for a demanding world: building event-driven and respons...
Rxjava meetup presentation
Advanced Java Practical File
Harnessing the Power of Java 8 Streams
Functional Programming Past Present Future
Parallel streams in java 8
Rxjs ngvikings
9781305078444 ppt ch03
Testing time and concurrency Rx
Data in Motion: Streaming Static Data Efficiently
The Singleton Pattern In Java
Practical RxJava for Android
Ad

Recently uploaded (20)

PDF
Chinmaya Tiranga quiz Grand Finale.pdf
PDF
Computing-Curriculum for Schools in Ghana
PDF
01-Introduction-to-Information-Management.pdf
PPTX
Cell Structure & Organelles in detailed.
PPTX
GDM (1) (1).pptx small presentation for students
PPTX
PPT- ENG7_QUARTER1_LESSON1_WEEK1. IMAGERY -DESCRIPTIONS pptx.pptx
PDF
OBE - B.A.(HON'S) IN INTERIOR ARCHITECTURE -Ar.MOHIUDDIN.pdf
PDF
O5-L3 Freight Transport Ops (International) V1.pdf
PPTX
Final Presentation General Medicine 03-08-2024.pptx
PDF
Abdominal Access Techniques with Prof. Dr. R K Mishra
PPTX
Lesson notes of climatology university.
PPTX
1st Inaugural Professorial Lecture held on 19th February 2020 (Governance and...
PPTX
human mycosis Human fungal infections are called human mycosis..pptx
PPTX
master seminar digital applications in india
PDF
Classroom Observation Tools for Teachers
PDF
Chapter 2 Heredity, Prenatal Development, and Birth.pdf
PDF
GENETICS IN BIOLOGY IN SECONDARY LEVEL FORM 3
PPTX
Microbial diseases, their pathogenesis and prophylaxis
PDF
Complications of Minimal Access Surgery at WLH
PDF
102 student loan defaulters named and shamed – Is someone you know on the list?
Chinmaya Tiranga quiz Grand Finale.pdf
Computing-Curriculum for Schools in Ghana
01-Introduction-to-Information-Management.pdf
Cell Structure & Organelles in detailed.
GDM (1) (1).pptx small presentation for students
PPT- ENG7_QUARTER1_LESSON1_WEEK1. IMAGERY -DESCRIPTIONS pptx.pptx
OBE - B.A.(HON'S) IN INTERIOR ARCHITECTURE -Ar.MOHIUDDIN.pdf
O5-L3 Freight Transport Ops (International) V1.pdf
Final Presentation General Medicine 03-08-2024.pptx
Abdominal Access Techniques with Prof. Dr. R K Mishra
Lesson notes of climatology university.
1st Inaugural Professorial Lecture held on 19th February 2020 (Governance and...
human mycosis Human fungal infections are called human mycosis..pptx
master seminar digital applications in india
Classroom Observation Tools for Teachers
Chapter 2 Heredity, Prenatal Development, and Birth.pdf
GENETICS IN BIOLOGY IN SECONDARY LEVEL FORM 3
Microbial diseases, their pathogenesis and prophylaxis
Complications of Minimal Access Surgery at WLH
102 student loan defaulters named and shamed – Is someone you know on the list?
Ad

Code level change propagation in virtual platform

  • 1. Code-level Change Propagation in Virtual Platform Haider Ali : gushaial@student.gu.se Gagandeep Singh: gusniga@student.gu.se Pre-Developer Study Session
  • 2. Variant-rich Software Systems ● Software Systems developed to reach different customers’ needs ● Different Variants of a same Software System ● Grammarly Example Standard Variant Premium Variant
  • 3. Variants Management Techniques ● Clone&own ○ Easy to use and adopt to ○ No feature location or clone detection Bug in Spelling ● SPL (Software Product Line) ○ Reusable assets (Features) + Configurator ○ Low Maintenance ○ Expensive
  • 4. Virtual Platform as a Variants Management Framework ● Conceptual Structures ○ Asset (Repository, Folders, Files, Classes, Methods) ○ Asset Tree ○ Traceability Databases ○ Features ○ Feature Model ● Clone Management with Versions ● Feature to asset mappings ● Facilitates migration from Clone&own to SPL ● Propagation of changes
  • 5. Issues with change propagation in the Virtual Platform? ● Propagation is done by content replacement ● Support for non code based assets and non code related operations ○ Renaming files, Adding new files etc. ● No code-level change propagation
  • 6. Our Artefact : Code-level change propagation operators ● Applies to only MethodType Assets ● Cater two different scenarios along with Feature Annotations ○ SynchronizeAsset Operator ■ Two-way Synchronization of changes between two assets of same type ■ Wraps the changes with the presence condition ■ Keeps track of the Variations Points ○ IntegrateAsset Operator ■ One-way Propagation of code-level changes ■ Deletion of the source asset from source Variant after propagation ■ Wraps the changes with the presence condition
  • 7. public void init() { this.updatePosition(); double angle = Math.random() * Math.PI / 4 - Math.PI / 2; double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2); } public void init() { this.updatePosition(); double angle = Math.random() * Math.PI / 4 - Math.PI / 2; double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2); } Synchronize Operator (2-way propagation) Target Source
  • 8. Synchronize Operator (2-way propagation) public void init() { this.updatePosition(); double angle = Math.random() * Math.PI / 4 - Math.PI / 2; double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2); this.updateDeltas(angle, speed); } public void init() { this.setActive(true); this.updatePosition(); if (Math.random() < 0.5) { this.setX(AsteroidSprite.getWidth() >> 1); this.setDeltaX(-this.getDeltaX()); } } Target Source
  • 9. Synchronize Operator (2-way propagation) public void init() { //&begin[Hierarchy Presence Condition] this.setActive(true); //&end[Hierarchy Presence Condition] this.updatePosition(); //&begin[Marked as Variation Point due to deletion in target] double angle = Math.random() * Math.PI / 4 - Math.PI / 2; double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2); //&end[Marked as Variation Point due to deletion in target] //&begin[Hierarchy Presence Condition] if (Math.random() < 0.5) { this.setX(AsteroidSprite.getWidth() >> 1); this.setDeltaX(-this.getDeltaX()); } //&end[Hierarchy Presence Condition] this.updateDeltas(angle, speed); } public void init() { this.setActive(true); this.updatePosition(); if (Math.random() < 0.5) { this.setX(AsteroidSprite.getWidth() >> 1); this.setDeltaX(-this.getDeltaX()); } //&begin[Hierarchy Presence Condition] this.updateDeltas(angle, speed); //&end[Hierarchy Presence Condition] } public void init() { this.updatePosition(); double angle = Math.random() * Math.PI / 4 - Math.PI / 2; double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2); this.updateDeltas(angle, speed); } public void init() { this.setActive(true); this.updatePosition(); if (Math.random() < 0.5) { this.setX(AsteroidSprite.getWidth() >> 1); this.setDeltaX(-this.getDeltaX()); } } Target Source
  • 10. Synchronize Operator (2-way propagation) public void init() { //&begin[Hierarchy Presence Condition] this.setActive(true); //&end[Hierarchy Presence Condition] this.updatePosition(); //&begin[Marked as Variation Point due to deletion in target] double angle = Math.random() * Math.PI / 4 - Math.PI / 2; double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2); //&end[Marked as Variation Point due to deletion in target] //&begin[Hierarchy Presence Condition] if (Math.random() < 0.5) { this.setX(AsteroidSprite.getWidth() >> 1); this.setDeltaX(-this.getDeltaX()); } //&end[Hierarchy Presence Condition] this.updateDeltas(angle, speed); } public void init() { this.setActive(true); this.updatePosition(); if (Math.random() < 0.5) { this.setX(AsteroidSprite.getWidth() >> 1); this.setDeltaX(-this.getDeltaX()); } //&begin[Hierarchy Presence Condition] this.updateDeltas(angle, speed); //&end[Hierarchy Presence Condition] } public void init() { this.updatePosition(); double angle = Math.random() * Math.PI / 4 - Math.PI / 2; double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2); this.updateDeltas(angle, speed); } public void init() { this.setActive(true); this.updatePosition(); if (Math.random() < 0.5) { this.setX(AsteroidSprite.getWidth() >> 1); this.setDeltaX(-this.getDeltaX()); } } Target Source {Split of common and uncommon code in separate blocks} }
  • 11. Integrate Operator (Source -> Target) public void init() { this.updatePosition(); double angle = Math.random() * Math.PI / 4 - Math.PI / 2; double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2); this.updateDeltas(angle, speed); } public void init() { this.updatePosition(); double angle = Math.random() * Math.PI / 4 - Math.PI / 2; double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2); this.updateDeltas(angle, speed); } Source Target
  • 12. public void init() { this.setActive(true); this.updatePosition(); double angle = Math.random() * Math.PI / 4 - Math.PI / 2; double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2); if (Math.random() < 0.5) { this.setX(AsteroidSprite.getWidth() >> 1); this.setDeltaX(-this.getDeltaX()); } this.updateDeltas(angle, speed); } public void init() { //&begin[Hierarchy Presence Condition] this.setActive(true); //&end[Hierarchy Presence Condition] this.updatePosition(); double angle = Math.random() * Math.PI / 4 - Math.PI / 2; double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2); &begin[Hierarchy Presence Condition] if (Math.random() < 0.5) { this.setX(AsteroidSprite.getWidth() >> 1); this.setDeltaX(-this.getDeltaX()); } &end[Hierarchy Presence Condition] this.updateDeltas(angle, speed); } Integrate Operator (Source -> Target) public void init() { this.updatePosition(); double angle = Math.random() * Math.PI / 4 - Math.PI / 2; double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2); this.updateDeltas(angle, speed); } public void init() { this.updatePosition(); double angle = Math.random() * Math.PI / 4 - Math.PI / 2; double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2); this.updateDeltas(angle, speed); } Source Target
  • 13. public void init() { this.setActive(true); this.updatePosition(); double angle = Math.random() * Math.PI / 4 - Math.PI / 2; double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2); if (Math.random() < 0.5) { this.setX(AsteroidSprite.getWidth() >> 1); this.setDeltaX(-this.getDeltaX()); } this.updateDeltas(angle, speed); } public void init() { //&begin[Hierarchy Presence Condition] this.setActive(true); //&end[Hierarchy Presence Condition] this.updatePosition(); double angle = Math.random() * Math.PI / 4 - Math.PI / 2; double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2); &begin[Hierarchy Presence Condition] if (Math.random() < 0.5) { this.setX(AsteroidSprite.getWidth() >> 1); this.setDeltaX(-this.getDeltaX()); } &end[Hierarchy Presence Condition] this.updateDeltas(angle, speed); } Integrate Operator (Source -> Target) public void init() { this.updatePosition(); double angle = Math.random() * Math.PI / 4 - Math.PI / 2; double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2); this.updateDeltas(angle, speed); } public void init() { this.updatePosition(); double angle = Math.random() * Math.PI / 4 - Math.PI / 2; double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2); this.updateDeltas(angle, speed); } Source Target
  • 14. public void init() { //&begin[Hierarchy Presence Condition] this.setActive(true); //&end[Hierarchy Presence Condition] this.updatePosition(); double angle = Math.random() * Math.PI / 4 - Math.PI / 2; double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2); &begin[Hierarchy Presence Condition] if (Math.random() < 0.5) { this.setX(AsteroidSprite.getWidth() >> 1); this.setDeltaX(-this.getDeltaX()); } &end[Hierarchy Presence Condition] this.updateDeltas(angle, speed); } Integrate Operator (Source -> Target) public void init() { this.updatePosition(); double angle = Math.random() * Math.PI / 4 - Math.PI / 2; double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2); this.updateDeltas(angle, speed); } public void init() { this.updatePosition(); double angle = Math.random() * Math.PI / 4 - Math.PI / 2; double speed = MAX_ROCK_SPEED / 2 + Math.random() * (MAX_ROCK_SPEED / 2); this.updateDeltas(angle, speed); } Source Target
  • 15. Developer Study ● Control Groups ○ Manual Synchronization of two assets ○ Manual Integration of an asset in an other ○ Time each synchronization and integration task and note it down ○ Save the results for each task in a file ● Treatment groups ○ Synchronization using SynchronizeAsset operator ○ Integration using IntegrateAsset operator ○ Note down the times for each task ○ Save the results for each task in a file ● Feedback and results Questionnaire