54
Gyakori félreértések Magyar Attila (BalaBit) PHPMeetup, 2013. április 30.

Gyakori félreértések

Embed Size (px)

Citation preview

Page 1: Gyakori félreértések

Gyakori félreértések

Magyar Attila (BalaBit)

PHPMeetup, 2013. április 30.

Page 2: Gyakori félreértések

Bemelegítés: hungarian notation

● sName, arrNodes...

Page 3: Gyakori félreértések

Bemelegítés: hungarian notation

● sName, arrNodes...● m_name, m_Nodes

Page 4: Gyakori félreértések

Bemelegítés: hungarian notation

● sName, arrNodes...● m_name, m_Nodes

Page 5: Gyakori félreértések

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

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

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

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

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

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

Öröklődés

Mi az az OOP?

Page 12: Gyakori félreértések

Öröklődés

Mi az az OOP?● Osztályok, objektumok, metódusok (üzenetek)

Page 13: Gyakori félreértések

Ö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

Ö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

Ö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

Ö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

Ö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

Ö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

Ö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

Ö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

Ö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

Ö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

Ö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

Ö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

Ö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

Ö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

Öröklődés

abstract class SingletonDaemonApplication

extends ???{ public function run() { /* ... */ }}

Page 28: Gyakori félreértések

Öröklődés

abstract class SingletonDaemonApplication

extends ???{ public function run() { /* ... */ }}

Page 29: Gyakori félreértések

Többszörös öröklődés?

Szerencsére PHP-ben nincs...

Page 30: Gyakori félreértések

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

Off: többszörös öröklődés

Deadly diamond of death

Page 32: Gyakori félreértések

Off: többszörös öröklődés

Deadly diamond of death

Page 33: Gyakori félreértések

Off: többszörös öröklődés

Deadly diamond of death

Page 34: Gyakori félreértések

Megoldás?

abstract class SingletonDaemonApplication

extends ???{ public function run() { /* ... */ }}

Page 35: Gyakori félreértések

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

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

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

Megoldás

class DaemonApplication extends ApplicationDecorator{ public function run() { $this->updatePidFile(); $this->closeStandardIO(); parent::run(); $this->clearPidFile(); }

/* ... */}

Page 39: Gyakori félreértések

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

Megoldás

new SingletonApplication( new DaemonApplication( new CommandLineApplication( new ConcreteApplication() ) ));

new WebApplication(new ConcreteApplication());

Page 41: Gyakori félreértések

Megoldás

new SingletonApplication( new DaemonApplication( new CommandLineApplication( new ConcreteApplication() ) ));

new WebApplication(new ConcreteApplication());

Page 42: Gyakori félreértések

Hány unit tesztet írjak?

Page 43: Gyakori félreértések

Hány unit tesztet írjak?

1 osztály ↔ 1 unit teszt?

Page 44: Gyakori félreértések

Hány unit tesztet írjak?

1 osztály ↔ 1 unit teszt? 1 metódus ↔ 1 unit teszt?

Page 45: Gyakori félreértések

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

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

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

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

Hány unit tesztet írjak?

Page 50: Gyakori félreértések

Hány unit tesztet írjak?

Page 51: Gyakori félreértések

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

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

?

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

Köszönöm a figyelmet