hf_hez
Letöltés
- Nyomtatáshoz, 3 dia/lap (59K)
- Nyomtatáshoz, 6 dia/lap (58K)
- Képernyőre, 1 dia/lap (színes) (57K)
- E-könyv olvasóhoz, 1 dia/lap (60K)
1.
Gondolatok a HF-hez • Megírtuk a világ legjobb snake játékát funkcionálisan. • OO modellre való áttérésnél kézenfekvő, hogy kígyó és gyümölcs is objektum. // eredeti kódrészlet: void eat(snake s, enum fruit f) { switch(f) { case apple: s.length += 1; break; case kiwi: s.length += 3; break; default: } } C++ programozási nyelv © BME-IIT Sz.I. // OO–nak GONDOLT változat enum kind { apple, pear, kiwi }; class Fruit { kind type; public: kind getType() { return type; } }; class Snake { int length; public: Snake() : length(1) {} void grow(int n) { length += n; } void feed(Fruit& f) { switch(f.getType()) { case apple: grow(1); Ez így nem OO program break; case kiwi: ... 2021.03.29. - 1-
2.
Mi a baj? // OO–nak GONDOLT változat enum kind { apple, pear, kiwi }; class Fruit { kind type; public: kind getType() { return type; } }; class Snake { int length; public: Snake() : length(1) {} void grow(int n) { length += n; } void feed(Fruit& f) { switch(f.getType()) { case apple: grow(1); Ez így nem OO program break; case kiwi: ... C++ programozási nyelv © BME-IIT Sz.I. • Ez C++ szintakszissal írt procedurális kód. • SWITCH eleve gyanús!!! • Ha típus kell lekérdezi az is nagyon gyanús!!!! • Objektumok nem hatnak/kommunikálnak egymással. • Nehezen módosítható. Módosítani kell a kígyó kódját pl: – Egy új gyümölcs megjelenése miatt. – Gyümölcstől függő méretű növekedést akarunk. – ... 2021.03.29. - 2-
3.
OO megvalósítás class Fruit { public: virtual void eatenBy(Snake* s); }; • Módosítható • Bővíthető • Átlátható class Snake { int length; public: Snake() : length(1) {} void grow(int n) { length += n; } void feed(Fruit& f) { f.eatenBy(this); } void draw() ... }; class Apple : public Fruit { public: void eatenBy(Snake* s) { s->grow(1); } }; C++ programozási nyelv © BME-IIT Sz.I. 2021.03.29. - 3-
4.
Mérgező alma is lehet class Fruit { public: virtual void eatenBy(Snake* s); }; class Snake { int length; bool killed; public: Snake() : length(1), killed(false) {} void grow(int n) { length += n; } void kill() { killed = true; } void feed(Fruit& f) { f.eatenBy(this); } void draw() ... }; C++ programozási nyelv © BME-IIT Sz.I. class PoisonApple : public apple { public: void eatenBy(Snake* s) { s->kill(); } }; 2021.03.29. - 4-