vendredi 22 mai 2015

How to avoid duplicating implemented getter function in PHP

While this question is about methods of solving this problem, I am particularly interested in good clean OO design and solutions that conform to current PHP best practices. Thanks in advance for taking a look.

I have the following interface:

<?php

interface Tool {

  /**
   * Return the unique name of the tool
   */
  public function getName();

}

The majority of classes that implement this interface in my project looks like this:

<?php

class Drill implements Tool {

    protected $toolName = 'drill';

    public function getName() {
        return $this->toolName;
    }

}

And so the problem is I have dozens of classes that repeat this logic, duplicating the $toolName property and getName() logic, breaking the simple rule of 'Don't repeat yourself'

One solution I have considered is the following:

<?php

abstract class BaseTool implements Tool {

    public function getName() {
        return $this->toolName;
    }

}

Then simply have tool classes extend the abstract BaseTool class:

<?php

class Drill extends BaseTool {

    protected $toolName = 'drill';
}

However this now means that I lose the ability to force implementing classes to define the function getName() if they extend the BaseTool class, which can lead to incorrect implementations.

I also think that by having the BaseTool class return $this->toolName, it is making assumptions about the implementing classes and breaks encapsulation.

I have used a simple example to demonstrate the problem but hope you get what I'm trying to solve, and that this problem may also relate to more complex situations. Appreciate your thoughts.

Aucun commentaire:

Enregistrer un commentaire