tutorium-12.tex 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. \documentclass[usepdftitle=false,hyperref={pdfpagelabels=false}]{beamer}
  2. \usepackage{../templates/myStyle}
  3. \begin{document}
  4. \title{\titleText}
  5. \subtitle{Überladung, Bindung, List, Dictionarys}
  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. %\AtBeginSection[]{
  17. % \InsertToC[sections={\thesection}] % shows only subsubsections of one subsection
  18. %}
  19. \section{Einleitung}
  20. \subsection{Quiz}
  21. \begin{frame}{Quiz}
  22. \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny,frame=lines,label=Main.java]{java}{QuizMain.java}
  23. \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{CrazyDataStructure.java}
  24. \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{ListLike.java}
  25. \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{ArrayListLike.java}
  26. \begin{itemize}
  27. \item Gibt es einen Compiler-Fehler?
  28. \item Gibt es einen Laufzeit-Fehler?
  29. \item Alles klappt
  30. \end{itemize}
  31. \end{frame}
  32. \begin{frame}{Quiz: Antwort}
  33. \begin{block}{Antwort}
  34. Alles klappt. Da ArrayListLike von ListLike erbt, erbt die
  35. Klasse natürlich auch die Methoden. Insbesondere erbt sie
  36. die Methoden, die CrazyDataStructure erwartet. Also
  37. implementiert auch ArrayListLike das Interface ListLike,
  38. obwohl es nicht explizit dort steht.
  39. \end{block}
  40. \end{frame}
  41. \section{Überladung}
  42. \subsection{Musterlösung}
  43. \begin{frame}{Musterlösung}
  44. Eine Musterlösung zu Blatt 5 ist
  45. \href{https://github.com/MartinThoma/prog-ws1213/tree/master/Blatt-05/tutor-solution/Blatt5/src/mediabib}{hier}.
  46. \end{frame}
  47. \begin{frame}{Überladung}
  48. \begin{exampleblock}{Allgemein}
  49. \begin{enumerate}[<+->]
  50. \item \myCode{void myFunction(int a);} und \myCode{void myFunction();}
  51. \item \myCode{int myFunction();} und \myCode{double myFunction();}
  52. \begin{itemize}
  53. \item Geht in Java nicht
  54. \item Funktioniert aber in Perl und Haskell (\href{http://stackoverflow.com/a/442291/562769}{Quelle})
  55. \end{itemize}
  56. \item \myCode{void myFunction();} und \myCode{int myFunction(int a);}
  57. \item \myCode{void myFunction(String a);} und \myCode{void myFunction(int a);}
  58. \item \myCode{void myFunction(String a);} und \myCode{void myFunction(int a, int b);}
  59. \item \myCode{void myFunction(String a, int b);} und \myCode{void myFunction(int b, String a);}
  60. \end{enumerate}
  61. \end{exampleblock}
  62. \end{frame}
  63. \begin{frame}{Überladung}
  64. So was geht nicht:
  65. \begin{itemize}[<+->]
  66. \item \myCode{void myFunction(int a, int b);} und \myCode{void myFunction(int b, int a);}
  67. \item \myCode{void myFunction(String a, int b);} und \myCode{void myFunction(String b, int a);}
  68. \item[$\Rightarrow$] Für den Compiler ist der Bezeichner "`a"' bzw. "`b"' in der Signatur egal\\
  69. Dort sind nur der Rückgabewert, der Name der Methode und die Parameter-Typen und deren Reihenfolge wichtig\\
  70. In Java nicht mal der Rückgabewert
  71. \end{itemize}
  72. \end{frame}
  73. \begin{frame}{Überladung}
  74. \begin{block}{\href{http://docs.oracle.com/javase/specs/jls/se7/jls7.pdf}{Java Language Specification}, 8.4.2}
  75. Two methods have the same signature if they have the same name and argument types.
  76. \end{block}
  77. Beispiele:
  78. \begin{itemize}
  79. \item \href{http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html\#signum(double)}{Math.signum(double)},
  80. \href{http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html\#signum(float)}{Math.signum(float)}
  81. \item PrintStream:
  82. \href{http://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html\#println()}{println();},
  83. \href{http://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html\#println(boolean)}{println(boolean);},
  84. \href{http://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html\#println(char)}{println(char);} \dots
  85. \item Interface List:
  86. \href{http://docs.oracle.com/javase/7/docs/api/java/util/List.html\#toArray()}{Object[] toArray();},
  87. \href{http://docs.oracle.com/javase/7/docs/api/java/util/List.html\#toArray(T[])}{<T> T[] toArray(T[] a)}
  88. \end{itemize}
  89. \end{frame}
  90. \section{Bindung}
  91. \subsection{Allgemeines}
  92. \framedgraphic{Bindung}{Bindung.png}
  93. \begin{frame}{"`Early Binding"' und "`Late Binding"'}
  94. Bindung kann für jeweils ein Objekt zu zwei Zeitpunkten stattfinden:
  95. \begin{block}{Early binding, static binding, compile-time-binding}
  96. References are resolved at compile time:
  97. \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=5, lastline=7]{java}{singleLines.java}
  98. \end{block}
  99. \begin{block}{Late binding, dynamic binding, run-time-binding}
  100. References are resolved at run time:
  101. \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=9, lastline=13]{java}{singleLines.java}
  102. \end{block}
  103. {\tiny Quelle: \href{http://stackoverflow.com/a/640990/562769}{StackOverflow}}
  104. \end{frame}
  105. \begin{frame}{Weitere}
  106. \begin{itemize}
  107. \item \href{http://en.wikipedia.org/wiki/Loose_coupling}{Loose coupling} (Lose Kopplung)
  108. \item Loose binding - nicht weit verbreitet, vermutlich falscher Begriff
  109. \item \href{http://en.wikipedia.org/wiki/Dynamic_dispatch}{Dynamic dispatch}:
  110. Laut Wikipedia das gleiche wie "`dynamic binding"'.
  111. \end{itemize}
  112. \end{frame}
  113. \begin{frame}{"`Dynamic Binding"' und "`Dynamic dispatch"'}
  114. \begin{itemize}
  115. \item \href{http://en.wikipedia.org/wiki/Dynamic_dispatch\#Single_and_multiple_dispatch}{Single and multiple dispatch} - Java unterstützt nur single dispatch
  116. \item \href{http://stackoverflow.com/questions/533330/dynamic-dispatch-and-binding}{Are dynamic dispatch and dynamic binding the same thing?} - No.
  117. \item Aber: Late binding and dynamic single dispatch are, for all intents and purposes, the same. (\href{http://stackoverflow.com/a/9470993/562769}{Quelle})
  118. \item Paper "`\href{http://homepages.mcs.vuw.ac.nz/~alex/files/MuscheviciPotaninTemperoNobleOOPSLA2008.pdf}{Multiple Dispatch in Practice}"'
  119. \end{itemize}
  120. \end{frame}
  121. \section{Nachbesprechung}
  122. \subsection{Polymorphismus nutzen}
  123. \begin{frame}{Polymorphismus}
  124. \begin{itemize}
  125. \item Was ihr schreibt:
  126. \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=1, lastline=1]{java}{singleLines.java}
  127. \item Besser wäre:
  128. \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=2, lastline=2]{java}{singleLines.java}
  129. \item Nicht vergessen:
  130. \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=3, lastline=3]{java}{singleLines.java}
  131. \end{itemize}
  132. Warum ist Polymorphismus toll?
  133. \begin{itemize}
  134. \item siehe \href{http://www.artima.com/objectsandjava/webuscript/PolymorphismInterfaces1.html}{Polymorphism and Interfaces}
  135. \item siehe 9. Tutorium
  136. \end{itemize}
  137. \end{frame}
  138. \subsection{Interne Comparatoren}
  139. \begin{frame}{Interne Comparatoren}
  140. \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{InternalComparator.java}
  141. {\tiny \href{http://martin-thoma.com/how-to-sort-with-java/\#Internal_anonymous_Comparator}{Quelle}}
  142. \end{frame}
  143. \subsection{switch und String}
  144. \begin{frame}{switch und String}
  145. \begin{itemize}[<+->]
  146. \item Erst mit Java SE 7 kann man \myCode{switch} auf eine Variable vom Typ \myCode{String} anwenden
  147. \item \dots 16 Jahre nach dem Feature Request! (\href{http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=1223179}{Quelle})
  148. \item Vorher: \myCode{Cannot switch on a value of type String.}\\
  149. \myCode{Only int values or enum constants are permitted}
  150. \item Problem: Strings sind Objekte
  151. \item Java-Puzzle: \myCode{new String("{}abc") != "{}abc";}
  152. \item Java verwendet \myCode{.equals()} (\href{http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html}{Quelle})
  153. \item \href{http://stackoverflow.com/a/338230/562769}{Mehr infos}
  154. \end{itemize}
  155. \end{frame}
  156. \begin{frame}{switch und String}
  157. Früher hat man einen Enum verwendet:
  158. \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small]{java}{Switch.java}
  159. \end{frame}
  160. \subsection{Annotationen}
  161. \begin{frame}{Quiz}
  162. \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, frame=lines, label=Person.java]{java}{PersonQuiz.java}
  163. \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{AnnotationQuiz.java}
  164. \end{frame}
  165. \begin{frame}{Quiz: Antwort}
  166. \begin{block}{Compiler-Fehler}
  167. Exception in thread "main" java.lang.Error: \\
  168. Unresolved compilation problem: \\
  169. The method shout() of type Person must override or implement a supertype method\\
  170. at Person.shout(Person.java:12)\\
  171. at Main.main(Main.java:4)
  172. \end{block}
  173. \end{frame}
  174. \begin{frame}{@Override-Annotation}
  175. Die Annotation \myCode{@Override} \dots
  176. \begin{itemize}[<+->]
  177. \item Sollte verwendet werden, damit der Compiler euch warnen
  178. kann, wenn ihr nichts überschreibt
  179. \item[$\Rightarrow$] Tippfehler werden unwahrscheinlicher
  180. \item Anderen ist klar, dass euch klar war, dass ihr etwas
  181. überschreibt
  182. \item Code ist leichter verständlich
  183. \end{itemize}
  184. \end{frame}
  185. \begin{frame}{@author-Annotation}
  186. \begin{itemize}
  187. \item Für die Klausur bitte \myCode{@author} verwenden
  188. \item und euren korrekten Namen angeben
  189. \item In Eclipse: \menu{Window > Preferences > Java > Code Style > Code Templates > Comments > Types}
  190. und dort \myCode{\$\{user\}} durch euren Namen ersetzen
  191. \end{itemize}
  192. \end{frame}
  193. \subsection{Aufbau einer Klasse}
  194. \begin{frame}{Aufbau einer Klasse}
  195. Folgender Aufbau ist Konvention und sollte eingehalten werden:
  196. \begin{enumerate}
  197. \item Class/interface documentation comment (/**...*/)
  198. \item class or interface statement
  199. \item Class/interface implementation comment (/*...*/), if necessary
  200. \item Class (static) variables
  201. \item \textbf{Instance variables}
  202. \item \textbf{Constructors}
  203. \item \textbf{Methods}
  204. \end{enumerate}
  205. Quelle: \href{http://www.oracle.com/technetwork/java/codeconventions-150003.pdf}{Oracle Coding Convetions}, 3.1.3
  206. \end{frame}
  207. \section{Java API: List}
  208. \subsection{Allgemeines}
  209. \begin{frame}{Allgemeines}
  210. Es gibt in \myCode{java.utils.*}
  211. \begin{itemize}[<+->]
  212. \item \href{http://docs.oracle.com/javase/7/docs/api/java/util/List.html}{Interface List<E>}
  213. \begin{itemize}
  214. \item \myCode{add(E e)}, \myCode{contains(Object o)}, \myCode{get(int index)}, \myCode{remove(Object o)}
  215. \end{itemize}
  216. \item \href{http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html}{Class ArrayList<E>}
  217. \begin{itemize}
  218. \item Stärken: get, add $\in \mathcal{O}(1)$ - add nur amortisiert!
  219. \item Schwächen: remove $\in \mathcal{O}(n)$
  220. \end{itemize}
  221. \item \href{http://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html}{Class LinkedList<E>}
  222. \begin{itemize}
  223. \item Stärken: add $\in \mathcal{O}(1)$
  224. \item Schwächen: get, remove $\in \mathcal{O}(n)$, Speicherplatz
  225. \end{itemize}
  226. \item[$\Rightarrow$] LinkedList nur dann, wenn ihr add sehr häufig nutzt
  227. \end{itemize}
  228. Siehe: \href{http://stackoverflow.com/q/322715/562769}{When to use LinkedList<> over ArrayList<>?}
  229. \end{frame}
  230. \begin{frame}{List: Beispiel}
  231. \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{ListExample.java}
  232. \end{frame}
  233. \begin{frame}{Ausgabe}
  234. \begin{itemize}
  235. \item myList: [41, 35, 9, 51, 35]
  236. \item anotherList: [2, 51, 64, 58, 57]
  237. \item combined: [2, 9, 35, 35, 41, 51, 51, 57, 58, 64]
  238. \end{itemize}
  239. \end{frame}
  240. \begin{frame}{ArrayList vs. Vector}
  241. \begin{itemize}
  242. \item \href{http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html}{ArrayList} und \href{http://docs.oracle.com/javase/7/docs/api/java/util/Vector.html}{Vector} sind praktisch identisch
  243. \item Einziger Unterschied: Vector ist synchronized
  244. \item[$\Rightarrow$] In Single-Thread-Anwendungen immer ArrayList verwenden
  245. \item[$\Rightarrow$] Für die Abschlussaufgabe auf keinen Fall Vektor verwenden
  246. \item Vector war bei mir mehr als $2 \times$ so langsam wie ArrayList ($\rightarrow$ \href{http://martin-thoma.com/matrix-multiplication-python-java-cpp/\#Java}{Performance of Matrix multiplication in Python, Java and C++})
  247. \end{itemize}
  248. \end{frame}
  249. \section{Dictionary}
  250. \subsection{Allgemeines}
  251. \begin{frame}{Allgemeines}
  252. \begin{itemize}[<+->]
  253. \item \href{http://docs.oracle.com/javase/7/docs/api/java/util/Dictionary.html}{Dictionary}
  254. is obsolete. New implementations should implement the
  255. \href{http://docs.oracle.com/javase/7/docs/api/java/util/Map.html}{Map}
  256. interface, rather than extending Dictionary.
  257. \item Telefonbuch-Anwendungsfälle
  258. \begin{itemize}
  259. \item Schlüssel wird auf Wert abgebildet
  260. \item Beides sind Objekte
  261. \item Schlüssel ist eindeutig, Wert darfs mehrfach geben (sowohl identisch als auch gleich sind ok)
  262. \end{itemize}
  263. \item Interface Map links vom \myCode{=}
  264. \item \href{http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html}{HashMap}:
  265. \begin{itemize}
  266. \item makes no guarantees as to the order of the map
  267. \item $\mathcal{O}(1)$ für \myCode{get} und \myCode{put}
  268. \end{itemize}
  269. \item \href{http://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html}{TreeMap}:
  270. \begin{itemize}
  271. \item sorted according to the natural ordering of its keys
  272. \item $\mathcal{O}(\log n)$ für \myCode{containsKey}, \myCode{get}, \myCode{put} und \myCode{remove}
  273. \end{itemize}
  274. \item \href{http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html}{LinkedHashMap}:
  275. \begin{itemize}
  276. \item predictable iteration order (usually insertion-order)
  277. \item $\mathcal{O}(1)$ für \myCode{add} und \myCode{remove}
  278. \end{itemize}
  279. \end{itemize}
  280. \end{frame}
  281. \subsection{Beispiele}
  282. \begin{frame}{Beispiel 1}
  283. \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small]{java}{MapSimple.java}
  284. http://stackoverflow.com/questions/2889777/difference-between-hashmap-linkedhashmap-and-sortedmap-in-java
  285. \end{frame}
  286. \begin{frame}{Beispiel 2.1}
  287. \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, frame=lines,label=Person.java]{java}{Person.java}
  288. \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, frame=lines,label=TelephoneNumber.java]{java}{TelephoneNumber.java}
  289. \end{frame}
  290. \begin{frame}{Beispiel 2.2}
  291. \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{MapSimple2.java}
  292. \end{frame}
  293. \begin{frame}{Beispiel 2.3: Durch Map iterieren}
  294. \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\small, firstline=15, lastline=20]{java}{singleLines.java}
  295. \end{frame}
  296. \section{Swing}
  297. \subsection{Basics}
  298. \begin{frame}{Basics: Ein Fenster}
  299. \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Swing1.java}
  300. \end{frame}
  301. \framedgraphic{Basics: Ein Fenster}{java-swing-jpanel.png}
  302. \subsection{ActionListener}
  303. \begin{frame}{ActionListener}
  304. ActionLister sind \dots
  305. \begin{itemize}[<+->]
  306. \item ein weit verbreitetes Konzept
  307. \item Objekte, die auf bestimmte Aktionen warten und
  308. \begin{itemize}
  309. \item dann was machen
  310. \item die Aktion "`delegieren"'
  311. \end{itemize}
  312. \item das \href{http://docs.oracle.com/javase/7/docs/api/java/awt/event/ActionListener.html}{Interface ActionListener}
  313. \end{itemize}
  314. \end{frame}
  315. \begin{frame}{ActionListener}
  316. \inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Swing2.java}
  317. {\tiny \href{http://martin-thoma.com/how-to-use-swing/}{complete source}}
  318. \end{frame}
  319. \section{Abspann}
  320. \subsection{Kommende Tutorien}
  321. \begin{frame}{Kommende Tutorien: Themen?}
  322. \begin{itemize}
  323. \item \href{http://zetcode.com/tutorials/javagamestutorial/}{Snake}
  324. \item Space Invaders
  325. \item Breakout
  326. \item Tetris
  327. \item Minesweeper
  328. \item Sokoban
  329. \item Swing (Fenster in Java)
  330. \item Port-Scanner
  331. \item Multiprocessing (Matrix-Multiplikation auf mehreren Kernen)
  332. \item Web-Crawler
  333. \item PageRank auf reale Daten anwenden
  334. \item Chat
  335. \item[$\Rightarrow$] Bitte auf \href{http://www.doodle.com/drn5f9i94zedws5n}{Doodle} wählen!
  336. \end{itemize}
  337. \end{frame}
  338. \begin{frame}{Disclaimer}
  339. Bei wem steht noch \dots
  340. \begin{itemize}
  341. \item Einverständniserklärung nicht im Praktomaten registriert
  342. \item Prüfungsanmeldung nicht im Praktomaten registriert
  343. \end{itemize}
  344. \end{frame}
  345. \begin{frame}{Mathe-Studenten}
  346. \begin{itemize}
  347. \item Was der Prof. über den Verteilger geschrieben hat war Unfug.
  348. \item Zulassungsbescheinigung über Studienbüro (blauer Schein)
  349. \item Vermutlich kein Übungsschein
  350. \item Nur für die Klausur
  351. \end{itemize}
  352. \end{frame}
  353. \begin{frame}{Kommende Tutorien}
  354. \begin{itemize}
  355. \item[2.] 21.01.2013
  356. \item[1.] 28.01.2013: Abschlussprüfunsvorbereitung
  357. \item[-] 28.01.2013: Ausgabetermin für Teil 1
  358. \item[0.] 04.02.2013: Abschlussprüfunsvorbereitung
  359. \item[-] 10.02.2013: Ende der Vorlesungszeit des WS 2012/2013 (\href{http://www.kit.edu/studieren/2873.php}{Quelle})
  360. \end{itemize}
  361. \end{frame}
  362. \framedgraphic{Vielen Dank für eure Aufmerksamkeit!}{../images/geekandpoke-2009-10-naming-conventions.jpg}
  363. \end{document}