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

Prelaz od C ka OO programiranju

[es] :: Art of Programming :: Prelaz od C ka OO programiranju

Strane: < .. 1 2 3 4 5 6

[ Pregleda: 14956 | Odgovora: 101 ] > 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: Prelaz od C ka OO programiranju01.12.2018. u 12:39 - pre 65 meseci
Citat:
Nedeljko:
C# je fašistički jezik jer zabranjuje višestruko nasleđivanje klasa, već samo interfejsa. Isto važi za sve jezike koji uvode pojam interfejsa, koji je potpuno suvišan kada imaš višestruko nasleđivanje klasa.


Recimo, ja sam se bas zalio ovde pre nekoliko godina na ovo za C#, i moram priznati uzasno me je nerviralo, jer mi je neko nametnuo ogranicenje vestacki zarad mene samog, da ne bi kojim slucajem sam sebe minirao. Elem, posle par godina, shvatiio sam jednu stvar, ne, nije mi toliko kriticno da imam visestruko nasledjivanje (ali bih voleo da imam, i kada ima smisla da mogu da ga koristim), jer za vecinu stvari koje sam zeleo da uradim sa visestrukim nasledjivanjem u stvari pravi odgovor su bili mixini (kojih na zalost nema u C#). No, najveca mana C# nije visestruko nasledjivanje, nego nepostojanje non-null referentnih tipova (koje ce uskoro da bude podrzano).
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Prelaz od C ka OO programiranju01.12.2018. u 13:41 - pre 65 meseci
Citat:
Elem, recimo da imas neku funkciju koja prima interfejs, recimo ovako:

Code:
Code:

interface ISize 
{
   int x;
   int y;
   int width;
   int height;
}
void DrawRectangle(ISize size) { .. }



Da pozoves ovu f-ju iz nominalnog type sistema, imas dve opcije:

- da pronadjes ko implementira ovaj interface
- da sam implementiras interface


Nije to interfejs nego struktura. Interfejs nije struktura nego protokol.
Znaci ako uzimas kao parametar interfejs, koristis protokol da komuniciras sa objektom, pri tom je totalno nebitno
koja je struktura sam objekt.

Recimo:

Code:

pub trait Op{
    fn init()-> Self;
    fn mul(&self,rhs:&Self)->Self;
    fn add_assign(&mut self,rhs:&Self);
}

pub fn Mul<T:Op>(t:&mut [[T;4];4], a:&[[T;4];4], b:&[[T;4];4] ) {
  for i in 0..4 {
    for j in 0..4 {
      let mut sum:T = Op::init();
      for k in 0..4 {
        let c = a[i][k].mul(&b[k][j]);
        sum.add_assign(&c);
      }
      t[i][j]=sum;
    }
  }
}


Znaci uopste ne zalazis u to ko implementira interface samo si definisao protokol i to je to.


 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.ptt.rs.



+2789 Profil

icon Re: Prelaz od C ka OO programiranju01.12.2018. u 14:14 - pre 65 meseci
Definišeš API. To naravno možeš i definisanjem klase bez atributa i implementacija metoda, pri čemu su sve metode virtuelne.
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: Prelaz od C ka OO programiranju01.12.2018. u 14:46 - pre 65 meseci
Citat:
Branimir Maksimovic:
Nije to interfejs nego struktura. Interfejs nije struktura nego protokol.


Ajde da sada ne cepidlacimo, primer je maksimalno prost, nema potreba da sada definisemo sta je struktura sta je interface. U vecini jezika interface-i su prilicno "slobodni" pa tako mozes sve da definises, i property-e, fieldove (kako koji jezik sta vec zove) i funkcije. Znaci, to ne menja poentu onoga sto sam pisao, ti si dao komplikovaniji primer, samo ces teze opisati poentu. I da, poenta nije u tome kako da upotrebis interface kod sebe u implementaciji, nego kako ce onaj koji poziva tvoj code da prosledi tebi implementaciju tog interfejsa kojeg ocekujes. Kao sto vidimo, iz strukturalnog type sistema, ovo se definise on-the-fly, dok kod nominalnog nije moguce.

Samo da dopunim sebe, posto sam mozda bio nejsan. Kako bi ti u svom primeru pozvao funkciju Mul?


[Ovu poruku je menjao negyxo dana 01.12.2018. u 16:10 GMT+1]
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Prelaz od C ka OO programiranju01.12.2018. u 16:52 - pre 65 meseci
Mul pozivas za bilo koji tip koji implementira interfejs Op, u konkretnom primeru. Razlika izmedju interfejsa i klase/strukture je u tome sto interfejs nema podataka.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Prelaz od C ka OO programiranju01.12.2018. u 16:53 - pre 65 meseci
Citat:
Nedeljko:
Definišeš API. To naravno možeš i definisanjem klase bez atributa i implementacija metoda, pri čemu su sve metode virtuelne.


Upravo tako. To je interfejs.
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

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



+171 Profil

icon Re: Prelaz od C ka OO programiranju01.12.2018. u 17:17 - pre 65 meseci
Citat:
Branimir Maksimovic: Mul pozivas za bilo koji tip koji implementira interfejs Op, u konkretnom primeru. Razlika izmedju interfejsa i klase/strukture je u tome sto interfejs nema podataka.


Opet, ja zaista ne znam da li postoji univerzalna definicija interfejsa (sto je u ostalom i nebitno) ali znam bar dva jezika u kojima je moguce imati "naked" vrednosti, a da se ne vracaju iz funkcija. No, to nije poenta, poenta je da tvoja mul funkcija zahteva implementaciju interfejsa koji ne moze da se prosledi on-the-fly.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Prelaz od C ka OO programiranju01.12.2018. u 20:34 - pre 65 meseci
Pa naravno da neki tip mora implementirati interfejs, ne kapiram sta ti to znaci on the fly. Mislis nesto kao lokalna klasa koja implementira interfejs?
Postoji i mogucnost default implementacije interfejsa, nemoj da se sekiras.
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

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



+171 Profil

icon Re: Prelaz od C ka OO programiranju01.12.2018. u 21:06 - pre 65 meseci
Najbolje da pogledas kako radi recimo TypeScript, ili neki slican strukturalni type sistem.

Evo primer, uzecu interfejs koji samo ima metode, da ne bi isli sa kursa :)

Code:

interface IMessageConverter<TIn, TOut> {
        convertToJson: (object: TIn) => string;
        conertToObject: (json: string) => TOut;
}

function send<TIn, TOut>(converter: IMessageConverter<TIn, TOut>, object: TIn)  {
       const payload = converter.ConvertToJson(object);

       // ovo je pseudo code, posto fetch asinhrono radi i mora na Promise
       const response =  fetch(payload, ...);

       // vraca TOut
       return converter.convertToObject(response);
}


const myObject : Whatever = ....;

send(
    { 
        convertToJson: o => JSON.stringify(o),
        convertToObject: s => JSON.parse(s)
    }, 
    myObject);




Ako pogledas metodu send, ona prima interfejs, ali taj interfejs moze da se kreira on-the-fly, bas kao sto imas opciju u nominalnom type sistemu kada se ocekuje funkcija da prosledis lambdu umesto da pises negde implementaciju. Naravno, sve ovo mozes i ne moras da korists, za sve treba doza racionalnosti, sa ovim ako se pretera onda dobijes brdo code-a koji se ponavlja, a opet ako nemas ovu opciju onda dodjes u situaciju da nekad pises implementacije interfejsa za jako trivijalne stvari i to samo na jednom mestu, sto je prilicno smarajuce.

 
Odgovor na temu

mjanjic
Šikagou

Član broj: 187539
Poruke: 2700



+699 Profil

icon Re: Prelaz od C ka OO programiranju01.12.2018. u 21:27 - pre 65 meseci


[Ovu poruku je menjao mjanjic dana 01.12.2018. u 22:37 GMT+1]
Blessed are those who can laugh at themselves, for they shall never cease to be amused.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Prelaz od C ka OO programiranju01.12.2018. u 22:12 - pre 65 meseci
Citat:
negyxo:
Najbolje da pogledas kako radi recimo TypeScript, ili neki slican strukturalni type sistem.

Evo primer, uzecu interfejs koji samo ima metode, da ne bi isli sa kursa :)

Code:

interface IMessageConverter<TIn, TOut> {
        convertToJson: (object: TIn) => string;
        conertToObject: (json: string) => TOut;
}

function send<TIn, TOut>(converter: IMessageConverter<TIn, TOut>, object: TIn)  {
       const payload = converter.ConvertToJson(object);

       // ovo je pseudo code, posto fetch asinhrono radi i mora na Promise
       const response =  fetch(payload, ...);

       // vraca TOut
       return converter.convertToObject(response);
}


const myObject : Whatever = ....;

send(
    { 
        convertToJson: o => JSON.stringify(o),
        convertToObject: s => JSON.parse(s)
    }, 
    myObject);




Ako pogledas metodu send, ona prima interfejs, ali taj interfejs moze da se kreira on-the-fly, bas kao sto imas opciju u nominalnom type sistemu kada se ocekuje funkcija da prosledis lambdu umesto da pises negde implementaciju. Naravno, sve ovo mozes i ne moras da korists, za sve treba doza racionalnosti, sa ovim ako se pretera onda dobijes brdo code-a koji se ponavlja, a opet ako nemas ovu opciju onda dodjes u situaciju da nekad pises implementacije interfejsa za jako trivijalne stvari i to samo na jednom mestu, sto je prilicno smarajuce.


Ok, ali gde ti tu vidis abuse? Ako jezik dozvoljava anonimnu implementaciju interfejsa, ne moras a mozes da je koristis. Tu dolazimo zapravo do sustine a to je pitanje lambda funkcija koje nisu OOP ;p
Funkcionalna paradigma je svuda zavladala i skoro pa zamenila OOP kompletno.

 
Odgovor na temu

negyxo
Aleksandar Perkuchin

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



+171 Profil

icon Re: Prelaz od C ka OO programiranju01.12.2018. u 22:44 - pre 65 meseci
Branimire, nisi pratio fabulu :D

Ne, zadnjih par komentara se odnosi na to kako strukturalni type sistem ti omogucuje da implementiras interface on-the-fly. Zloupotreba se odnosi na onaj deo koji sam opisao u drugom postu, kada uzmes i za svaku klasu namestis interface. To znaci, ako planiras da tvoj code koristis samo interno, i nema neki public deo, i nemas nameru nesto da prosirujes, onda je deklaracija interfejsa cist noise. Ako imam recimo funkciju koji kaze da prima interfejs, recimo neki Converter, i taj converter ima jednu implementaciju u celom projektu, i nikad nece imati vise od jedne, i to vazi za 95% interfejsa, onda je to nesnosni noise. Kada vidim da funkcija prima interfejs, gde se implementacija nalazi? Jel moram ja da ga implementiram? Pa cim si definisao kao interfejs onda dajes do znanja da bi trebalo da implementiras, ali posto to u stvari nije prava upotreba interfejsa, onda samo treba da ides i da pretrazujes projekat koja to klasa implementira interface ili da imas neki dependency injection container (opet silovanje, container koji uvek vraca istu implementaciju za isti interfejs, ali ono, mozda zatreba jednog dana....).
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
109.72.51.23



+1064 Profil

icon Re: Prelaz od C ka OO programiranju02.12.2018. u 03:34 - pre 65 meseci
Ne vidim kakve veze ima struktuirani type sa interfejsima ;)
Osim to da ti ne treba eksplicitna deklaracija interfejsa (kao recimo u slucaju C++ template-a) ;)
E sad sto se tice koriscenja generickih funkcija u lokalu, a i onih koje koriste interfejs, ne znam jel to zloupotreba ili ne u slucaju da ima samo jedan slucaj ;)
Tu mozes stvar gledati i tako da razbijanje koda na vise lokalnih f-ja nema smisla ;)

 
Odgovor na temu

negyxo
Aleksandar Perkuchin

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



+171 Profil

icon Re: Prelaz od C ka OO programiranju02.12.2018. u 07:58 - pre 65 meseci
Strukturalan type system ti omogucuje da lakse radis sa interfejsima. Na pocetku sam i rekao da zavisi i gde koristis interfejse. Opisao sam zasto u nominalnom interfejsi postanu noise (IoC style). Prostim prebrojavanjem, recimo u C# i u TypeScript, mogu da primetim da je upotreba interfejsa u TypeScript-u bar 10x veca (skoro da nema klasa). Da je to slucaj u C# - pa poludeo bi :) a opet, razlog zasto je to tako je u tome da bi mogao da "seces" i stvaras tipove kako ti je volja kada prosledjujes vrednosti.
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+711 Profil

icon Re: Prelaz od C ka OO programiranju02.12.2018. u 11:18 - pre 65 meseci
Citat:
Nedeljko:
Da mi je znati šta je loše u uzimanju opšte poznatih primera.

Nisu u pitanju opšte poznati, već usiljeni primeri koji nemaju veze sa realnim modeliranjem. Čak ni kad dizajniraš program za zoološki vrt ili za veterinare, nećeš praviti klase Dog i Cat, već ćeš eventualno imati Pet i Owner.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.ptt.rs.



+2789 Profil

icon Re: Prelaz od C ka OO programiranju02.12.2018. u 12:20 - pre 65 meseci
A kad praviš vidoje igru? Da li onda klase Dog i Cat imaju smisla?
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+711 Profil

icon Re: Prelaz od C ka OO programiranju02.12.2018. u 15:56 - pre 65 meseci
Ne.
 
Odgovor na temu

nkrgovic
Nikola Krgović
Beograd

Član broj: 3534
Poruke: 2807

ICQ: 49345867
Sajt: https://www.twinstarsyste..


+655 Profil

icon Re: Prelaz od C ka OO programiranju02.12.2018. u 16:23 - pre 65 meseci
Da li je neko od vas koristio ne lambda funckije vec lambda arhitekture, u smusli bilo da vam je neko pravio custom sistem koji dize kontejnere on-event kad se nesto desi na API gateway-u, bilo kao AWS Lambda? Ovakva paradigma je postala popularna, pre svega zbog cene jer je to jedini sistem gde se ne placa ni milisekund koriscenja resursa od onoga sto je potrebno za izvrsenje. Razlog zasto google kroz gloang, ili npr. node.js forsiraju funkcionalno programiranje je vezan pre svega za taj tzv serverless pristup, tj. duboke nivoe apstrakscije infrastrukture, gde dev team moze da se opet distancira od ops tima (da, da... idi mi - dodji mi, opet), i da opet svako radi svoj posao ;) .

Cena je glavni motivator cele price, to je sustina. A cena vuce formu (serverless), forma vuse strukturu (lambda), a sturktura vuce paradignu jezuka (funkcionalni).
Please do not feed the Trolls!

Blasphemy? How can I blaspheme? I'm a god!'
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.ptt.rs.



+2789 Profil

icon Re: Prelaz od C ka OO programiranju02.12.2018. u 17:33 - pre 65 meseci
Citat:
jablan: Ne.

Pa, vidi, razne klase karaktera u vidoje igrama imaju različita ponašanja. Koliko ja znam, to se u vidoje igrama tako implementira.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Predrag Supurovic
Pedja YT9TP
Užice

Član broj: 157129
Poruke: 6279

Sajt: pedja.supurovic.net


+1570 Profil

icon Re: Prelaz od C ka OO programiranju02.12.2018. u 18:41 - pre 65 meseci
Citat:
negyxo:
Ne, zadnjih par komentara se odnosi na to kako strukturalni type sistem ti omogucuje da implementiras interface on-the-fly.

Zloupotreba se odnosi na onaj deo koji sam opisao u drugom postu, kada uzmes i za svaku klasu namestis interface. To znaci, ako planiras da tvoj code koristis samo interno, i nema neki public deo, i nemas nameru nesto da prosirujes, onda je deklaracija interfejsa cist noise. Ako imam recimo funkciju koji kaze da prima interfejs, recimo neki Converter, i taj converter ima jednu implementaciju u celom projektu, i nikad nece imati vise od jedne, i to vazi za 95% interfejsa, onda je to nesnosni noise. Kada vidim da funkcija prima interfejs, gde se implementacija nalazi? Jel moram ja da ga implementiram? Pa cim si definisao kao interfejs onda dajes do znanja da bi trebalo da implementiras, ali posto to u stvari nije prava upotreba interfejsa, onda samo treba da ides i da pretrazujes projekat koja to klasa implementira interface ili da imas neki dependency injection container (opet silovanje, container koji uvek vraca istu implementaciju za isti interfejs, ali ono, mozda zatreba jednog dana....).



Pokušavam da razumem tvoj ugao gledanja ali mi baš ne ide. Možda zato što nemam neko isksutvo rada u C++ i Javi (kad god sam probao odbijao me je nesnosan utisak skučenosti i ograničenja).

Pazi, svaki pristup ima opravdanje jer da nema ne bi postojao. Svaki pristup može da se ne koristi, da se koristti, da se preterano koristi i da se koristi naopako. A to opet zavisi od ličnih afiniteta, navika, načina razmišljanja, umešnosti i iskustva i sličnog.

Meni je recimo "on the fly" (kreiranja tipova, strutkura, funckija...) naopak pristup (neću ići dotle da ga nazovem fašističkim ali ga smatram jednom od većih grozota) a ti ga voliš. Daleko bilo da ne koristim "dinamički" pristup. Nekad se on ne može izbeći i ume znatno da uporosti stvari ali u svemu treba imati mere.

Takođe tvoj omiljen pristup nasleđivanja više klasa meni ne leži (koncept mi je simpatičan ali mi ne pije vodu u realnoj primeni). Naravno da nisam ja u pravu kao što nisi ni ti upravu. Svako od nas treba da radi kako mu pogoduje. Klali bismo se samo ako bismo radili na istom projektu :)

Naravno da je pogrešno preterivati u svemu pa i u upotebi interfejsa. Interfejs se definiše kada je potreban i implementira onda kada je potreban. Niko tebe ne prisilajva da implementiraš odeđeni interfejs osim ako ne treba da komuniciraš sa nekom klasom koja zahteva određeni interfejs. Upravo taj interfejs omogućava da ta klasa komunicira sa tvojom klasom ne znajući o njoj ništa više od tog interfejsa. Interfejs upravo tome i služi, da definiše protokol po kome klase komuniciraju ne ulazeži u samu strukturu tih klasa.

Nije mi jasno na šta misliš kada kažeš da ti je problem da nađeš ko implementira neki interfejs. Nema šta ko da ga implementira, implementiraš ga ti na tvojoj klasi ako ona treba da komunicira sa drugom klasom preko tog interfejsa.

Često kada objašnajvam interfejse navodim primer iz prakse, primer sa komponetnama grafičkog intefejsa koje prikazuju tabele. To su na primer grid, combo box, list, box, meni i slične komponente.

Nisu one bez razloga napravljene uz upotrebu interfejsa (u C# to su konkretno IEnumerable i IEnumerator) jer na taj način je omogućeno da one prikažu bilo kakve podatke bez obira u kakvim su objektima. Dakle, one će prihvatiti i prikazati podatke koji imaju IEnumerable intefejs i neće uopšte ulaziti da li se radi o standardnoj tabeli, nekoji listi, koilekciji ili možda čak i sasvim custom klasi. Sve dok prosleđeni podatak ima implementiran interfejs podaci će biti prikazani u bilo kojoj grafičkoj komponenti koja prikazuje podtke koje su u nekakvom tabelarnom obliku.

Ne odnosi se iEnumerable samo na grafičke komponente. Recimo ako napraviš klasu koja implementira iEnumerable interfejs moći ćeš da je obrađuješ i sa foreach. Ako to ne uradiš, onda ćeš morati da protrčavaš kroz sve elemente u svojoj strukturi ručno, na neki svoj način.

Zaista ne vidim problem s aimplementacijominterfejsa. Njega implementiraš samo ako ti je potrebno. Niko te ne uslovljava da implementiraš interefejs ako se on neće koristiti. Implementacije interfejsa se nasleđuju tako da ako implementiraš interfejs na nekoj baznoj kasi sve klse koje su naslednici će takođe koristiti tu implementaciju.
 
Odgovor na temu

[es] :: Art of Programming :: Prelaz od C ka OO programiranju

Strane: < .. 1 2 3 4 5 6

[ Pregleda: 14956 | Odgovora: 101 ] > FB > Twit

Postavi temu Odgovori

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