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();
}
final class Walk implements MoveBehaviour {
public function move()
{
// walk
}
}
final class Run implements MoveBehaviour {
public function move()
{
// run
}
}
final 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
$worker = new Player(new Walk(), new Punch());
$warrior = new Player(new Walk(), new AxeAttack());
(USE FACTORY PATTERN)
FINAL



CHANGE?





<?php
class Player{
// ...
public function setAttackBehaviour(AttackBehaviour $attackBehaviour){
$this->attackBehaviour = $attackBehaviour;
}
// ...
}
SETTING BEHAVIOUR DYNAMICALLY
<?php
// ...
$explorer = new Player(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
- 780