Objektumorientált szoftvertervezés - Vizsga, 2008.05.27.

A VIK Wikiből

OO Vizsga 2008-05-27

Van az ObjectOutput interfész és abban egy writeObject metódus, illetve van egy saját osztályunk (XClass), amiben szintén lehet writeObject metódus. Mi az ObjectOutput és az XClass közötti viszony? (2p)

  • XClass függ az ObjectOutput interface-től.
  • Perzisztencia 20 és 26 dia: Az új diasorban ez az ábra megváltozott, és nincs nyíl köztük, de az ObjectOutput megvalósítása az ObjectOutputStream, amitől viszont függ a MyClass. -- Ciana - 2010.06.11.


  • Szerintem inkább specializációról van szó. (ootervezes_metrics 11-es dia)
  • Nem, ez a perzisztenciarol szolo diasor 27. oldalan van, es valoban a dependency a helyes valasz, a nyil vegzodesbol lathato. Pzs


Van egy Car osztály, aminek perzisztens példányait az Objectstore adatbázis db példányában tárolunk mycars root alatt. Volt a Car-nak vmi privát int változója és az azt visszaadó metódus ( getXXX() ). Egészítse ki a következő 3 sort úgy hogy a result-ban azok a car példányok legyenek melyek int változója kisebb mint 20000.(6p)

Query q = ...

Collection cars = ...

Set result = ...

Query q = new Query(Car.class, "getXXX()<20000");
Collection cars = (Collection) db.getRoot("mycars");
Set result = q.select(cars);

Volt 3 darab ábra, amin Thread Session és Database példányok kapcsolatai voltak feltüntve különbözőképpen. Ezeket kellett jellemezni (3p) (Volt köztük egy olyan is ahol egy Thread két Sessionhöz kapcsolódott, ami ha jól tévedek helytelen!)

Jegyzetből:

Mi a discriminator tag, mi a szerepe? (2p)

  • Akkor használjuk ha hibernate-tel több osztály példányait tároljuk egy táblában. A discriminator tag a leíró xml-ben van, azt mondja meg mi legyen a neve annak az oszlopnak, ami az adott sor típusát jelzi.
  • (Alapból az osztály FQN-je jelöli a típust (com.example.Valami), de a discriminator-value tag-gel ez felülírható.)

A discriminator tag a hibernate table-per-class-hierarchy esetében adja meg, hogy az adott táblázat sorában milyen osztály szerepel

Mivel térhet még vissza listán kívül a Hibernate Query? (2p)

  • objektum
  • iterátor

Mikor procedurális a metódus kohézió? Miről lehet könnyen felismerni? (2p) -az első kérdés valószínűleg nem így volt fogalmazva ezt ne vegyétek készpénznek!-

  • instanceof (???) (ootervezes_metrics 13-as dia)
  • Olyan tevékenységek végrehajtása, melyek a szoftvertermék használatához kapcsolódó eljárásokkal vannak összhangban
  • egyáltalán nem újra felhasználható
  • pl: read_part_number_and_update_repair_record_on_master_file
  • Procedural cohesion is when parts of a module are grouped because they always follow a certain sequence of execution (e.g. a function which checks file permissions and then opens the file).

Én erről azt találtam, hogy akkor procedurális a metódus kohézió, ha adott műveletet végez el különböző adatokon(pl. printf)

Az Aktív objektum mintában mi a Future osztály szerepe? (2p)

  • Tárolja az eljáráshívás eredményét
  • Randevú lehetőséget biztosít a kliens számára
  • (ootervezes_metrics 45-47-es dia)
  • This object acts as a placeholder for the result of the not-yet-performed method invocation. forrás
  • C++-os megvalósítás

Van A B C osztály, melyek megvalósítják a HC interfészt, és van V1 V2 osztály, melyek Visitor-ai a HC interfésznek (vagy az A B C osztályoknak nemtom hogy volt fogalmazva de értitek remélem). Rajzolja fel a Hagyományos Visitor mintának megfelelő osztálydiagramot ezek alapján és tüntesse fel a jellegzetes metódusokat is! (6p)

  • ooterv_metrics 63-as dia

Mit ír ki? Ha nem tévedek tökéletesen megegyezik a Java gyak mitírkijével. Volt egy A osztály privát f1 és f5 metódussal mely meghívja f1-t illetve volt B osztály mely származott A-ból szintén rendelkezett privát f1-el. A main-ben A a1 = new A(); a1.f5(); A a2 = new B(); a2.f5(); (2p) -Ha jól mondom akkor mindkettő A f1-t fog eredményezni-

!!! Nem lattam a feladatot, de ha jol ertem ez heterogen kollekcio pelda es kb igy nezhetett ki:

  • A.java
class A {
	public void f1 () { System.out.println("A::f1"); }
	public void f5 () { f1(); }
}
  • B.java
class B extends A {
	public void f1 () { System.out.println("B::f1"); }
}
  • Test.java:
class Test {
	public static void main (String[] params) {
		A a = new A(); a.f5();
		A b = new B(); b.f5();
	}
}
  • Kimenet:

> javac *.java && java Test

A::f1
B::f1

(ez a heterogen kollekcio lenyege szerintem)

Miért jelöli a Java nyelv a Thread stop resume és suspend metódusait deprecated-nek? (2p)

A stop()-ot azért mert a leállított Thread foglalt monitorjai mind felszabadulnak, azonban lehet hogy valamely eddig monitorral védett objektum inkonzisztens állapotban marad, és így elérhető a többi thread számára. Ez kiszámíthatatlan hibákhoz vezethet, ezért ellenjavalt.

A suspend() - (és a csak vele párban használható resume() ) pedig azért deprecated, mert holtponthoz vezethet. Suspend()-kor ugyanis nem szabadulnak fel a monitorok. Ha a resume()-ot hívó thread-nek a resume() előtt szüksége van valamely, az alvó által foglalt monitorra, akkor az a deadlock tipikus esete.

JavaDoc

Mi a különbség a Java nyelv notify és notifyAll metódusai között? (2p)

  • notify(): felébreszt egyet az objektumon váró szálak közül, a felébresztett szál csak akkor folytathatja futását, ha a hívó szál kilépett a monitorból
  • notifyAll(): felébreszti az objektumra váró összes szálat, kölcsönös kizárás érvényesül

mindkét esetben a szálnak az objektum monitorában kell lenni

Mi a különbség a Naming és a Trading Service között? (2p)

  • Naming Service - "telefonkönyv", nevekhez tárolja a szolgáltatót, hierarchikus névtér elengedhetetlen (pl. DNS)
  • Trading Service - "arany oldalak", szolgáltatások jegyzéke, megadhat plusz paramétereket is

Távoli eljáráshívás esetén milyen problémákat jelenthetnek az összetett típusok? (4p)

  • deep copy szükséges minden esetben
  • saját foglaló és felszabadító függvények
  • inout paraméterek kezelése

A Java SecurityManager checkXXX metódusai milyen módon jelzik, ha a hozzáférést megtagadják? (1p)

  • elutasítás esetén SecurityExceptiont dobnak

Implementáljon Java nyelven bináris szemafórt! (6p)

public class Semaphore {

  private int s;

  public Semaphore (int v) {
	 s=v;
  }

  synchronized public void P() throws InterruptedException {
	 while (s <= 0) {wait();}
	 s--;
  }

  synchronized public void V() { 
	 s++;
	 notify();
  }
}

Ismertesse az elosztot garbage-collection-t! (4p)

A távoli objektumokra a kliens oldali stub-oknak is van referenciájuk. Ha az objektum távoli referenciái megszűntek, az objektumot az RMI weak reference-ként tartja számon.

Értesítés a referenciák megszűntéről:

  • java.rmi.server.Unreferenced interfész
  • public void unreferenced() metódusa
// Client
Account a1 = bank.openAccount("acc01");
...
a1.close(); a1 = null;

public void close() throws RemoteException {
  bank.closeAccount(number);
}

public void closeAccount(String anumber) {
	 AccountImpl a = table.get(anumber);
	 try { unexportObject(a, false); } 
	 catch (Exception e) {}
	 table.remove(anumber);
 }
}

Mondjon jellemzőket (jellemzőként 1-2 mondatban) a mobil ügynökre! (4p) -Erre volt egy nyúlfarknyi hely, nem igazán tudom mire gondolt Balázs erre a jellemzőkegykétmondatbankishelyen kérdéssel 4 pontért... és külön lapot nem lehetett beadni!

  • A kliens által küldött objektum futtatható kódja nincs meg a szerveren
  • Adat és kód együtt kerül a szerverhez

(Mitől ügynök az ügynök?)

  • aktív és autonóm
    • saját szálon fut
    • a döntéseit maga hozza
    • a környezet figyelembevételével
  • kapcsolatképes (reaktív)
    • más ügynökökkel kommunikálhat
  • tanulékony
    • a tapasztalatait összegzi
  • mobil
    • képes az ügynökségek közötti közlekedésre

-- Balázs - 2008.06.01.

-- aldaris - 2009.05.27.