Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Nasledjivanje samo izmedju interfejsa

[es] :: Art of Programming :: Nasledjivanje samo izmedju interfejsa

Strane: 1 2 3 4

[ Pregleda: 12390 | Odgovora: 72 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 898
*.dynamic.isp.telekom.rs.



+171 Profil

icon Re: Nasledjivanje samo izmedju interfejsa19.06.2012. u 18:09 - pre 143 meseci
OK, za C++ bi moglo, za C# ne, bar koliko ja znam C# :-)

Ali inace, ja ne bi ni u C++-u pisao takav code, ne vidim zasto da pisem dodatno i tu jednu liniju code-a ako ne moram. Ako si napisao da si nasledio od odredjene klase nesto, i ako ti ta bazna funkcionalnost zadovoljava slucaj, ne zelim da pisem jos dodatno nikakav code.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.3gnet.mts.telekom.rs.



+2789 Profil

icon Re: Nasledjivanje samo izmedju interfejsa19.06.2012. u 18:44 - pre 143 meseci
A šta, C# nema makroe?

Što se te jedne linije tiče, ona nije problem. Problem je ako imaš istu funkcionalnost na više mesta u izvornom kodu.

Ma, znaš šta, ja bi bacio sve te klase i interfejse i programirao u računu SK kombinatora. Svašta!
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 898
*.dynamic.isp.telekom.rs.



+171 Profil

icon Re: Nasledjivanje samo izmedju interfejsa19.06.2012. u 19:04 - pre 143 meseci
Ne u C# nije moguce tako nesto.

Moram da citiram ovaj deo:

Citat:

Problem je ako imaš istu funkcionalnost na više mesta u izvornom kodu.


Da, isto ovo treba da vazi i za definicije, u tvom primeru ti imas ponavljane definicije za INotifyPropertyChanged interfejsa. Mislim, zasto je problem pisati manje za isti rezultat? Pa razlika izmedju klasa i interfejsa je upravo samo u implementaciji, sve sto mozes da uradis sa interfejsom mozes i sa klasom, obrnuto ne vazi. Znaci u jednom slucaju imas vise opcija, u drugom manje, i sad je bolji ovaj drugi slucaj, koji te ogranicava da pises sto manje redundantan code.

 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12846



+4783 Profil

icon Re: Nasledjivanje samo izmedju interfejsa19.06.2012. u 20:22 - pre 143 meseci
Pa i u tvojoj varijanti moras svaki put da navodis da se nasledjuje (i) ta klasa sa implementacijom :) Nesto pisanja svaki put moras imati.

Nego, kako je u c++ reseno ako obe klase koje se nasledjuju funkciju sa istim imenom i potpisom?
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 898
*.dynamic.isp.telekom.rs.



+171 Profil

icon Re: Nasledjivanje samo izmedju interfejsa19.06.2012. u 20:43 - pre 143 meseci
Citat:
Shadowed: Pa i u tvojoj varijanti moras svaki put da navodis da se nasledjuje (i) ta klasa sa implementacijom :) Nesto pisanja svaki put moras imati.


Ali samo to moras i da napises, nemas nista vise, u tome i jeste razlika.

Pazi, mozda sam ja cepidlaka, ali po meni, sto manje code-a pises tim bolje, namesti paralelu sa jezikom, videces da se nepotreben stvari ne govore, implicitno se podrazumevaju i nema potrebe za ponavljanjem osim ako se ne razlikuje od tog implicitnog podrazumevanog :-)

A : "Pogledaj ovaj i3 kako je dobar"
B : "Sta ti je i3?"
A : "To ti je novi Bmw model, ima okrugle tockove"

Ako znas da je Bmw auto, onda je totalno suvisna informacija da su mu tockovi okrugli, jer to vec znas na osnovu toga sto je auto.



 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12846



+4783 Profil

icon Re: Nasledjivanje samo izmedju interfejsa19.06.2012. u 23:20 - pre 143 meseci
Zar je velika razlika izmedju njegovog "IMPLEMENT_NOTIFY_PROPERTY_CHANGED" i tvog ", NotifyPropertyChanged"? :)

Mislim, nemam ja nista protiv visestrukog nasledjivanja i nimalo mi ne bi smetalo da ga uvedu u C# u sledecoj verziji (ukoliko je to moguce bez previse budzenja), al' izmedju ova dva slucaja, gore napisana, nema bas mnogo razlike u kolicini koda (mada meni licno tvoja varijanta deluje elegantnije, ono drugo je samo zaobilazni nacin da se ponavlja kod).
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 898
*.dynamic.isp.telekom.rs.



+171 Profil

icon Re: Nasledjivanje samo izmedju interfejsa19.06.2012. u 23:50 - pre 143 meseci
Shadowed, nije velika razlika, ali ipak pises dodatno za sta ja smatram da je nepotrebno (cisto ako nisi primetio, i u Nedeljkovom primeru mora da se navede interfejs koji se nasledjuje i plus da se jos doda macro unutar definicije).
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.3gnet.mts.telekom.rs.



+2789 Profil

icon Re: Nasledjivanje samo izmedju interfejsa19.06.2012. u 23:52 - pre 143 meseci
Shadowed, je li stvarno C# nema makroe ili nexygo jednostavno ne zna za njih?

nexygo, ne izbegava se ponavljanje koda da bi se smanjilo kucanje (bar ne prevashodno), već da bi izmena jedne funkcionalnosti na jednom mestu bila izmena u celom programu.

Citat:
Shadowed: Nego, kako je u c++ reseno ako obe klase koje se nasledjuju funkciju sa istim imenom i potpisom?


E, vidi se da si pozaboravljao C++.

Ako klase A i B nasleđuju klasu C, a klasa D nasleđuje klase A i B i pritom klasa C ima metodu void foo(), onda će klasa D imati metode void A::foo() i void B::foo(). Ako je pak nasleđivanje klasa A i B iz klase C bilo virtuelno, onda će klasa D imati samo jednu metodu void foo().

E, sad, to vodi do niza problema zbog kojih su uvođeni interfejsi. Implementacija može biti takva da na primer pokazivač na klasu C pokazuje na prvi atribut klase C, a da toj adresi prethodi pokazivač na tabelu virtuelnih metoda (koji postoji i ulazi u veličinu podatka akko je potreban, tj. klasa ima virtuelnih metoda). Za klase A i B važiće isto to, tj. pokazivač na objekat će pokazivati na prvi atribut klase C, a nakon svih njih će slediti atributi izvedene klase. Dakle u klasi A idu prvo atributi klase C, pa atributi klase A i slično za B. E, sad dolazimo do klase D. Tu će ako nasleđivanje nije virtuelno ići atrubuti klase A (uključujući nasleđene atribute klase C), pa klase B (uključujući nasleđene atribute klase C), pa klase D.

Međutim, gde da smestimo pokazivač na tabelu virtuelnih metoda (recimo da ih klasa C ima)? Klasa D mora da bude konvertibilna u svoje bazne klase A i B. Ako je smestimo pre atributa klase A, imaćemo problem sa time što su ofseti atributa klase B pri konverziji D* u B*. Zapravo, svaka od tih klasa ima svoje metode, tj. u klasi D imamo duplikate članova od C (nasleđene kroz A i nasleđene kroz B), pa će zapravo objekat biti sačinjen od pokazivača na tabelu virtuelnih metoda od A, pa atributa od A (zajedno sa nasleđenim atributima iz C), pa pokazivača na tabelu virtuelnih metoda od B, pa atributa od B (zajedno sa nasleđenim atributima od C), pa atributa od D. Može klasa D da ima svoje virtuelne metode, ali oni su smešteni u tabele od A i B, koje nisu na istom mestu u memoriji kao obične tabele od A i B, pa se ne može tek tako poređenjem pokazivača na tabelu virtuelnih metoda utvrditi da li su izvedene iz iste klase, pa je dynamic_cast utoliko sporiji.

U slučaju virtuelnog izvođenja klasa A i B iz C moramo u primerku klase D imati samo jednu kopiju atributa klase C, a da D i dalje bude konvertibilna u A i B. Kako kada obe klase nasleđuju C, a ofset atributa od A i B u odnosu a C ne može da bude isti. Čim je klasama A i B rečeno da su virtuelno nasleđene iz C, one pre svojih atributa imaju pokazivač na tabelu virtuelnih atributa, tj. ofset od C. E, onda D može da se sklopi sa samo jednim primerkom C.

No, kod višestrukog nasleđivanja prilikom konverzije pokazivača dolazi do promene vrednosti pokazivača u smislu apsolutne adrese, tako da računar mora sa sigurnošću da zna kako to da uradi. Ako se za neku konverziju može zaključiti da je moguća i kako je izvesti u fazi prevođenja, onda se koristi brzi static_cast (tipično za konveryiju iz izvedene u osnovnu klasu), a u suprotnom je static_cast sintaksna greška. Ukoliko se u fazi prevođenja može zaključiti kako u fazi izvršavanja da se odredi da li je konverzija moguća i kako i da je u bar nekim slučajevima moguća, onda se može koristiti spori dynamic_cast. No, on može u fazi izvršavanja da ne uspe.

No, tu nismo ni dotakli problem brisanja objekata. Ako imam pokazivač na klasu A koji pokazuje na primerak od D, pa ga brišemo, on mora da bude brisan kao primerak od D, tj. objekat, mada je posmatran kao primerak od A mora imati svest o tome da je zapravo objekat tipa D.

Sve to vodi do komplikovanih pravila, koja se značajno pojednostavljuju ako je nasleđivanje jednostruko, osim u slučaju interfejsa.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 898
*.dynamic.isp.telekom.rs.



+171 Profil

icon Re: Nasledjivanje samo izmedju interfejsa20.06.2012. u 07:17 - pre 143 meseci
Nedeljko evo ti link za C# define: http://msdn.microsoft.com/en-us/library/yt3yck0x(v=vs.71).aspx

Citat:

nexygo, ne izbegava se ponavljanje koda da bi se smanjilo kucanje (bar ne prevashodno), već da bi izmena jedne funkcionalnosti na jednom mestu bila izmena u celom programu.


Da, ali isto tako se i izbacuje bilo kakva suvisna logika, bas da bi kucao manje, i da bi ti bilo lakse da citas code, a ne da glumis sve vreme "human filter", koji prvo poizbacuje suvisne informacije pa onda obradjuje ostatak.

Sto se tice visestrukog nasledjivanja, mislim da si usao u detalje previse, to sto kazes da je komplikovano, to je vise za dizajnere kompajlera, u C++ bar koliko vidim, ambiguity se resava tako sto navedes sta zelis da referenciras, isti problem i sa interfejsima, isti problem i sa jezikom... ovaj mu dodje kao http://www.youtube.com/watch?v=NYJ2w82WifU :-)

 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 898
*.dynamic.isp.telekom.rs.



+171 Profil

icon Re: Nasledjivanje samo izmedju interfejsa20.06.2012. u 07:29 - pre 143 meseci
Samo da dopunim sebe:

Citat:

Sto se tice visestrukog nasledjivanja, mislim da si usao u detalje previse, to sto kazes da je komplikovano, to je vise za dizajnere kompajlera


Taj deo oko skladistenja virtualnih tabela, na to sam mislio da je za dizajnere kompajlera, cak sta vise, to jednom kad se namesti, posle radi u proizvoljnoj dubokoj hierarhiji, tako da ta komplikovanost dalje se moze samo pripisati onom ko pise neki program, tj. resava probleme sa multi inheritance u amibiguity maniru :-)

Inace, ne znam zasto, ali ovaj (Diamon) problem se uvek navodi kao neka mana multi inheritance-a, no, kako se to onda resava sa single inheritance, ono, kad je bas zapelo da mora da budu ista imena? (nesto mi govori da je tu tek code komplikovan :))

 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12846



+4783 Profil

icon Re: Nasledjivanje samo izmedju interfejsa20.06.2012. u 08:39 - pre 143 meseci
Nedeljko, hvala na detaljnom opisu :)
Nema C# makroe.
 
Odgovor na temu

lelorinel
gibanica.com

Član broj: 255698
Poruke: 70



+59 Profil

icon Re: Nasledjivanje samo izmedju interfejsa20.06.2012. u 16:29 - pre 143 meseci
Citat:
negyxo:
Sad, kad bi rekao i sta gresim... bas nisi mogao manje reci da napises :-)
 



sve moze da se postigne klasama, i interfejsi nisu neophodni, ali ne koriscenjem istih krsis vise principa programiranja izmedju ostalih i dependency inversion od SOLID principa.
samim ne koriscnjem interfejsa tvoj kod postaje mnogo tezi za testiranje, mnogo tezi za odrazvanje i nije sklon promenama, teze evoluira tj. vrlo tesko ces promeniti ili dodati novu funkcionalnost ukoliko se ukaze potreba.
na primeru unit testinga, kako ces da se oslobodis dependencija koje tvoj SUT ima ako su isti klase a ne interfejsi?
koriscenje mocking frameworka sigurno nije opcija, vec bi morao da radis sve rucno, pravljenjem virtuelnih metoda dependency klase i nasledjivanjem iste od strane tvoje test klase itd itd.
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 898
*.dynamic.isp.telekom.rs.



+171 Profil

icon Re: Nasledjivanje samo izmedju interfejsa20.06.2012. u 16:57 - pre 143 meseci
Izvini sto nemam nameru da sad obrazlazem kako i zasto, ali da ti mozda prvo das primer sta moze da se uradi sa interfejsima a da sa klasama ne moze, nekako, nije mi bas najjasniji taj deo: " kako ces da se oslobodis dependencija koje tvoj SUT ima ako su isti klase a ne interfejsi".
Sta te sprecava da nasledjujes baznu klasu, tj. sta te sprecava da koristis klasu kao interfejs? Jel mozda smeta empty body metode, ili cak ne moras ni da ga deklarises, stavis abstract i vozi...
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Nasledjivanje samo izmedju interfejsa20.06.2012. u 17:13 - pre 143 meseci
@lelorinel, ne loze se svi na unit testing, a kamoli na TDD, niti se loze na DI kao mirodjiju za svaku corbu. Sama ideja da nasledjivanje treba izbaciti zato sto MVC ekipa ne zna sta bi radila sa njim je malo egocentricno i kontraproduktivno jer niko od "oop ekipe" ne sprecava "mvc ekipu" da koristi interfejse. To each its own, iliti sto bi rekli englezi, postoji vise nacina da se odere macka
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.3gnet.mts.telekom.rs.



+2789 Profil

icon Re: Nasledjivanje samo izmedju interfejsa20.06.2012. u 18:03 - pre 143 meseci
Citat:
negyxo: da ti mozda prvo das primer sta moze da se uradi sa interfejsima a da sa klasama ne moze

A da ti daš primer šta može da se uradi sa private, a ne može sa public. Možda previše slobode može da smeta.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 898
*.dynamic.isp.telekom.rs.



+171 Profil

icon Re: Nasledjivanje samo izmedju interfejsa20.06.2012. u 19:52 - pre 143 meseci
Nedeljko, iskreno ne kontam tvoje pitanje.
 
Odgovor na temu

Boris_ZR
Boris Gligorijević
IT-Consultant / Software Engineer
PRODYNA AG
Munich

Član broj: 173158
Poruke: 123
*.dynamic.sbb.rs.



+21 Profil

icon Re: Nasledjivanje samo izmedju interfejsa20.06.2012. u 20:10 - pre 143 meseci
negyxo, ne znam što si zapeo toliko protiv interfejsa, ali poštujem tvoju borbenost. :)
Pošto sam ja samo junior programer i možda ću promeniti mišljenje još 100 puta u karijeri, u odbranu interfejsa citiraću one koji su očevi softverskog inženjerstva danas:

http://pragmaticjava.blogspot....erface-not-implementation.html

Ako njihovi saveti ne znače baš ništa, svaka dalja komunikacija na ovu temu je suvišna.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Nasledjivanje samo izmedju interfejsa20.06.2012. u 20:25 - pre 143 meseci
Khm, dobro, da se ne zalecemo mnogo sa tim ocenastvom i slicnim zitijama.


Jedna veoma vazna stvar koju zaboravljas a koju sam vec izneo onomad na pocetku ove teme je da svaka klasa ima svoj implicitni interfejs. Cak mozes komotno da napravis DI mehanizam koji faktorise objekte i vraca isntance baznih klasa. I to moze da ide do te mere da celokupna stvar moze da bude mockable i testable.


Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 898
*.dynamic.isp.telekom.rs.



+171 Profil

icon Re: Nasledjivanje samo izmedju interfejsa20.06.2012. u 20:41 - pre 143 meseci
@Boris_ZR
Pazi, nemam ja nista protiv interfejsa, bukvalno na dnevnoj bazi ih koristim, sto samo implementiram, sto neke i pravim. Ono sto je meni zasmetalo oko interfejsa je to visestruko nasledjivanje, ne zelim da pisem isti code, no taj deo jos i progutam nekako. Drugi deo je vezan za guranje interfejsa svuda, i to iz nekog razloga koji je meni nejasan. Ja sam imao situaciju da se zahteva da se za svaku klasu definise interfejs, samo zato da bi code bio "highly decoupled", iako se interfejs nigde ne koristi! Znam ja da ovo problem do onoga ko sve to zahteva i da interfejsi nisu krivi, ali problem je bas u tome, da kojim slucajem postoje samo klase, valjda bi nekom dunulo u glavu da je apsurdno definisati klasu pa zatim jos jednu isti takvu samo apstraktnu klasu. Ovako kada imas interfejs, to onda nije to, ti uvek mozes da kazes "ali ovo je samo interfejs ovde nemas body metoda, mora tako".
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.3gnet.mts.telekom.rs.



+2789 Profil

icon Re: Nasledjivanje samo izmedju interfejsa20.06.2012. u 21:05 - pre 143 meseci
Citat:
negyxo: Nedeljko, iskreno ne kontam tvoje pitanje.

Pa, zameni u bilo kom ispravnom programu sva pojavljivanja private sa public i radiće i dalje.

Čemu služi private?
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

[es] :: Art of Programming :: Nasledjivanje samo izmedju interfejsa

Strane: 1 2 3 4

[ Pregleda: 12390 | Odgovora: 72 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.