Citat:
mislim da bi valjalo spomenuti coveku da sada kada zna sta je instanceof i kako radi, da sada polako zaboravi na ovo zlo i vise ga ne koristi. :)
instanceof nije u duhu objektno orjentisanog programiranja. nikada ne treba pisati kod koji proverava tip i u zavisnosti od tipa nesto izvrsava... to je bespotrebno i ruzno kodiranje, a taj mehanizam se po potrebi dobija polimorfizmom.
Dozvoli mi da se, blago rečeno, krajnje ne složim sa ovom konstatacijom.
Kada je potrebno koristiti
polimorfizam, tj. kada na objektima različitih klasa treba izvršiti operaciju
istog tipa (recimo Kvadrat.iscrtaj(), Krug.iscrtaj() i sl), onda tvoj savet stoji. Bez
instanceof a implementacijom istog interfejsa u odgovarajućim klasama se vrlo elegantno postiže željeni efekat.
Međutim, kada na objektima različitih klasa treba izvršiti
različite operacije, onda se bez instanceof ili sličnog operatora prosto
ne može.
Sličan je slučaj ako klase potiču recimo od različitih proizvođača. Da bi izbegao
instanceof, obe familije klasa moraju da implementiraju isti, željeni interfejs. Kako naterati različite proizvođače da implementiraju jedan te isti interfejs? Nikako. Naravno, uvek možeš da napraviš adapter koji obmotava dve nesrodne hijerarhije klasa, ali ako tih klasa ima suviše, da li se isplati?
Rekao bih da se ne isplati: šta je npr. sa klasama koje prosto ne implementiraju neke metode? Kod njih odgovarajući metod pokazuje u prazno, što je rasipanje resursa.
Citat:
voleo bih da cujem kada ste vi poslednji put upotrebili instanceof?
Instanceof koristim svaki dan. Danas sam napisao bar 10-tak klasa u kojima se pojavljuje ta ključna reč i ne, nije u pitanju loš dizajn.
Da pojasnim: pravimo multiagentsku platformu zasnovanu na komponentama. Svaki program koji se u platformi izvršava (zovemo ih agenti, bez posebnog razloga) sastoji se iz komponenata koje komuniciraju sa
tablom (blackboard). Svaki agent ima sopstvenu tablu. Komponente mogu da postavljaju objekte na tablu i mogu da skidaju željene objekte sa nje. Na tablu se može postaviti objekat bilo kog tipa, a kako komponenata često ima puno i kako obično rade na različitim stvarima, na njoj u datom trenutku mogu da koegzistiraju objekti bez preterano mnogo veze jednih s drugima.
Svaka komponenta može da posebnom objektu (koji se zove
Subscriber) dostavi predikat (klasu koja implementira interfejs
IPredicate) koji pokazuje kada komponenti treba proslediti neki objekat sa table. Vrlo često komponenta filtrira samo objekte nekog određenog tipa i zato se u predikatu često pojavljuje kod poput:
Code:
public void execute(Object o) {
return o instanceof NekaKlasa;
}
Neki predikati imaju i dodatne provere, ali po pravilu ovo je prva. Ne vidim u ovom pristupu ništa loše a voleo bih i da vidim kako bi se ovo izvelo bez nekog oblika RTTI-ja, čistom upotrebom polimorfizma.
Ko što reče Nemanja (a valjda i neko pre njega, ne sećam se :), nikad ne reci nikad.
f