tutorium-10.tex 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. \documentclass[usepdftitle=false,hyperref={pdfpagelabels=false}]{beamer}
  2. \usepackage{../templates/myStyle}
  3. \begin{document}
  4. \title{\titleText}
  5. \subtitle{Wildcards, equals(), Exceptions}
  6. \author{\tutor}
  7. \date{\today}
  8. \subject{Programmieren}
  9. \frame{\titlepage}
  10. \frame{
  11. \frametitle{Inhaltsverzeichnis}
  12. \setcounter{tocdepth}{1}
  13. \tableofcontents
  14. \setcounter{tocdepth}{2}
  15. }
  16. \section{Einleitung}
  17. \subsection{Quiz}
  18. \begin{frame}{Quiz}
  19. \begin{minipage}[b]{0.45\linewidth}
  20. \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Main.java}
  21. \end{minipage}
  22. \hspace{0.5cm}
  23. \begin{minipage}[b]{0.45\linewidth}
  24. \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Fruit.java, frame=lines, firstline=1, lastline=1]{java}{Fruit.java}
  25. \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Apple.java, frame=lines, firstline=1, lastline=1]{java}{Apple.java}
  26. \begin{itemize}
  27. \item Gibt es einen Compiler-Fehler?
  28. \item Gibt es einen Laufzeit-Fehler?
  29. \item Gibt es eine Ausgabe? Welche?
  30. \end{itemize}
  31. \end{minipage}
  32. \end{frame}
  33. \begin{frame}{Quiz: Antwort}
  34. \begin{block}{Compiler-Fehler}
  35. Type mismatch: cannot convert from List<Apple> to List<Fruit>
  36. \end{block}
  37. \begin{itemize}[<+->]
  38. \item Ohne Zeile 16 gibt es folgende Ausgabe:\\
  39. \myCode{class java.util.LinkedList}\\
  40. \myCode{class java.util.LinkedList}
  41. \item Sowohl \myCode{myFruits = myApples;} als auch \myCode{myApples = myFruits;}
  42. geben einen Compiler-Fehler
  43. \end{itemize}
  44. \end{frame}
  45. \begin{frame}{Quiz: Problem}
  46. \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small]{java}{Fruit-Example-Problem.java}
  47. \end{frame}
  48. \begin{frame}{Quiz: Lösung \#1}
  49. \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{Main-Quiz-solution.java}
  50. \end{frame}
  51. \begin{frame}{Quiz: Lösung \#2}
  52. \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{Main-Quiz-solution2.java}
  53. \end{frame}
  54. \begin{frame}{Beispiel}
  55. \begin{minipage}[b]{0.45\linewidth}
  56. \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, label=Cage.java, frame=lines]{java}{Cage.java}
  57. \end{minipage}
  58. \hspace{0.5cm}
  59. \begin{minipage}[b]{0.45\linewidth}
  60. \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Animal.java}
  61. \end{minipage}
  62. {\tiny Source: \href{http://stackoverflow.com/a/6828257/562769}{StackOverflow}}
  63. \end{frame}
  64. \section{Generics}
  65. \subsection{Wildcards}
  66. \begin{frame}{Wildcards}
  67. \begin{itemize}[<+->]
  68. \item Das \myCode{?} in \myCode{List<?> myList} wird Wildcard
  69. genannt
  70. \item \myCode{?} steht immer nur in der Deklaration, nie in der Initialisierung
  71. \item[$\Rightarrow$] \myCode{?} nur links vom \myCode{=}
  72. \item \myCode{List<?> myList} ist eine "`unbounded Wildcard"'
  73. \begin{itemize}
  74. \item \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, firstline=1, lastline=3]{java}{singleLines.java}
  75. \item \myCode{?} ein bestimmter, aber nicht angegebener Parameter\\
  76. \item[$\Rightarrow$] kann zur Compile-Zeit nicht überprüft werden\\
  77. \item[$\Rightarrow$] Liste darf nicht modifiziert werden
  78. \end{itemize}
  79. \item \myCode{List<? extends Fruit> myList} und \myCode{List<? super Fruit> myList} sind "`bounded Wildcards"'
  80. \end{itemize}
  81. \end{frame}
  82. \begin{frame}{Bounded Wildcards: extends}
  83. \begin{itemize}[<+->]
  84. \item \myCode{List<? extends Fruit> myList} kann als Elemente
  85. \myCode{Fruit} und \myCode{Apple} haben, nicht jedoch
  86. \myCode{Object}
  87. \item Hinweis: "`extends"' ist hier nicht exakt das gleiche
  88. wie bei der Vererbung. Es kann entweder wirklich "`extends"'
  89. oder "`implements"' bedeuten
  90. \item Sowohl in \myCode{List<Fruit>} als auch in
  91. \myCode{List<? extends Fruit>} können
  92. \myCode{Fruit} und \myCode{Apple} beinhalten
  93. \end{itemize}
  94. \end{frame}
  95. \begin{frame}{Bounded Wildcards: super}
  96. \begin{itemize}[<+->]
  97. \item \myCode{List<? super Fruit> myList} kann als Elemente
  98. \myCode{Fruit} und \myCode{Object} haben, nicht jedoch
  99. \end{itemize}
  100. \end{frame}
  101. \begin{frame}{Namenskonvetionen}
  102. Für die Parameter sind folgende Bezeichnungen üblich:
  103. \begin{itemize}
  104. \item E - Element (used extensively by the Java Collections Framework)
  105. \item K - Key
  106. \item N - Number
  107. \item T - Type
  108. \item V - Value
  109. \item S, U, V etc. - 2nd, 3rd, 4th types
  110. \end{itemize}
  111. z.B.
  112. \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, firstline=23, lastline=39]{java}{singleLines.java}
  113. \end{frame}
  114. \subsection{Generics und Polymorphismus}
  115. \begin{frame}{Generics und Polymorphismus}
  116. \begin{itemize}
  117. \item Polymorphismus: \myCode{Fruit myVariable = new Apple();}\\
  118. {\tiny links allgemeiner als rechts}
  119. \item Generics: \myCode{LinkedList<Fruit> myList = new LinkedList<Apple>();}\\
  120. {\tiny Compiler-Fehler: Type mismatch: cannot convert from LinkedList<Apple> to LinkedList<Fruit>}
  121. \end{itemize}
  122. \end{frame}
  123. \subsection{Fazit}
  124. \begin{frame}{Fazit}
  125. \begin{itemize}
  126. \item Wildcards sind schwer
  127. \item Wildcards werdet ihr vermutlich bei den Abschlussaufgaben
  128. nicht benötigen
  129. \end{itemize}
  130. \end{frame}
  131. \subsection{Quellen und Ressourcen}
  132. \begin{frame}{Quellen und Ressourcen}
  133. \begin{itemize}
  134. \item \href{http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html}{JavaDoc Tutorial - Wildcards}
  135. \item \href{http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html}{JavaDoc Tutorial - Wildcards} (extra)
  136. \item \href{http://stackoverflow.com/q/3009745/562769}{What does the question mark in Java generics' type parameter mean?}
  137. \item \href{http://stackoverflow.com/q/12340808/562769}{What's the difference between List<Object> and List<?>}
  138. \item \href{http://stackoverflow.com/q/12348777/562769}{Java: Wildcards again}
  139. \item \href{http://stackoverflow.com/q/14091771/562769}{Incompatible type with Arrays.asList()}
  140. \item \href{http://stackoverflow.com/q/252055/562769}{Java Generics (Wildcards)}
  141. \end{itemize}
  142. \end{frame}
  143. \section{equals}
  144. \subsection{Allgemein}
  145. \begin{frame}{Allgemein}
  146. \begin{itemize}[<+->]
  147. \item Man will ein beliebiges Objekt mit dem momentanen
  148. Objekt auf Gleichheit vergleichen
  149. \item Dazu nutzt man \myCode{myObject.equals(otherObject);}
  150. \item \myCode{myObject} muss dann die \myCode{equals(Object obj)} implementieren
  151. \end{itemize}
  152. Die Implementierung läuft fast immer gleich ab:
  153. \begin{itemize}[<+->]
  154. \item ist \myCode{obj == null} $\rightarrow$ \myCode{return false;}
  155. \item ist \myCode{!(obj instanceof MyClass)} $\rightarrow$ \myCode{return false;}
  156. \item other = (MyClass) obj;
  157. \item vergleich der (relevanten) Attribute
  158. \end{itemize}
  159. \end{frame}
  160. \subsection{Eclipse}
  161. \begin{frame}{Eclipse}
  162. \begin{itemize}
  163. \item Eclipse kann die equals()-Methode generieren
  164. \item \menu{Source > Generate hashCode() and equals()...}
  165. \item Felder auswählen, die für den vergleich wichtig sind
  166. \item nochmals drüber schauen
  167. \end{itemize}
  168. \end{frame}
  169. \section{Exceptions}
  170. \subsection{Allgemeines}
  171. \begin{frame}{Allgemeines}
  172. Exceptions \dots
  173. \begin{itemize}[<+->]
  174. \item \dots sind Objekte vom Typ Throwable
  175. \item \dots unterbrechen den normalen Ablauf eines Programms
  176. \item Mit dem Schlüsselwort \myCode{throw} werden Exceptions
  177. geworfen und mit \myCode{catch} kann man sie abfangen.
  178. \end{itemize}
  179. \pause[\thebeamerpauses]
  180. \begin{exampleblock}{Beispiele für Exceptions}
  181. \begin{itemize}
  182. \item NullPointerException
  183. \item ArrayIndexOutOfBoundsException
  184. \item IllegalArgumentException
  185. \item IllegalStateException
  186. \item IOException
  187. \item \dots
  188. \end{itemize}
  189. \end{exampleblock}
  190. \end{frame}
  191. \begin{frame}{Beispiel: Fibonacci.java}
  192. \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Fibonacci.java}
  193. \end{frame}
  194. \begin{frame}{Beispiel: Main.java}
  195. \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Main-Fibonacci.java}
  196. \end{frame}
  197. \subsection{Pokemon Exception Handling}
  198. \begin{frame}{Anti-Pattern: Pokémon Exception Handling}
  199. \includegraphics[width=0.5\linewidth]{pokemon.jpg}
  200. For when you just Gotta Catch 'Em All.
  201. \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, firstline=5, lastline=9]{java}{singleLines.java}
  202. \end{frame}
  203. \begin{frame}{Anti-Pattern: Pokémon Exception Handling}
  204. Niemals Pokémon Exception Handling anwenden!
  205. \begin{itemize}[<+->]
  206. \item Die Fehlerbehandlung mit \myCode{catch} wird verwendet,
  207. um den Programmablauf nach einem Fehler zu definieren
  208. \item Bei unterschiedlichen Fehlern will man meist unterschiedlich
  209. weiter machen, z.B.
  210. \begin{itemize}
  211. \item IOException: nochmals versuchen
  212. \item NullPointerException: Fehlerbericht an den Entwickler schicken
  213. \item IllegalArgumentException: Fehlerausgabe an den Nutzer
  214. \end{itemize}
  215. \item Durch die verschiedenen \myCode{catch}-Blöcke zeigst du,
  216. dass du an die verschiedenen Fehlerarten gedacht hast
  217. \end{itemize}
  218. \end{frame}
  219. \begin{frame}{Größe des try-Blocks}
  220. \begin{block}{Wichtig}
  221. Der try-Block sollte so klein wie möglich sein.
  222. \end{block}
  223. Gründe:
  224. \begin{itemize}
  225. \item Beim lesen eures Codes wird klarer, wo das Problem
  226. auftreten kann
  227. \item Effizienz
  228. \end{itemize}
  229. \end{frame}
  230. \begin{frame}{Eigene Exceptions}
  231. \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small, label=UniverseExplodeException.java, frame=lines]{java}{UniverseExplodeException.java}
  232. \end{frame}
  233. \begin{frame}{@throws und throws}
  234. \begin{itemize}
  235. \item Exceptions, die nicht von RuntimeException erben, müssen angekündigt werden
  236. \item Ankündigen funktioniert über JavaDoc-Annotation \myCode{@throws} und Methodensignatur mit \myCode{throws}
  237. \end{itemize}
  238. \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=11, lastline=21]{java}{singleLines.java}
  239. \end{frame}
  240. \subsection{Literatur}
  241. \begin{frame}{Literatur}
  242. \begin{itemize}
  243. \item \href{http://docs.oracle.com/javase/tutorial/essential/exceptions/handling.html}{Catching and Handling Exceptions}
  244. \item \href{http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html\#jls-14.20}{JLS 7, Kapitel 14.20}
  245. \end{itemize}
  246. \end{frame}
  247. \section{Praxis}
  248. \subsection{Türme von Hanoi}
  249. \begin{frame}{Türme von Hanoi: Beschreibung}
  250. Das Spiel besteht aus drei Stäben A, B und C, auf die mehrere gelochte Scheiben gelegt werden,
  251. alle verschieden groß.\\
  252. Zu Beginn liegen alle Scheiben auf Stab A, der Größe nach geordnet, mit der
  253. größten Scheibe unten und der kleinsten oben.\\
  254. Ziel des Spiels ist es, den kompletten Scheiben-Stapel
  255. von A nach C zu versetzen.\\
  256. Bei jedem Zug darf die oberste Scheibe eines beliebigen Stabes auf einen
  257. der beiden anderen Stäbe gelegt werden, vorausgesetzt, dort liegt nicht schon eine kleinere Scheibe.
  258. Folglich sind zu jedem Zeitpunkt des Spieles die Scheiben auf jedem Feld der Größe nach geordnet.
  259. \end{frame}
  260. \begin{frame}{Aufgaben}
  261. \begin{block}{Klasse "`Disc"'}
  262. Schreiben Sie zunächst eine Klasse Disc, die eine gelochte
  263. Scheibe repräsentiert und als Attribut einen Durchmesser hat.
  264. \end{block}
  265. \begin{block}{Klasse "`Pole"'}
  266. Schreiben Sie außerdem eine Klasse Pole, die einen Stab repräsentiert. Ein solcher Stab verwaltet eine
  267. Menge von Discs (in einem fest dimensionierten Array) und hat als Attribut einen Namen. Die Klasse
  268. Pole stellt dabei sicher, dass die Scheiben immer in geordneter Reihenfolge (wie oben beschrieben)
  269. auf dem Stab liegen. Hierfür stellt die Klasse Pole die Methoden
  270. \myCode{public boolean push(Disc d)} und
  271. \myCode{public Disc pop()} zur Verfügung.
  272. \end{block}
  273. \end{frame}
  274. \begin{frame}{Aufgaben}
  275. \begin{block}{Methode push}
  276. Die Methode push(Disc d) legt die Scheibe d auf den Stab,
  277. falls dieser noch nicht voll ist und
  278. der Durchmesser der Scheibe d kleiner ist als der Durchmesser
  279. der obersten Scheibe des Stabes. Wird
  280. die Scheibe erfolgreich auf den Stab gelegt, so ist der
  281. Rückgabewert der Methode true, andernfalls
  282. false.
  283. \end{block}
  284. \begin{block}{Methode pop}
  285. Die Methode pop() entfernt die oberste Scheibe des Stabes und
  286. liefert diese als Rückgabewert. Falls
  287. der Stab leer ist, soll der Rückgabewert null sein.
  288. \end{block}
  289. Schreiben Sie, falls nötig, weitere Schnittstellen
  290. (z.B. eine Methode size()) und toString()-Methoden.
  291. \end{frame}
  292. \begin{frame}{Aufgaben}
  293. Eine weitere Klasse Hanoi soll die main-Methode und eine Methode mit der Signatur
  294. \myCode{public static void move(Pole from, Pole help, Pole to)}
  295. erhalten. Die Methode \myCode{move(Pole from, Pole help, Pole to)} legt dabei alle Scheiben das
  296. Stabes from mit Hilfe des Stabes help auf den Stab to. Implementieren Sie diese Methode rekursiv.
  297. Erzeugen Sie dann in der main-Methode einen Stab A mit mehreren Scheiben und zusätzlich zwei leere
  298. Stäbe B und C. Verwenden Sie dann die Methode move(), um die Scheiben von Stab A mit Hilfe des
  299. Stabes B auf Stab C zu legen.
  300. \end{frame}
  301. \section{Abspann}
  302. \subsection{Klausuranmeldung}
  303. \begin{frame}{Klausuranmeldung}
  304. Ist die Klausuranmeldung schon möglich? Bitte anmelden!
  305. \end{frame}
  306. \subsection{Kommende Tutorien}
  307. \begin{frame}{Kommende Tutorien}
  308. \begin{itemize}
  309. \item[4.] 07.01.2013
  310. \item[3.] 14.01.2013
  311. \item[2.] 21.01.2013
  312. \item[1.] 28.01.2013: Abschlussprüfunsvorbereitung
  313. \item[0.] 04.02.2013: Abschlussprüfunsvorbereitung
  314. \item[-] 10.02.2013: Ende der Vorlesungszeit des WS 2012/2013 (\href{http://www.kit.edu/studieren/2873.php}{Quelle})
  315. \end{itemize}
  316. \end{frame}
  317. \framedgraphic{Vielen Dank für eure Aufmerksamkeit!}{../images/Teach-yourself-C++-in-21-days.png}
  318. \end{document}