gyakori félreértések
TRANSCRIPT
![Page 1: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/1.jpg)
Gyakori félreértések
Magyar Attila (BalaBit)
PHPMeetup, 2013. április 30.
![Page 2: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/2.jpg)
Bemelegítés: hungarian notation
● sName, arrNodes...
![Page 3: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/3.jpg)
Bemelegítés: hungarian notation
● sName, arrNodes...● m_name, m_Nodes
![Page 4: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/4.jpg)
Bemelegítés: hungarian notation
● sName, arrNodes...● m_name, m_Nodes
![Page 5: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/5.jpg)
Bemelegítés: hungarian notation
class Foo { private $m_name;
public function __construct($name) { $this->m_name = $name; }
public function bar() { for ($i = 0; $i != 3; ++$i) { printf("%s\n", $this->m_name); } }}
![Page 6: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/6.jpg)
Bemelegítés: hungarian notation
class Foo { public: Foo(const char *name) { this->m_name = name; }
void bar() { for (int i = 0; i != 3; ++i) { printf("%s\n", this->m_name); } }
private: const char *m_name;};
![Page 7: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/7.jpg)
Bemelegítés: hungarian notation
class Foo { public: Foo(const char *name) { m_name = name; }
void bar() { for (int i = 0; i != 3; ++i) { printf("%s\n", m_name); } }
private: const char *m_name;};
![Page 8: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/8.jpg)
Bemelegítés: hungarian notation
class Foo { private $m_name;
public function __construct($name) { $this->m_name = $name; }
public function bar() { for ($i = 0; $i != 3; ++$i) { printf("%s\n", $this->m_name); } }}
![Page 9: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/9.jpg)
Bemelegítés: hungarian notation
class Foo { private $m_name;
public function __construct($name) {
$this->m_name = $name; }
public function bar() { for ($i = 0; $i != 3; ++$i) {
printf("%s\n", $this->m_name); } }}
![Page 10: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/10.jpg)
Bemelegítés: hungarian notation
class Foo { private $m_name;
public function __construct($name) {
$this->m_name = $name; }
public function bar() { for ($i = 0; $i != 3; ++$i) {
printf("%s\n", $this->m_name); } }}
![Page 11: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/11.jpg)
Öröklődés
Mi az az OOP?
![Page 12: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/12.jpg)
Öröklődés
Mi az az OOP?● Osztályok, objektumok, metódusok (üzenetek)
![Page 13: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/13.jpg)
Öröklődés
Mi az az OOP?● Osztályok, objektumok, metódusok (üzenetek)● encapsulation, polymorphism, inheritance, dynamic
dispatch
![Page 14: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/14.jpg)
Öröklődés
Mi az az OOP?● Osztályok, objektumok, metódusok (üzenetek)● encapsulation, polymorphism, inheritance, dynamic
dispatch● design patterns, modelling (abstractions)
![Page 15: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/15.jpg)
Öröklődés
Mi az az OOP?● Osztályok, objektumok, metódusok (üzenetek)● encapsulation, polymorphism, inheritance, dynamic
dispatch● design patterns, modelling (abstractions)● REUSABILITY, MAINTAINABILITY
![Page 16: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/16.jpg)
Öröklődés
abstract class Application{ public function run() { $class = get_class($this); syslog(LOG_INFO, "Running $class"); $this->doRun(); }
abstract protected function doRun();}
![Page 17: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/17.jpg)
Öröklődés
class FizzBuzzApplication extends Application{ protected function doRun() { for ($i = 1; $i <= 100; ++$i) { if ($i % 3 == 0) print "Fizz"; if ($i % 5 == 0) print "Buzz"; if ($i % 3 != 0 && $i % 5 != 0) print $i; print "\n"; } }}
![Page 18: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/18.jpg)
Öröklődés
class FizzBuzzApplication extends Application{
protected function doRun() { for ($i = 1; $i <= 100; ++$i) { if ($i % 3 == 0) print "Fizz"; if ($i % 5 == 0) print "Buzz"; if ($i % 3 != 0 && $i % 5 != 0) print $i; print "\n"; } }}
![Page 19: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/19.jpg)
Öröklődés
class FizzBuzzApplication extends Application{ protected function doRun() { for ($i = 1; $i <= 100; ++$i) { if ($i % 3 == 0) print "Fizz"; if ($i % 5 == 0) print "Buzz"; if ($i % 3 != 0 && $i % 5 != 0) print $i; print "\n"; } }}
![Page 20: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/20.jpg)
Öröklődés
class FizzBuzzWebApplication extends FizzBuzzApplication{ protected function doRun() { print "<html><body><pre>"; parent::doRun(); print "</pre></body></html>"; }}
![Page 21: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/21.jpg)
Öröklődés
abstract class Application{ public function run() { $class = get_class($this); syslog(LOG_INFO, "Running $class"); $this->doRun(); }
abstract protected function doRun();}
![Page 22: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/22.jpg)
Öröklődés
abstract class Application{ public function run() { $class = get_class($this); syslog(LOG_INFO, "Running $class"); if (in_array("--help", $GLOBALS["argv"])) { print "Help text\n"; } else { $this->doRun(); } }
abstract protected function doRun();}
![Page 23: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/23.jpg)
Öröklődés
class FizzBuzzWebApplication extends FizzBuzzApplication{ protected function doRun() { print "<html><body><pre>"; parent::doRun(); print "</pre></body></html>"; }}
Notice: Undefined index: argv in...
![Page 24: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/24.jpg)
Öröklődés
class FizzBuzzWebApplication extends FizzBuzzApplication{ protected function doRun() { print "<html><body><pre>"; parent::doRun(); print "</pre></body></html>"; }}
Notice: Undefined index: argv in...
![Page 25: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/25.jpg)
Öröklődés
abstract class DaemonApplication extends Application{ public function run() { $this->updatePidFile(); $this->closeStandardIO(); parent::run(); $this->clearPidFile(); }
/* ... */}
![Page 26: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/26.jpg)
Öröklődés
abstract class SingletonApplication extends Application{ public function run() { if ($this->isRunningAlready()) { throw new Exception("..."); } parent::run(); }
/* ... */}
![Page 27: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/27.jpg)
Öröklődés
abstract class SingletonDaemonApplication
extends ???{ public function run() { /* ... */ }}
![Page 28: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/28.jpg)
Öröklődés
abstract class SingletonDaemonApplication
extends ???{ public function run() { /* ... */ }}
![Page 29: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/29.jpg)
Többszörös öröklődés?
Szerencsére PHP-ben nincs...
![Page 30: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/30.jpg)
Többszörös öröklődés?
Szerencsére PHP-ben nincs... Honnan jönne a run() metódus?
![Page 31: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/31.jpg)
Off: többszörös öröklődés
Deadly diamond of death
![Page 32: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/32.jpg)
Off: többszörös öröklődés
Deadly diamond of death
![Page 33: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/33.jpg)
Off: többszörös öröklődés
Deadly diamond of death
![Page 34: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/34.jpg)
Megoldás?
abstract class SingletonDaemonApplication
extends ???{ public function run() { /* ... */ }}
![Page 35: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/35.jpg)
Megoldás
interface Application{ /** * @brief Entry point for business logic. * @return void */ public function run();
/** * @brief Human-readable name of the application * @return string */ public function getName();}
![Page 36: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/36.jpg)
Megoldás
class ApplicationDecorator implements Application{ private $application;
public function __construct(Application $app) { $this->application = $app; }
public function run() { $this->application->run(); }
public function getName() { return $this->application->getName(); }}
![Page 37: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/37.jpg)
Megoldás
class CommandLineApplication extends ApplicationDecorator{ public function run() { $name = $this->getName(); syslog(LOG_INFO, "Running $name"); if (in_array("--help", $GLOBALS["argv"])) { print "Help text\n"; } else { parent::run(); } }}
![Page 38: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/38.jpg)
Megoldás
class DaemonApplication extends ApplicationDecorator{ public function run() { $this->updatePidFile(); $this->closeStandardIO(); parent::run(); $this->clearPidFile(); }
/* ... */}
![Page 39: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/39.jpg)
Megoldás
class SingletonApplication extends ApplicationDecorator{ public function run() { if ($this->isRunningAlready()) { throw new Exception("Already running"); } parent::run(); }
/* ... */}
![Page 40: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/40.jpg)
Megoldás
new SingletonApplication( new DaemonApplication( new CommandLineApplication( new ConcreteApplication() ) ));
new WebApplication(new ConcreteApplication());
![Page 41: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/41.jpg)
Megoldás
new SingletonApplication( new DaemonApplication( new CommandLineApplication( new ConcreteApplication() ) ));
new WebApplication(new ConcreteApplication());
![Page 42: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/42.jpg)
Hány unit tesztet írjak?
![Page 43: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/43.jpg)
Hány unit tesztet írjak?
1 osztály ↔ 1 unit teszt?
![Page 44: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/44.jpg)
Hány unit tesztet írjak?
1 osztály ↔ 1 unit teszt? 1 metódus ↔ 1 unit teszt?
![Page 45: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/45.jpg)
Hány unit tesztet írjak?
1 osztály ↔ 1 unit teszt? 1 metódus ↔ 1 unit teszt? 1 ??? ↔ 1 unit teszt?
![Page 46: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/46.jpg)
Hány unit tesztet írjak?
Miért írunk unit teszteket egyáltalán?● gyors&mebízható (!!!) feedback (pl. refactoring)● design● élő dokumentáció, példakód
![Page 47: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/47.jpg)
Hány unit tesztet írjak?
Miért írunk unit teszteket egyáltalán?● gyors&mebízható (!!!) feedback (pl. refactoring)● design● élő dokumentáció, példakód
Ha ezeket a célokat eléri, akkor unit teszt
![Page 48: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/48.jpg)
Hány unit tesztet írjak?
Miért írunk unit teszteket egyáltalán?● gyors&mebízható (!!!) feedback (pl. refactoring)● design● élő dokumentáció, példakód
Ha ezeket a célokat eléri, akkor unit teszt Tehát 1 osztályhoz akkor mennyi unit teszt
kell? 1 tesztből hány osztályt szabad/kell használni?
![Page 49: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/49.jpg)
Hány unit tesztet írjak?
![Page 50: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/50.jpg)
Hány unit tesztet írjak?
![Page 51: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/51.jpg)
Hány unit tesztet írjak?
Miért írunk unit teszteket egyáltalán?● gyors&mebízható (!!!) feedback (pl. refactoring)● design● élő dokumentáció, példakód
Ha ezeket a célokat eléri, akkor unit teszt Annyi teszt legyen, amennyi a céljainkhoz elég
![Page 52: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/52.jpg)
Tehát?
A cél a legfontosabb, ne vesszünk el a policy-k, eszközök és szabályok erdejében.
![Page 53: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/53.jpg)
?
FYI: http://www.balabit.com/hu/openacademy (május 23, 17:00, BME Q épület)
http://en.wikipedia.org/wiki/Composition_over_inheritance
![Page 54: Gyakori félreértések](https://reader036.vdocuments.net/reader036/viewer/2022081400/554a1f42b4c905825d8b56cc/html5/thumbnails/54.jpg)
Köszönöm a figyelmet