Slide 1

Slide 1 text

Praktyczne programowanie obiektowe w PHP @cocoders

Slide 2

Slide 2 text

@cocoders Kim Jestem? Programistą, miłośnikiem piwa oraz średniowiecza, mieszkańcem Gdańska, współzałożycielem firmy Cocoders

Slide 3

Slide 3 text

Czym jest programowanie obiektowe? @cocoders

Slide 4

Slide 4 text

Stan(pola) + Zachowanie(metody) = Obiekt Zbiór komunikujących się ze sobą obiektów = Program obiektowy @cocoders

Slide 5

Slide 5 text

@cocoders Alan Kay – twórca Smalltaka 1998 rok Smalltalk is not only NOT its syntax or the class library, it is not even about classes. The big idea is "messaging" - that is what the kernel of Smalltalk/Squeak is all about

Slide 6

Slide 6 text

@cocoders Bertrand Meyer - twórca języka Eiffel rok 1986 Design by contract

Slide 7

Slide 7 text

@cocoders Przykład programu obiektowego ls | head -3 | tail -1 > myoutput

Slide 8

Slide 8 text

@cocoders Komunikacja to klucz

Slide 9

Slide 9 text

@cocoders Jak tworzyć kod otwary na na rozszerzenie, ale zamknięty na modyfikacje?

Slide 10

Slide 10 text

@cocoders Abstrakcja

Slide 11

Slide 11 text

namespace Cocoders\MedicalClinic; use Cocoders\MedicalClinic\Clinic; use Cocoders\MedicalClinic\TaxIdNumber; interface ClinicRegistry { public function find(TaxIdNumber $taxIdNumber); public function add(Clinic $clinic); } @cocoders Abstrakcja – przykłady

Slide 12

Slide 12 text

use Cocoders\MedicalClinic\ClinicRegistry; final class HireCandidate { private $consultantRegistry; public function __construct(ClinicRegistry $clinicRegistry) { $this->clinicRegistry = $clinicRegistry; } //.. } @cocoders Abstrakcja - przykłady

Slide 13

Slide 13 text

final class HireCandidate { //.. public function execute(HireCandidateCommand $command) { $taxIdNumber = $command->getClinicTaxIdNumber(); $clinic = $this->clinicRegistry->find($taxIdNumber); if (!$clinic) return; // logic $this->clinicRegistry->add($clinic); } } @cocoders Abstrakcja - przykłady

Slide 14

Slide 14 text

use Cocoders\MedicalClinic\ClinicRegistry as ClinicRegistryInterface; final class SqlClinicRegistry implements ClinicRegistryInterface { //.. public function find(TaxIdNumber $taxIdNumber) { $clinicArray = $this->connection->fetchColumn("SELECT * FROM clinics WHERE taxIdNumber = :taxIdNumber", ['taxIdNumber' => (string) $taxIdNumber]); if ($clinicData) { return new Clinic(new TaxIdNumber($clinicArray['taxIdNumber']), $clinicArray['name']); } } } @cocoders Abstrakcja - przykłady

Slide 15

Slide 15 text

final class DoctrineClinicRegistry implements ClinicRegistryInterface { //.. public function find(TaxIdNumber $taxIdNumber) { return $this ->manager->getRepository(Clinic::class) ->findOneBy(['taxIdNumber' => (string) $taxIdNumber]); } } @cocoders Abstrakcja - przykłady

Slide 16

Slide 16 text

@cocoders Wprowadzanie abstrakcji zbyt wcześnie i na siłę

Slide 17

Slide 17 text

@cocoders „final”

Slide 18

Slide 18 text

@cocoders Hermetyzacja

Slide 19

Slide 19 text

@cocoders Nie możemy zmieniać stanu w nieoczekiwany sposób

Slide 20

Slide 20 text

@cocoders $clinic->setTaxIdNumber('9562307984'); $clinic->setName('Cocoders'); $clinic->addEmployee((new Employee())- >setFirstName('Leszek'))); $clinic->getEmployees()->add((new Employee())->setFirstName('Szymon')); vs $clinic = new Clinic('Cocoders', ' 9562307984'); $clinic->hire(new Candidate('Leszek')); $clinic->hire(new Candidate('Szymon')); Gettery i settery a hermetyzacja

Slide 21

Slide 21 text

@cocoders Value Objects

Slide 22

Slide 22 text

final class TaxIdNumber { private $taxIdNumber; public function __construct($taxIdNumber) { self::assertIsValid($taxIdNumber) $this->taxIdNumber = $taxIdNumber; } public function __toString() { return $this->taxIdNumber; } private static function assertIsValid($str) { //.. } } @cocoders Value Object

Slide 23

Slide 23 text

@cocoders Value Objects – nie zmienne, nie posiadają stanu możemy na nich polegać

Slide 24

Slide 24 text

@cocoders Value Objects – Request oraz Response

Slide 25

Slide 25 text

@cocoders $request = Request::createFromGlobals(); $request->setFormat('json', 'application/json'); // somewhere in there external bundle or component function ($request) { $request->setFormat('json', 'myJsonP/srututututu'); } echo $request->getFormat('json');

Slide 26

Slide 26 text

@cocoders Entity

Slide 27

Slide 27 text

@cocoders $invoice = new Invoice( Invoice\Number::generate(), $buyer, $sellDate, new Invoice\PaymentPeriod('7 days') );

Slide 28

Slide 28 text

@cocoders Programowanie obiektowe = komunikacja obiektów poprzez odpowiednią hermetyzacje i abstrakcje

Slide 29

Slide 29 text

@cocoders Projektowanie komunikacji poprzez TDD

Slide 30

Slide 30 text

@cocoders Implementacje można łatwo podmienić, zmiany w komunikacji mogą być bolesne

Slide 31

Slide 31 text

@cocoders Implementacja to detal – baza danych to detal, framework to detal

Slide 32

Slide 32 text

@cocoders Dziękuję