Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Model-Driven Migration im PHP-Umfeld

Model-Driven Migration im PHP-Umfeld

Slides of my lecture at the University of Applied Sciences Osnabrück at November 25th, 2015.

Martin Helmich

November 25, 2015
Tweet

More Decks by Martin Helmich

Other Decks in Programming

Transcript

  1. 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
  2. Martin Helmich Softwarearchitekt bei Mittwald CM Service 2011 Fachinformatiker Anwendungsentwicklung

    2012 B.A. Wirtschaftinformatik, FH Vechta 2015 M.Sc. Informatik, HS Osnabrück
  3. Microservices Monolithische Applikation Komponenten Microservices Lewis und Fowler, 2014: Microservices

    (http://martinfowler.com/articles/microservices.html) Newman, 2015: Building Microservices, O‘Reilly-Verlag, Sebastopol
  4. Alice Bob Carol Dave „Finde alle Freunde von Alice“ MATCH

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

    Alice“ MATCH (alice{name:“Alice“}) -[:FRIEND_OF]-(f) -[:FRIEND_OF]-(foaf) RETURN foaf
  6. 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
  7. 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
  8. 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“
  9. 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
  10. if ($userInput > 5) { $a = $userInput; } else

    { $a = FALSE; } Welchen Typ hat $a?
  11. MethodCall Variable String value=myObj String value=getFoo Collection IntegerScalar value=5 $a

    = $myObj->getFoo(5); Assignment Variable String value=a value
  12. „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)
  13. „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)
  14. „Finde alle Pakete, die von Paket A abhängig sind“ MATCH

    (p:Package {name: "A"})<-[:DEPENDS_ON]-(dependent) RETURN dependent