STRATEGIZE!

ZVONIMIR SPAJIC

LET'S BUILD A SIMPLE GAME

DOMAIN

WORKER

 

SETTLER

 

WARRIOR

 

TYPES OF PLAYERS:

MOVE

 

GREET

 

ATTACK

 

EVERY PLAYER CAN:

MODEL

TYPES OF PLAYERS

TYPES OF PLAYERS

TYPES OF PLAYERS

  <?php

  class Worker extends Player {

  }

  class Settler extends Player {

  }

  class Warrior extends Player {

  }

EACH PLAYER CAN

EACH PLAYER CAN

EACH PLAYER CAN

EACH PLAYER CAN

  <?php

  class Player {

      public function greet() {
         // say hello
      }

      public function move() {
          // walk
      }

      public function attack() {
          // punch
      }

  }

EVERY PLAYER CAN:

 SAY HELLO

WALK

ATTACK

TYPES OF PLAYERS:
WARRIOR

WORKER

SETTLER

EVERY PLAYER CAN:

 SAY HELLO

WALK

ATTACK

TYPES OF PLAYERS:
WARRIOR

WORKER

SETTLER

  <?php

  class Worker extends Player {

  }

  class Settler extends Player {

  }

  class Warrior extends Player {

      public function attack()
      {
          // attack with axe
      }
  }

GOOD DESIGN?

THE ONE CONSTANT IN SOFTWARE DEVELOPMENT:

 

CHANGE

 

NEW UNITS

EXPLORER

 

HORSEMAN

 

DESIGN PRINCIPLE

IDENTIFY THE ASPECTS OF YOUR APPLICATION THAT VARY AND SEPARATE THEM FROM WHAT STAYS THE SAME

  <?php

  interface MoveBehaviour {
      public function move();
  }

  class Walk implements MoveBehaviour {
      public function move() 
      {
          // walk
      }
  }

  class Run implements MoveBehaviour {
      public function move()
      {
          // run
      }
  }

  class RideHorse implements MoveBehaviour {
      public function move() 
      {
          // ride a horse
      }
  }
  <?php

  interface AttackBehaviour {
      public function attack();
  }

  class Punch implements AttackBehaviour {
      public function attack()
      {
          // punch
      }
  }

  class AxeAttack implements AttackBehaviour {
      public function attack()
      {
          // attack with axe
      }
  }

  class EyePoke implements AttackBehaviour {
      public function attack() 
      {
          // poke in eye
      }
  }

DESIGN PRINCIPLE

PROGRAM TO AN INTERFACE, NOT AN IMPLEMENTATION

  <?php

  class Player {

      private MoveBehaviourInterface $moveBehaviour;
      private AttackBehaviourInterface $attackBehaviour;

      // ...

      public function move() {
          $this->moveBehaviour->move();
      }

      public function attack() {
          $this->attackBehaviour->attack();
      }

  }

DESIGN PRINCIPLE

FAVOUR COMPOSITION OVER INHERITANCE

  <?php

  class Player {

      private MoveBehaviour $moveBehaviour;
      private AttackBehaviour $attackBehaviour;

      public function __construct(MoveBehaviour $move, AttackBehaviour $attack) {
          $this->moveBehaviour = $moveBehaviour;
          $this->attackBehaviour = $attackBehaviour;
      }

    // ...
  }
<?php


$player = new Worker(new Walk(), new Punch());


(USE FACTORY PATTERN)

FINAL

CHANGE?

  <?php

  class Player{

      // ... 

      public function setAttackBehaviour(AttackBehaviour $attackBehaviour){
          $this->attackBehaviour = $attackBehaviour;
      }

      // ...
  }

SETTING BEHAVIOUR DYNAMICALLY

 

  <?php

  // ...

  $explorer = new Explorer(new Run(),new EyePoke());

  // explorer found a sword
  $explorer->setAttackBehaviour(new SwordAttack());

 

DEFINES A FAMILY OF ALGORITHMS, ENCAPSULATES EACH ONE, AND MAKES THEM INTERCHANGABLE

THE STRATEGY PATTERN

THE STRATEGY PATTERN

RESOURCES

DESIGN PATERNS: ELEMENTS OF REUSABLE SOFTWARE

HEAD FIRST DESIGN PATTERNS

THANK YOU!

Strategize!

By konrad 126

Strategize!

Introductions talk @Madewithlove

  • 587