diff --git a/lectures/revealjs/12-modular.adoc b/lectures/revealjs/12-modular.adoc index 46ba9c7afc36df15cf6e53c2196342d5c37de4d0..67f5b8cb436fd05941d83efa71cb6e609feed7f2 100644 --- a/lectures/revealjs/12-modular.adoc +++ b/lectures/revealjs/12-modular.adoc @@ -8,59 +8,64 @@ include::{includedir}header.adoc[] [.smaller-80][.center-paragraph] -IT1901 Fall 2020 - {LECTURE_NO} +IT1901 Fall 2021 - {LECTURE_NO} == Overview -- Group deliverable 2 +- Group deliverable 2 (GD2) - Architectural styles -- Modular projects with Maven +- Modular projects with Maven and Java -== Group deliverable 2 +== GD2 - modularisering -- modularisering -** kodingsprosjektet skal deles opp i egnede moduler med avhengigheter mellom (og til andre, relevante moduler) -** bygging styres (fortsatt) av maven og hver modul har hensiktmessig konfigurasjon +* kodingsprosjektet skal deles opp i egnede moduler med avhengigheter +* bygging styres (fortsatt) av maven og hver modul har hensiktmessig konfigurasjon +* maven-moduler er et krav, mens Java-moduler er ikke (men i utgangspunktet anbefalt) +* mer om modularisering senere [.smaller-80] -== Group deliverable 2 (cont.) +== GD2 - arkitektur -- arkitektur (full tre-lags arkitektur) -** kjernelogikken og ui-et skal skilles fra hverandre (domenelaget + brukergrensesnittlaget ) -** persistens med JSON og Jackson evt. alternativt bibliotek (persistenslaget) -*** definere filformat for brukerdata og evt. innstillinger -*** reflektere over og velge mellom dokumentmetafor (desktop) og implisitt lagring (app) -** alle tre lagene spiller sammen +* kjernelogikken (domenelaget) og ui (brukergrensesnittlaget) skal skilles fra hverandre +* persistens med JSON vha. egnet bibliotek, f.eks. Jackson +** definere/dokumentere (?) filformat for brukerdata og evt. innstillinger +* reflektere over og velge mellom dokumentmetafor (desktop) og implisitt lagring (app) +* alle tre lagene spiller sammen -== Group deliverable 2 (cont.) +== GD2 - kodekvalitet -- kodekvalitet -** tester skal skrives for all modulene -** testdekningsgrad (Jacoco) og (annen) kodekvalitet skal sjekkes av egne tillegg ( for eksempel Checkstyle og Spotbugs som plugins) -** rimelig god testdekning av alle lagene +* tester skal skrives for alle modulene +* testdekningsgrad og (annen) kodekvalitet skal sjekkes av egne maven-tillegg (f.eks. **jacoco**, **checkstyle** og **spotbugs**) +* rimelig god testdekning av alle lagene -== Group deliverable 2 (cont.) -- dokumentasjon -** dokumentasjon (readme filer og kommentarer) må oppdateres -** dokumentere arkitektur med minst et diagram (bruk PlantUML) i tillegg til teksten i readme +== GD2 - dokumentasjon -[.smaller-80] -== Group deliverable 2 (cont.) -- arbeidsvaner -** kodingsoppgaver skal være utgangspunktet for alt arbeid (Issues for alle ting som skal gjøres) -** greiner (branch) samler arbeid for hver kodingsoppgave -** bruk milepæl (milestones) knyttet til innleveringen -** dere jobber i par og bytter på å kode +* generell dokumentasjon må holdes oppdatert +* arkitektur med minst et diagram (bruk PlantUML) i tillegg til teksten i readme +* valg knyttet til arbeidsvaner, arbeidsflyt, testing, bruk av verktøy for sjekking av kodekvalitet (f.eks. innstillinger) -[.smaller-80] -== Group deliverable 2 (cont.) -- leverer på gitlab -** prosjektet må være gitpod-klart, så vi kan åpne det i gitpod fra en merkelapp i repoet -** maven skal brukes til kjøring av applikasjonen, testene og av kodekvalitet sjekker -** kode for vurdering må leveres i mastergreina av standard repo for gruppen (https://gitlab.stud.idi.ntnu.no/it1901/groups-2020/gr20nn/gr20nn) -- På Blackboard leverer dere en enkel tekst som nevner at repo-et er klart for vurdering. -- Hvis dere leverer etter fristen, informerer du lærerassistenten. +== GD2 - arbeidsvaner + +* kodingsoppgaver skal være utgangspunktet for alt arbeid +* greiner (branch) samler arbeid for hver kodingsoppgave (?) +** se alternativet **trunk based development** +* bruk milepæl (milestones) knyttet til innleveringen +* dere jobber i par og bytter på å kode +* "produktiv" kode og tester må holde tritt + +== GD2 - lær (i smidig ånd) +* hva virker bra og ikke så bra +* hva er en god oppdeling i og fordeling av arbeidsoppgaver +* ikke lur dere selv eller andre + +[.smaller-80] +== GD2 - leveranse +* prosjektet må være gitpod-klart med Gitpod-knapp i gitlab eller merkelapp i README-fila +* maven skal brukes til kjøring, testing og sjekk av kodekvalitet +* kode må ligge i master-greina av standard kodelager for gruppa +* på Blackboard leveres en enkel tekst om at kodelageret er klart for vurdering +* det er også nå "flytende/anbefalt" frist, så hold kontakt med lærerassistenten om fremdrift == Architectural styles @@ -73,14 +78,13 @@ system will be structured and function. - 3-tier applications - REST -== layers vs tiers +== layers vs. tiers - sometimes the terms are used interchangeably - there is a difference ** layers - logical separation ** tiers - physical separation - [background-color = "#124990"] [color = "#fff6d5"] == monolithic applications @@ -88,7 +92,7 @@ system will be structured and function. == monolithic applications (1) - All the functionality is packed in a single software unit -** presentation +** ui ** logic ** data - designed without modularity @@ -160,8 +164,30 @@ image::../images/lecture12/rtodo.png[canvas, size=contain] [background-color = "#124990"] [color = "#fff6d5"] +== Modularity + +== Modularity + +- means for splitting a large problems into parts +** distribute and isolate work +** distribute artifacts for use and reuse +- more or less supported by tools and languages +** maven - modular build +** java - strong encapsulatation + +[background-color = "#124990"] +[color = "#fff6d5"] +== Modularity with maven + == Modular projects with Maven +- main "parent" module with common configuration +- sub-modules with dependencies +** libraries (and plugins) are modules +** own modules follow architecture +- manages build tasks +** sequenced according to dependencies +** execute in appropriate context e.g. classpath == Modular projects with Maven @@ -170,7 +196,6 @@ image::../images/lecture12/rtodo.png[canvas, size=contain] - the descendent `pom` can override inherited configuration elements - descendant `pom` inherits most elements with the exception of things like artifactid, name which are used to identify the parent `pom` - == Modular projects with Maven (2) - reduce complexity and size of individual build files @@ -178,6 +203,7 @@ image::../images/lecture12/rtodo.png[canvas, size=contain] == Parent pom example +[.smaller-40] ```xml <?xml version="1.0" encoding="UTF-8" ?> @@ -223,6 +249,7 @@ image::../images/lecture12/rtodo.png[canvas, size=contain] == Descendant pom example +[.smaller-40] ```xml <?xml version="1.0" encoding="UTF-8" ?> @@ -256,4 +283,68 @@ image::../images/lecture12/rtodo.png[canvas, size=contain] ``` +[background-color = "#124990"] +[color = "#fff6d5"] +== Modularity with Java + +== Java modules + +[.smaller-80] +* corresponds to a set of packages +* strong encapsulation +** explicitly export packages +** explicitly state dependencies +** also enforced during runtime +* advantages +** avoid relying on internals +** build lighter apps +* disadvantages... + +== core - module-info.java + +```java +module todolist.core { + requires transitive com.fasterxml.jackson.databind; + + exports todolist.core; + exports todolist.json; +} +``` + +== core - https://gitlab.stud.idi.ntnu.no/it1901/todo-list/-/blob/master/todolist/core/src/main/java/module-info.java[module-info.java] + +* module name +** how to get (guess) name of libraries +* **requires** - what this module needs +** **transitive** - others will need this too +** **exports** - what others may use + +== fxui - https://gitlab.stud.idi.ntnu.no/it1901/todo-list/-/blob/master/todolist/fxui/src/main/java/module-info.java[module-info.java] + +```java +module todolist.ui { + requires com.fasterxml.jackson.databind; + + requires java.net.http; + + requires javafx.base; + requires javafx.controls; + requires javafx.fxml; + + requires todolist.core; + requires fxutil; + + opens todolist.ui to javafx.graphics, javafx.fxml; +} +``` + +== fxui - module-info.java + +* **opens** ... *to* - allow getting runtime info about classes using so-called _reflection_ +** fxml +** REST frameworks +** test frameworks +* **--add-opens** command line option +** support unmodularized mode + include::{includedir}footer.adoc[] \ No newline at end of file