Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
HjalmarRutberg committed Nov 21, 2024
2 parents d73fad7 + 820c543 commit b4c6c91
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 91 deletions.
2 changes: 1 addition & 1 deletion compendium/modules/w10-inheritance-lab.tex
Original file line number Diff line number Diff line change
Expand Up @@ -336,7 +336,7 @@ \subsection{Tips och förslag}\label{lab:snake:tips}
\item Diskutera i gruppen om alla har kunskaper nog för att köra git och github, samt för- och nackdelar med det.
\item Om inte alla är bekväma med git och github så överväg om ni vill göra manuell versionshantering med kopiering av nya filer via USB-minne, ssh eller upp- och nedladdning via molnlagring. Efter en konkret upplevelse av manuell versionshantering så får du en djupare förståelse för behovet av verktygsstöd för versionshantering och det blir extra motiverande att lära sig git.
\item Diskutera arbetssätt. Hur ska ni använda github issues, git branch, etc? Eller ska alla pusha till main branch? Ska ni använda github pull requests, github reviews, etc.?
\item Kolla så att du har en \texttt{.gitignore} innan du gör push, så att inte t.ex. maskinkodsfiler hamnar i ert repo, vilket kan medföra kenpigt städjobb och onödiga merge-konflikter. Exempel på en lämplig \code{.gitignore} finns här: \\\url{https://github.com/lunduniversity/introprog/blob/master/workspace/w10_snake/.gitignore}
\item Kolla så att du har en \texttt{.gitignore} innan du gör push, så att inte t.ex. maskinkodsfiler hamnar i ert repo, vilket kan medföra knepigt städjobb och onödiga merge-konflikter. Exempel på en lämplig \code{.gitignore} finns här: \\\url{https://github.com/lunduniversity/introprog/blob/master/workspace/w10_snake/.gitignore}
\item \textbf{Var noga med att göra ert github-repo privat!} Det är inte tillåtet att dela labblösningar på internet -- då kan du efter disciplinärende dömas som skyldig till medhjälp till fusk och du kan bli avstängd från dina studier.
\end{itemize}

7 changes: 5 additions & 2 deletions slides/body/lect-w10-assignments.tex
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
\ifkompendium\else

\Subsection{Gäst: Gustaf Lundh, Axis}

\input{body/lect-w09-inspections-snake.tex}

\begin{Slide}{Gästföreläsning: "Kodgranskningar i praktiken"}
Hjärtligt välkommen: \\ \Emph{Gustaf Lundh}, Senior Developer, Axis
\end{Slide}
Expand All @@ -24,6 +27,8 @@
\end{minipage}%
\end{Slide}



\begin{Slide}{Arvshierarki i \texttt{snake}: Olika typer av varelser}
\begin{center}
\newcommand{\TextBox}[1]{\raisebox{0pt}[1em][0.5em]{#1}}
Expand Down Expand Up @@ -141,8 +146,6 @@
\end{itemize}
\end{Slide}

\input{body/lect-w09-inspections-snake.tex}

\begin{Slide}{Redovisning på obligatorisk schemalagd labbtid}
Första \code{snake}-veckan (w10):
\begin{itemize}\SlideFontTiny
Expand Down
125 changes: 65 additions & 60 deletions slides/body/lect-w10-extends.tex
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,10 @@
\item Klientkod kan \Emph{utvidga} \Eng{extend} ett givet API med egna specifika tillägg.
\end{itemize}

\item Man kan använda arv för att deklarera en gemensam \Emph{bastyp} så att generiska samlingar kan ges en mer specifik elementtyp.
\item Man kan använda arv för att deklarera en gemensam \Emph{bastyp} så att variabler och generiska samlingar kan ges en lagom specifik elementtyp.
\begin{itemize}
\item Det räcker att man vet bastypen för att kunna anropa gemensamma metoder på alla element i samlingen.
\item Det räcker att man vet bastypen för att kunna nå gemensamma medlemmar för alla element i samlingen.
\item Exempel: Alla grönsaker har en vikt.
\end{itemize}
\end{itemize}
\end{Slide}
Expand Down Expand Up @@ -74,7 +75,7 @@

\end{tikzpicture}
\end{center}
Mer om UML-diagram i senare kurser: pfk, omd.\\
Mer om UML-diagram i senare kurser.\\
\href{https://en.wikipedia.org/wiki/Class_diagram}{\SlideFontTiny en.wikipedia.org/wiki/Class\_diagram}

\end{Slide}
Expand Down Expand Up @@ -190,18 +191,18 @@

\begin{Slide}{Behovet av gemensam bastyp}\SlideFontSmall
\begin{REPLsmall}
scala> class Gurka(val vikt: Int)
scala> case class Gurka(vikt: Int)

scala> class Tomat(val vikt: Int)
scala> case class Tomat(vikt: Int)

scala> val gurkor = Vector(new Gurka(200), new Gurka(300))
gurkor: Vector[Gurka] = Vector(Gurka@60856961, Gurka@2fd953a6)
scala> val gurkor = Vector(Gurka(200), Gurka(300))
val gurkor: Vector[Gurka] = Vector(Gurka(200), Gurka(300))

scala> gurkor.map(_.vikt)
res0: Vector[Int] = Vector(200, 300)

scala> val grönsaker = Vector(new Gurka(200), new Tomat(42))
val grönsaker: Vector[Gurka | Tomat] = Vector(Gurka@15f11bfb,Tomat@16a499d1)
scala> val grönsaker = Vector(Gurka(200), Tomat(42))
val grönsaker: Vector[Gurka | Tomat] = Vector(Gurka(200), Tomat(42))

scala> grönsaker.map(_.vikt)
-- [E008] Not Found Error: --------------------------
Expand All @@ -214,7 +215,7 @@

\begin{Slide}{Varför syns inte gemensam medlem i en typunion?}
\begin{REPLsmall}
scala> val grönsaker = Vector(new Gurka(200), new Tomat(42))
scala> val grönsaker = Vector(Gurka(200), Tomat(42))
val grönsaker: Vector[Gurka | Tomat] = Vector(Gurka@15f11bfb,Tomat@16a499d1)

scala> grönsaker.map(_.vikt)
Expand Down Expand Up @@ -279,7 +280,7 @@




\Subsection{Bastyp, \texttt{trait}, \texttt{extends}}



Expand All @@ -288,23 +289,23 @@
\begin{REPL}
scala> trait Grönsak

scala> class Gurka(val vikt: Int) extends Grönsak
scala> case class Gurka(vikt: Int) extends Grönsak

scala> class Tomat(val vikt: Int) extends Grönsak
scala> case class Tomat(vikt: Int) extends Grönsak

scala> val grönsaker = Vector(new Gurka(200), new Tomat(42))
grönsaker: Vector[Grönsak] = Vector(Gurka@3dc4ed6f, Tomat@2823b7c5)
scala> val grönsaker = Vector(Gurka(200), Tomat(42))
val grönsaker: Vector[Grönsak] = Vector(Gurka(200), Tomat(42))


\end{REPL}
\pause
Men det är ännu \Alert{inte} som vi vill ha det:
\begin{REPLnonum}
scala> grönsaker.map(_.vikt)
-- [E008] Not Found Error: --------------------------
1 |grönsaker.map(_.vikt)
| ^^^^^^
| value vikt is not a member of Grönsak
scala> grönsaker.map(_.vikt)
-- [E008] Not Found Error: --------------------------
1 |grönsaker.map(_.vikt)
| ^^^^^^
| value vikt is not a member of Grönsak
\end{REPLnonum}
\end{Slide}

Expand Down Expand Up @@ -356,14 +357,14 @@
trait Grönsak:
val vikt: Int // implementation saknas, inget =

class Gurka(val vikt: Int) extends Grönsak
case class Gurka(vikt: Int) extends Grönsak

class Tomat(val vikt: Int) extends Grönsak
case class Tomat(vikt: Int) extends Grönsak
\end{Code}
Nu har du explicit sagt till kompilatorn att du vill att alla grönsaker har en vikt:
\begin{REPLsmall}
scala> val grönsaker = Vector(new Gurka(200), new Tomat(42)) //funkar även utan new
val grönsaker: Vector[Grönsak] = Vector(Gurka@3dc4ed6f, Tomat@2823b7c5)
scala> val grönsaker = Vector(Gurka(200), Tomat(42))
val grönsaker: Vector[Grönsak] = Vector(Gurka(200), Tomat(42))

scala> grönsaker.map(_.vikt)
val res0: Vector[Int] = Vector(200, 42)
Expand Down Expand Up @@ -474,11 +475,11 @@

\item den \Emph{kan} innehålla delar som \Emph{saknar implementation}

\item den \Emph{kan mixas} med flera andra traits så att olika koddelar kan återanvändas på flexibla sätt.
\item den \Emph{kan mixas} med flera andra traits så att olika koddelar kan kombineras på flexibla sätt.

\item den \Alert{kan inte} instansieras direkt eftersom den är abstrakt.
\item den \Alert{kan inte} instansieras direkt.

\item Från Scala 3 \Emph{kan} den ha \Emph{parametrar} (precis som klasser).
\item den \Emph{kan} ha \Emph{parametrar}\footnote{I gamla Scala 2 kan traits ej ha parametrar} på samma sätt som klasser.
\end{itemize}
\end{itemize}

Expand Down Expand Up @@ -592,6 +593,7 @@


\begin{Slide}{Varför kan kodduplicering orsaka problem?}
\pause
\begin{itemize}
\item Mer att skriva (inte jättestort problem)
\pause
Expand All @@ -616,13 +618,43 @@
\end{Slide}


\Subsection{Subtypspolymorfism och dynamisk bindning}


\begin{Slide}{Subtypspolymorfism och dynamisk bindning}\SlideFontTiny
\begin{Code}[basicstyle=\SlideFontSize{6.2}{7.5}\ttfamily\selectfont]
trait Robot { def work(): Unit }

case class CleaningBot(name: String) extends Robot:
def work(): Unit = println(" Städa Städa")

case class TalkingBot(name: String) extends Robot:
def work(): Unit = println(" Prata Prata")
\end{Code}
\Emph{Polymorfism} betyder ''många former''. Referenserna r och bot nedan kan ha olika ''former'', d.v.s de kan referera till olika sorters robotar. \\ \Emph{Dynamisk bindning} innebär att körtidstypen avgör vilken metod som körs.
\begin{REPL}[numbers=left, basicstyle=\color{white}\SlideFontSize{6.2}{7.5}\ttfamily\selectfont]
scala> def robotDoWork(bot: Robot) = { print(bot); bot.work() }

scala> var r: Robot = CleaningBot("Wall-E")

scala> robotDoWork(r)
CleaningBot(Wall-E) Städa Städa

scala> r = TalkingBot("C3PO")

scala> robotDoWork(r)
TalkingBot(C3PO) Prata Prata
\end{REPL}
\end{Slide}



\ifkompendium
\begin{Slide}{Överskuggning}
\begin{Slide}{Exempel: Överskuggning och \texttt{override}}
\vspace{-0.5em}\scalainputlisting[numbers=left,numberstyle=,basicstyle=\fontsize{11}{13}\ttfamily\selectfont]{../compendium/examples/workspace/w07-inherit/src/vego3.scala}
\end{Slide}
\else
\begin{Slide}{Överskuggning}
\begin{Slide}{Exempel: Överskuggning och \texttt{override}} \SlideFontSmall
\vspace{-0.5em}\scalainputlisting[numbers=left,numberstyle=,basicstyle=\fontsize{6}{7.3}\ttfamily\selectfont]{../compendium/examples/workspace/w07-inherit/src/vego3.scala}
\end{Slide}
\fi
Expand Down Expand Up @@ -684,6 +716,7 @@
\item Om en kodfil bara innehåller \Emph{en enda} klass/trait/singelobjekt ge filen samma namn som innehållet, t.ex. \code{KlassensNamn.scala}
\item Om en kodfil innehåller \Emph{flera} saker, döp filen till något som återspeglar hela innehållet och använd \Emph{liten begynnelsebokstav}, t.ex. \code{drawing-utils.scala} eller \code{bastypensNamn.scala}
\end{itemize}
\item Scala 3 varnar vid arv utanför samma kodfil (se öppna klasser senare).
\end{itemize}
\end{Slide}

Expand Down Expand Up @@ -752,32 +785,6 @@



\begin{Slide}{Terminologi: Polymorfism och dynamisk bindning}\SlideFontTiny
\begin{Code}[basicstyle=\SlideFontSize{6.2}{7.5}\ttfamily\selectfont]
trait Robot { def work(): Unit }

case class CleaningBot(name: String) extends Robot:
override def work(): Unit = println(" Städa Städa")

case class TalkingBot(name: String) extends Robot:
override def work(): Unit = println(" Prata Prata")
\end{Code}
\Emph{Polymorfism} betyder ''många former''. Referenserna r och bot nedan kan ha olika ''former'', d.v.s de kan referera till olika sorters robotar. \\ \Emph{Dynamisk bindning} innebär att körtidstypen avgör vilken metod som körs.
\begin{REPL}[numbers=left, basicstyle=\color{white}\SlideFontSize{6.2}{7.5}\ttfamily\selectfont]
scala> def robotDoWork(bot: Robot) = { print(bot); bot.work() }

scala> var r: Robot = CleaningBot("Wall-E")

scala> robotDoWork(r)
CleaningBot(Wall-E) Städa Städa

scala> r = TalkingBot("C3PO")

scala> robotDoWork(r)
TalkingBot(C3PO) Prata Prata
\end{REPL}
\end{Slide}


\begin{Slide}{Anonym klass}\SlideFontSmall
Om man har en abstrakt typ med saknade implementationer kan man fylla i det som fattas i dessa i ett extra block som ''hängs på'' vid instansiering:
Expand Down Expand Up @@ -838,13 +845,12 @@
\end{Slide}


\begin{Slide}{Förseglade typer med \texttt{sealed}}\SlideFontSmall
\begin{Slide}{Förseglade typer med \texttt{sealed}}\SlideFontTiny
Med en \code{sealed} kan du skapa en \Emph{förseglad} uppräkning:
\begin{Code}
sealed trait Färg(val toInt: Int)
object Färg:
val values = Vector(Spader, Hjärter, Ruter, Klöver)

case object Spader extends Färg(0)
case object Hjärter extends Färg(1)
case object Ruter extends Färg(2)
Expand All @@ -862,6 +868,7 @@
|It would fail on pattern case: Hjärter, Ruter, Klöver
val res0: String = hej
\end{REPLsmall}
Använd hellre \code{enum} så får du både \code{sealed} och mer godis på köpet!
\end{Slide}


Expand All @@ -881,16 +888,14 @@
scala> object StorGurkan extends Gurka(1000, 1_000_000): // ärv på bäst du vill!
override def alternativ = "kan kanske också funka med en betongpelare"
\end{REPLsmall}
\item \code{open} krävs om du vill tysta varning vid arv från en annan kodfil.
\item \code{open} krävs om du vill tysta varning vid \Alert{arv från en annan kodfil}.
\item Du kan även komma undan varningen med \code{import scala.language.adhocExtensions}
\end{itemize}

\url{https://youtu.be/aFmIS5qeetA?t=206}
\end{Slide}


\Subsection{Trait eller abstrakt klass?}

\begin{Slide}{Trait eller abstrakt klass?}\SlideFontSmall
Nyckelordet \code{abstract} behövs framför \code{class} om abstrakta medlemmar:
\begin{REPLsmall}
Expand Down
Loading

0 comments on commit b4c6c91

Please sign in to comment.