diff --git a/lectures/asciidoc/index.adoc b/lectures/asciidoc/index.adoc index c53a9c4ae1769c77d9a4447a93d2f43752c0ddd9..d6df4366ef3383cb2255a468daba7dfbcb0ca5ec 100644 --- a/lectures/asciidoc/index.adoc +++ b/lectures/asciidoc/index.adoc @@ -15,6 +15,14 @@ include::{sourcedir}/gitpod.adoc[leveloffset=+2] include::{sourcedir}/ci.adoc[leveloffset=+2] +=== Oppsummering av øving 1 + +link:slides/individuell-oblig.html[Lysarkene] oppsummerer den individuelle, obligatoriske øving 1 + +=== Kodestank + +link:slides/kodestank.html[Lysark] om såkalt "kodestank" (code smell) + == 2020 === Programvareutvikling diff --git a/lectures/revealjs/individuell-oblig.adoc b/lectures/revealjs/individuell-oblig.adoc new file mode 100644 index 0000000000000000000000000000000000000000..bfd258facdb77fdf31df502ff5293a0df2f3871e --- /dev/null +++ b/lectures/revealjs/individuell-oblig.adoc @@ -0,0 +1,94 @@ += Individuell obligatorisk øving +:customcss: slides.css +:icons: font +:includedir: includes/ +:LECTURE_TOPIC: Øving 1 +:LECTURE_NO: + +include::{includedir}header.adoc[] + +== Læringsmål for øvingen + +* grunnleggende git-ferdigheter +* oppsett av java-prosjekt med maven +* sammenheng mellom navn, struktur og innhold +* oppfriskning om javafx og fxml +* generell feilfinning + +== Hensikt + +Alle skal kunne bidra til prosjektet!!! + +== Grunnleggende git-ferdigheter + +* opprett kodelager på gitlab +* klone mal-kodelager (`git clone`) +* knytte kodelager til annet fjernlager (`git remote`) +* overføre til fjernlager (`git push`) +* lage nye versjoner (`git add` og `git commit`) + +== Java-prosjektoppsett m/maven + +* kildekodemapper og pakkehierarki +** **src/main/java** og **src/main/resources** +** **src/test/java** (og **src/test/resources**) +* pakkehierarki og mappestruktur +** pakkenavn(segmenter) tilsvarer mappestruktur +** både kode og ressurser hører til pakker +** `getClass().getResource(...)` + +== Navn, struktur og innhold + +* klasser og filer, pakker og mapper +* konfigurasjon i pom.xml +** klassenavn (og modulnavn) +** kommandolinje-argumenter +* **module-info.java** +** modulnavn i deklarasjon og `requires` +** pakkenavn i `exports` og `opens` + +== Navn, struktur og innhold + +* **pom.xml** +** konfigurasjon av maven-tillegg +** inkl. kjøring av tester og app +** klassenavn (og modulnavn) +** kommandolinje-argumenter + +== Oppfriskning om javafx og fxml + +[.smaller-80] +* rollefordeling mellom domene- og kontroller-klasse(r) +* kobling mellom fxml og kontroller-klasse +** **fx:id** og **onXyz**-attributter i fxml-fil +** felt og metoder i kontroller-klasse +* programflyt i kontroller +** initiell visning av tilstand +** reaksjon på hendelser +** oppdatering av visning + +== Generell feilfinning + +[.smaller-80] +* tolke symptomer +** hvorfor reagerer ikke appen? +** hvordan finne ledetråder i "stacktracen"? +** hvorfor kalles ikke metoden? +* løse problemet +** utvikle hypoteser om årsaker +** validere (eller falsifiere) hypoteser +** prøve ut løsninger + +== Hva nå? + +[.smaller-80] +* rigging av gruppeprosjekt +** nytt fjernkodelager (satt opp av oss) +** tilpasning av https://gitlab.stud.idi.ntnu.no/it1901/javafx-template/-/tree/main/modules-template[**modules-template**] +* fler-modul-prosjekt +** mye det samme, men litt mer komplisert +** enklere å skille utviklingsoppgaver +* større brukergrensesnitt +** flere kontroller-klasser og fxml-filer + +include::{includedir}footer.adoc[] \ No newline at end of file diff --git a/lectures/revealjs/kodestank.adoc b/lectures/revealjs/kodestank.adoc new file mode 100644 index 0000000000000000000000000000000000000000..6add030304fca0ee61701d59603b077170ceb521 --- /dev/null +++ b/lectures/revealjs/kodestank.adoc @@ -0,0 +1,105 @@ += Kodestank +:customcss: slides.css +:icons: font +:includedir: includes/ +:LECTURE_TOPIC: Kodestank +:LECTURE_NO: + +include::{includedir}header.adoc[] + +== Kodestank (code smell) + +Fra https://en.wikipedia.org/wiki/Code_smell[wikipedia]: + +"Smells are certain structures in the code that indicate violation of fundamental design principles and negatively impact design quality" + +== Kodestank + +* suspekt kode +** virker nå, men kanskje ikke på sikt +** vanskelig å jobbe med +** bryter med god skikk og designprinsipper + +== Lukt fra i fjor + +* innkapsling og tilstand (8) +* bruk av typer og collection-rammeverket (12) +* testing (8) +* avhengigheter og fordeling av klasser/logikk (3) +* app (5) +* IO (4) + +== Innkapsling og tilstand + +* bruk av `public`, ikke bruk av `final` +* manglende validering +* direkte bruk eller returnering av samlinger +* uheldig bruk av **equals** + +== direkte bruk eller returnering + +[source, java] +---- +public Nicknames(Collection<String> nicknames) { + this.nicknames = nicknames; +} + +public Collection<String> getNicknames() { + return this.nicknames; +} +---- + +== Typer og collection-rammeverket + +* feil typer for representasjon av tilstand +** **String**, **java.util.Date**, wrapper-klasser +** kunne brukt **enum**- og **record**-typer +* manglende typeargumenter (såkalt "rå" typer) +* implementasjon i stedet for (riktig) grensesnitt +* implisitt bruk av feil listetyper +* bruk av uhensiktsmessige metoder på samlinger + +== Testing + +* testing av uviktige eller trivielle metoder +* poengløs og feil testing av unntak +* lite informative feilmeldinger +* test av overflatedetaljer i GUI +* rydder ikke opp etter filbehandling + +== Avhengigheter og fordeling av kode + +* IO-kode blandet med domenelogikk +* avhengigheter på feil sted +** til JavaFX-klasser i ikke-UI-moduler +** til REST-tjeneste-klasser + +== App + +* statisk variabler for app-global tilstand +* manglende oppdeling av kontroller-klasser +* uhensiktsmessig håndtering av unntak +* feil implisitt bruk av **toString()** i GUI + +== IO + +* for mye bruk av **File**/**Path** i metodesignaturer +* "try-with-resources" brukes for lite +* bruk av **File**/**Path** for ressurs-filer +* bruk av ikke-flyttbare absolutt stier ved fillagring + +== Hva gjør dere? + +[.smaller-60] +* la flere "lukte" på koden +** parprogrammering +** kodegjennomgang +*** av andre på gruppa +*** læringsassistent +*** tilbakemelding på innlevering +*** verktøy (!) +* tenk dere om: er dette riktig/best måten? +* ikke-funksjonell omstrukturering (refactoring) +* diskuter koden! + +include::{includedir}footer.adoc[] \ No newline at end of file