Commit 37e065d9 authored by Hallvard Trætteberg's avatar Hallvard Trætteberg
Browse files

Nye lysark

parent 9e2d6ed7
......@@ -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
......
= 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
= 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
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment