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