Objektorienterad mjukvaruutveckling Provmoment: Ladokkod: Tentamen ges för: Tentamen (teori) 21OO1B Systemarkitektprogrammet 7,5 högskolepoäng Tentamenskod: Tentamensdatum: 2016-10-20 Tid: 09:00 11:00 Hjälpmedel: Inga. Totalt antal poäng på tentamen: För att få respektive betyg krävs: G >= 10 VG >= 15 20 poäng Allmänna anvisningar: Fyll i din tentamenskod och dina svar (genom att sätta kryss i svarsmatrisen) på nästa sida. Skriv tydligt (oläslig markering = fel)! Frågorna (1-80) ger 0,25 poäng för korrekt svar och -0,25 poäng för inkorrekt svar. Icke besvarade frågor ger 0 poäng. Om du anser att en fråga är svår att förstå eller felaktigt ställd och inte kan få den klarlagd under tentamen, skriv ner din tolkning av frågan tillsammans med svaret (eller svara inte på den). Nästkommande tentamenstillfälle: 2017-01-10. Rättningstiden är i normalfall 15 arbetsdagar, till detta tillkommer upp till 5 arbetsdagar för administration. Viktigt! Glöm inte att skriva Tentamenskod på alla blad du lämnar in. Lycka till! Ansvarig lärare: Anders Gidenstam Patrick Gabrielsson Telefonnummer: 033 435 4214 033 435 4132
1
Svarsmatris Tentamenskod: (Ifylles av student) Svarsmatris Påståendet är: Sant Falskt Sant Falskt Sant Falskt Sant Falskt 1 21 41 61 2 22 42 62 3 23 43 63 4 24 44 64 5 25 45 65 6 26 46 66 7 27 47 67 8 28 48 68 9 29 49 69 10 30 50 70 11 31 51 71 12 32 52 72 13 33 53 73 14 34 54 74 15 35 55 75 16 36 56 76 17 37 57 77 18 38 58 78 19 39 59 79 20 40 60 80 2
3
Programmeringsteori Ange för följande påståenden om de är sanna eller falska. 1. I Java finns en automatiskt genererad argumentlös konstruktor (default constructor) i alla klasser. 2. I Java kan en privat metod inte överskuggas (override) vid arv. 3. I följande programkod kopieras vektorn a till b by value: int[] a = ; int[] b = ; b = a; 4. I Java är En accessormetod skall aldrig ändra ett objekts tillstånd en vedertagen tumregel. 5. Följande klass går att kompilera och köra: class Foo { int b = 0; public static int getb() { return b; 6. En Javakompilator översätter Java källkod till Java binärkod (byte code). 7. Om en subklass definierar en publik metod med samma signatur och returtyp som en publik metod ärvd från en superklass blir metoderna relaterade så att vid dynamisk bindning (dynamic dispatch, anrop på en referens av en superklass typ) kommer den egna metoden anropas. 8. Ett interface i Java får enbart innehålla signaturer (med returtyp) för publika metoder. 9. I Java kan en klass direkt ärva från flera superklasser. 10. I Java får en abstrakt (abstract) klass innehålla konkreta metoder. 11. I Java kan ett interface utöka (extend) ett eller flera andra interface. 12. Vid överlagring (overloading) av metoder i Java så kan dessa skilja sig åt enbart till sin returtyp. 13. Följande kod kommer att kompilera utan några problem: public void m(int value) { if(i < 0) throw new Exception( value must be positive ); 4
14. Utskriften från följande kod är: Divide by zero try { double d = 1.0 / 0; catch(exception e) { System.out.println( Divide by zero ); 15. Utskriften från följande kod är: A try { System.out.print( A ); return; catch(exception e) { System.out.print( B ); finally { System.out.print( C ); System.out.print( D ); 16. Följande kod kommer att kompilera utan några problem try { InputStream in = new FileInputStream( file.xyz ); catch(exception e) { System.out.println( Exception ); catch(ioexception ioe) { System.out.println( IOException ); 17. RuntimeException och dess subklasser är exempel på unchecked undantag. 18. I/O klasser som slutar på Reader kan hantera inläsning av byte-strömmar. 19. I nedanstående kod kommer I/O strömmen att stängas automatiskt: try(outputstream out = new FileOutputStream( file.xyz )) { out.write(0); catch(ioexception ioe) { System.out.println( IOException ); 5
20. Instanser av inre klasser skapas ofta i den yttre klassen (som omsluter den inre klassen). Dock kan man även skapa instanser av inre klasser från en annan klass. I så fall, om en inre klass är icke-statisk, måste man först skapa en instans av den yttre klassen (yttreobjekt), och därefter använda nedanstående kod för att skapa en instans av den inre klassen (inreobjekt) från en annan klass: YttreKlass.InreKlass inreobjekt = yttreobjekt.new InreKlass(); 21. Om den inre klassen i ovanstående uppgift istället är statisk, måste man använda nedanståden kod för att skapa en instans av den inre klassen från en annan klass: YttreKlass.InreKlass inreobjekt = new YttreKlass.InreKlass(); 22. Anonyma inre klasser används ofta i samband med händelsehanterare. I JavaFX (GUI biblioteket som ersatte Swing) fås ett händelseobjekt av typ ActionEvent när man klickar på en knapp, där händelsehanteraren måste implementera det typade interfacet EventHandler<ActionEvent> som innehåller den enda metoden void handle(actionevent e). Nedanstående kod är ett korrekt exempel på hur man kan skapa en anonym inre klass som kan registreras som en händelsehanterare för en knapptryckning: EventHandler<ActionEvent> handler = new EventHandler<ActionEvent>() { @Override public void handle(actionevent e) { System.out.println("Button clicked"); ; 23. Som ett alternativ till anonyma inre klasser som händelsehanterare, kan lambdauttryck användas. Följande kod är ett korrekt exempel på hur man kan använda ett lambdauttryck för att skapa en instans av en händelsehanterare för en knapptryckning: EventHandler<ActionEvent> handler = (e) -> { System.out.println("Button clicked"); ; 24. Varje händelseobjekt innehåller metoden getsource() som returnerar objektet som skapade händelseobjektet. 25. En ActionEvent skapas när man klickar på en MenuItem. 26. Notifyable är basklassen för alla händelser. 6
27. Följande kod kommer att exekvera ett jobb på en ny tråd: Thread t = new Thread( new Runnable() { public void run() { System.out.println( Executing job ); ); t.run(); 28. Följande kod är ett korrekt exempel på hur man kan skapa ett trådsäkert kodblock: Object o = new Object(); serializable(o) { // Trådsäkert kodblock 29. Följande kod skapar en trådpool med tre trådar samt exekverar ett jobb i trådpoolen: ExecutorService executor = Executors.newFixedThreadPool(3); Executor.execute(new Runnable() { public void run() { ); 30. En tråd som har exekverat klart kan återstartas genom att anropa dess resume() metod. 31. Om cond.await() anropas på ett Condition-objekt cond i ett trådsäkert kodblock, kommer nuvarande tråd att släppa låset lock och vänta tills en annan tråd anropar cond.signal(), innan exekveringen fortsätter. 32. En Iterator är fail-fast, vilket innebär att om iteratorn används för att traversera en samling, medans den underliggande samlingen håller på att modifieras av en annan tråd, så kommer iteratorn att kasta undantaget ConcurrentModificationException. 33. Metoden isdone() kan användas för att ta reda på om en ForkJoinTask har exekverat klart. 34. Sockets kan användas för att kommunicera mellan två Javaprogram. För att lyssna efter klientuppkopplingar på serversidan, anropar man metoden accept() på en Socket instans. 35. För att kunna skicka en instans av en egendefinierad klass via en socket, måste klassen implementera synchronized interfacet. 36. Om man skickar en instans av en egendefinierad klass via en socket, och klassen har ett attribut som är markerad som volatile, så kommer attributets värde inte att beaktas då instansen skickas över socket instansen. 7
37. När instanser av DatagramPacket skickas via en DatagramSocket-instans, så kommer det underliggande transportprotokollet att garantera att DatagramPacketinstanserna når mottagaren, och dessutom att paketen når mottagaren i samma ordning som de skickades. 38. För att kommunicera med en databashanterare, måste man först ladda in relevant JDBC-drivrutin samt erhålla ett Connection objekt genom att anropa en statisk metod på DriverManager klassen. 39. En instans av CallableStatement kan användas för att skicka ad hoc (godtycklig) SQL-kod till en databashanterare. 40. Om man exekverar en SELECT-sats via JDBC, så får man tillbaka en Iterator instans som man kan använda för att loopa igenom alla rader som returnerades. 8
Analys- och designteori Ange för följande påståenden om de är sanna eller falska. 41. Följande javakod är exempel på Facade mönstret: InputStreamReader in = new InputStreamReader(new FileInputStream(new File("file.xyz"))); 42. I Java är clone() metoden (som returnerar en kopia av ett objekt) ett exempel på en implementering av Proxy mönstret. 43. Memento mönstret används för att gömma ett komplext subsystem bakom ett simpelt interface. 44. Mediator mönstret används för att lagra samt återställa det inre tillståndet av ett objekt utan att påverka objektets inkapsling. 45. Eager Initialization används när man vill undvika att skapa ett Singleton objekt tills objektet först behövs. 46. Det går inte att skapa trådsäkra Singleton objekt. 47. Decorator mönstret används för att utöka eller ändra på ett objekts funktionalitet under körtid. 48. State mönstret används för att skapa en mängd relaterade algoritmer. 49. Händelsehanteringssystemet i Java är ett exempel på ett Observer mönster. 50. Chain of Responsibility mönstret definierar en länkad lista med hanterare som kan hantera olika begäran från en klient. 51. Det finns 23 Gang of Four (GoF) design mönster, indelade i de 3 kategorierna: Creational, Structural och Behavioral. 52. Adapter mönstret tillhör kategorin Creational designmönster. 53. Analys är att utifrån ett problem ta fram en konceptuell lösning. 54. Vattenfallsmodellen ingår som en del i the Unified Process (UP). 55. I dokumentet Supplementary Specification samlas majoriteten av de icke-funktionella kraven på systemet. 9
56. I UP planerar man innehållet i alla iterationerna som projektet kommer löpa över under Inception-fasen. 57. En iteration i UP är 1 till 4 månader. 58. Aktörer i användningsfall (Use Case) är alltid personer som identifieras av sina roller. 59. Syftet med Inception-fasen i UP är att ta fram projektets mål och vision och avgöra om det är värt att gå vidare med projektet. 60. Ett System Operation Contract beskriver hur tillståndet för objekt i designmodellen (Design Model) förändrats efter att operationen har genomförts. 61. Applikationslagret separerar, när det finns, domänlagret från UI/presentationslagret. 62. I arkitekturanalys är variationspunkter ställen där man spekulativt gissar att systemet i framtiden kan komma att behöva stödja förändringar. 63. Ett tekniskt memo (technical memo) beskriver hur en systemoperation har implementerats. 64. En Use Case realisering beskriver hur ett (scenario av ett) Use Case har realiserats i design modellen. 10
PersistentObject oid : OID state : PObjectState PObjectState commit() delete() rollback() save() setstate(pobjectstate)... * 1 commit(obj : PersistentObject) delete(obj : PersistentObject) rollback(obj : PersistentObject) save(obj : PersistentObject)...... Product Specification...... Sale OldDirty State commit(...) delete(...) rollback(...) OldClean State delete(...) save(...) New State commit(...) OldDeleted State commit(...) rollback(...) Figur 1 Del av Persistency Framework Betrakta Figur 1 ovan och ange för följande påståenden om de är sanna eller falska. 65. En applikation behöver bara en instans vardera av klasserna OldDirtyState, OldCleanState, NewState och OldDeletedState. 66. Diagrammet visar ett exempel på State mönstret. 67. Metoden setstate( ) i PersistentObject är en mallmetod som eventuella subklasser måste implementera. 68. Metoden delete() i PersistentObject skulle kunna implementeras som nedan enligt diagrammet: void delete() { state.delete(this); 69. Klasserna ProductSpecification och Sale har ett attribut av typen PersistentObject. 70. Att anropa state.rollback(this) från metoder i PersistentObject fungerar bara om state attributet refererar till en instans av OldDirtyState eller OldDeletedState. 11
Figur 2 Del av NextGen POS Betrakta Figur 2 ovan och ange för följande påståenden om de är sanna eller falska. 71. Diagramformen kallas i UML för Communication Diagram. 72. Anropen till put(id, pd) och create(id, price, description) görs inifrån metoden loadprodspec(). 73. En implementation av Register gjord utifrån diagrammet skulle kunna se ut så här: public class Register { private ProductCatalog productcatalog; public Register() { public create(productcatalog pc) { productcatalog = pc; 74. Diagrammet ingår i realiseringen av Use Case:t Process Sale för NextGen POS. 75. Klassen Map i diagrammet är generisk enbart med avseende på värdetypen. 76. Mönstret Information Expert är det som främst motiverar att Store skapar instansen pc av typen ProductCatalog. 12
Ange för följande påståenden om de är sanna eller falska. 77. I test-driven design (TDD) skriver man samtliga test som behövs för en klass innan man påbörjar implementeringen av klassen. 78. En väl designad uppsättning av systemtest bevisar att systemet är felfritt. 79. I test-driven design används omstrukturering (refactoring) för att fixa test som misslyckas. 80. Top-down, bottom-up och big bang är strategier för integrationstestning (integration testing). 13