Slide 1

Slide 1 text

Model-Driven Migration im PHP-Umfeld Martin Helmich Mittwald CM Service GmbH & Co. KG Hochschule Osnabrück – Fakultät für Ingenieurwissenschaften und Informatik 25. November 2015

Slide 2

Slide 2 text

Martin Helmich Softwarearchitekt bei Mittwald CM Service 2011 Fachinformatiker Anwendungsentwicklung 2012 B.A. Wirtschaftinformatik, FH Vechta 2015 M.Sc. Informatik, HS Osnabrück

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

Altsystem ? Zielarchitektur ?

Slide 5

Slide 5 text

Microservices Monolithische Applikation Komponenten Microservices Lewis und Fowler, 2014: Microservices (http://martinfowler.com/articles/microservices.html) Newman, 2015: Building Microservices, O‘Reilly-Verlag, Sebastopol

Slide 6

Slide 6 text

CC BY-SA 3.0, Photones https://commons.wikimedia.org/wiki/File:Heureka_(Plastik).jpg

Slide 7

Slide 7 text

Grafen

Slide 8

Slide 8 text

Graphen Knoten Knoten Knoten

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

Alice Bob Carol Dave „Finde alle Freunde von Alice“ MATCH (alice{name:“Alice“})-[:FRIEND_OF]-(f) RETURN f

Slide 12

Slide 12 text

Alice Bob Carol Dave „Finde alle Freunde von Freunden von Alice“ MATCH (alice{name:“Alice“}) -[:FRIEND_OF]-(f) -[:FRIEND_OF]-(foaf) RETURN foaf

Slide 13

Slide 13 text

Alice Bob Carol Dave „Finde alle, die Alice über höchstens 5 Ecken kennt“ MATCH (alice{name:“Alice“}) -[:FRIEND_OF*1..5]-(f) RETURN f

Slide 14

Slide 14 text

namespace HSOS; use MW\SuperFoo; class FooClass extends SuperFoo { // ... } class name=FooClass abstract=false final=false ... extends name=SuperFoo stmts namespace name=HSOS uses name=MW\SuperFoo stmts

Slide 15

Slide 15 text

MATCH (class:Stmt_Class)-[:SUB_NAME]->(className) OPTIONAL MATCH (namespace:Stmt_Namespace)-[:SUB|HAS*]->(class), (namespace)-[:SUB_NAME]->(namespaceName) OPTIONAL MATCH (class)-[:SUB_EXTENDS]->(parentName) OPTIONAL MATCH (class)-[:SUB_IMPLEMENTS]->()-[:HAS]->(interfaceName) RETURN namespaceName.allParts, className.allParts, parentName.allParts, collect(interfaceName.allParts) „Ermittle aus den AST‘s aller importierten Dateien alle deklarierten PHP-Klassen und ihre Vererbungshierarchie“

Slide 16

Slide 16 text

class name=Mw\Example\Car file name=src/Mw/Example/Car.php type name=Mw\Example\Car class name=Mw\Example\Wheel file name=src/Mw/Example/Wheel.php type name=Mw\Example\Wheel interface name=Mw\Example\Vehicle type name=Mw\Example\Vehicle file name=src/Mw/Example/Vehicle.php package name=mw/example CONTAINS_FILE DEFINED_IN DEFINED_IN DEFINED_IN IS IS IS property name=wheels visibility=private

Slide 17

Slide 17 text

Typisierung in PHP – oder – „Warum ich PHP hasse“

Slide 18

Slide 18 text

function test($a) { echo "Hallo" . $a; } Welchen Typ hat $a?

Slide 19

Slide 19 text

if ($userInput > 5) { $a = $userInput; } else { $a = FALSE; } Welchen Typ hat $a?

Slide 20

Slide 20 text

if (class_exists($userInput)) { $instance = new $userInput(); } else { $instance = NULL; } Welchen Typ hat $a?

Slide 21

Slide 21 text

MethodCall Variable String value=myObj String value=getFoo Collection IntegerScalar value=5 $a = $myObj->getFoo(5); Assignment Variable String value=a value

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

Monolithische Applikation

Slide 24

Slide 24 text

Monolithische Applikation Microservice

Slide 25

Slide 25 text

Monolithische Applikation Microservice Webservice (REST, AMQP, …)

Slide 26

Slide 26 text

„Für jeden statischen Methodenaufruf einer Klasse aus einer anderen Klasse heraus, generiere eine USES-Beziehung zwischen den beiden Klassen“ MATCH (name:Name)<-[:SUB {type: "class"}]-(call:Expr_StaticCall) <-[:SUB|HAS*]-(:Stmt_ClassMethod) <-[:HAS]-() <-[:SUB {type: "stmts"}]-(:Stmt_Class) <-[:DEFINED_IN]-(c:Class) WHERE call.class <> "parent" AND name.fullName IS NOT NULL MATCH (t:Type {name: name.fullName}) MERGE (c)-[:USES]->(t)

Slide 27

Slide 27 text

„Besteht eine USES-Beziehung zwischen zwei Klassen aus verschiedenen Paketen, erstelle eine DEPENDS_ON-Beziehung zwischen diesen beiden Paketen“ MATCH (p1:Package)-[:CONTAINS_FILE]->(:File) -[:HAS|SUB*]->() <-[:DEFINED_IN]-(user) -[:USES]->(:Type) -[:IS]->(usee) -[:DEFINED_IN]->() <-[:HAS|SUB*]-(:File) <-[:CONTAINS_FILE]-(p2:Package) WHERE (user:Class OR user:Interface OR user:Trait) AND (usee:Class OR usee:Interface OR usee:Trait) AND p1 <> p2 MERGE (p1)-[:DEPENDS_ON]->(p2)

Slide 28

Slide 28 text

„Finde alle Pakete, die von Paket A abhängig sind“ MATCH (p:Package {name: "A"})<-[:DEPENDS_ON]-(dependent) RETURN dependent

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

Monolithische Applikation Microservice Webservice (REST, AMQP, …)

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

Das Ergebnis https://github.com/mittwald/flow-metamorph https://github.com/martin-helmich/graphpizer-server https://github.com/martin-helmich/graphpizer-cli

Slide 33

Slide 33 text

Abschlussarbeiten https://karriere.mittwald.de/berufseinsteiger/studenten.html