Используйте два класса в одном: ошибка дизайна? - PullRequest
1 голос
/ 03 января 2011

Я написал эти два класса, которые просто шифруют и дешифруют строки:

Encode.php

    class Encode {
        protected funcion do_encode($string) { .. }
    }


Decode.php

    class Decode {
        protected funcion do_decode($string) { .. }
    }

Что бы я хотел бы сделать так:

Encrypt.php

    class Encrypt extends Encode, Decode {
        protected $stuff_for_parents;

        function __construct($configs) {
            $this->stuff_for_parents = $configs['SomeConf'];
        }

        public function encode($string) { $this->do_encode($string); }
        public function decode($string) { $this->do_decode($string); }
    }

Но мы не можемвключать более одного класса, поэтому: сбой.Теперь мои вопросы:

  1. Это проблема дизайна?Потому что этот сценарий не выглядит для меня странно, не так ли?
  2. Есть ли другой способ иметь один объект, который использует обе функции в разных классах?Сортировка $encrypt->encode($str); $encrypt->decode($str);

Ответы [ 4 ]

5 голосов
/ 03 января 2011

Если вы хотите, чтобы Encode и Decode были отдельными классами, вы можете создавать их экземпляры в Encrypt. Например:

<?
class Encrypt {
  private $encoder;
  private $decoder;
  public function __construct() {
    $this->encoder = new Encode();
    $this->decoder = new Decode();
  }
  public function encode($string) {
    return $this->encoder->encode($string);
  }
  public function decode($string) {
    return $this->decoder->decode($string);
  }
}
?>

В этом примере Encode и Decode должны быть конкретными классами. Но вы можете рассмотреть возможность использования интерфейсов вместо этого. Интерфейсы полезны, если вы считаете, что вам может понадобиться использовать разные типы объектов кодирования и декодирования в разных ситуациях. Например, может быть, у вас есть класс TripleDESEncode и класс BlowfishEncode. Они оба могут реализовать общий интерфейс, например так:

<?
interface IEncode {
  public function encode($string);
}
class TripleDESEncode implements IEncode {
  public function encode($string) {...}
}
class BlowfishEncode implements IEncode {
  public function encode($string) {...}
}
?>

В этом случае вы можете сначала создать конкретные экземпляры, которые хотите использовать, а затем передать их в конструктор Encrypt. Это называется внедрением зависимости:

<?
class Encrypt {
  public function __construct(IEncode $encoder, IDecode $decoder) {
    $this->encoder = $encoder;
    $this->decoder = $decoder;
  }
  ...
}

$myEncrypt = new Encrypt(new BlowfishEncode(), new BlowfishDecode());
echo $myEncrypt->encode('test');
?>
2 голосов
/ 03 января 2011

Нет ничего плохого в том, чтобы инкапсулировать ваши алгоритмы в отдельных классах (на самом деле, это хорошая практика, если вам нужна гибкость, чтобы изменять их, особенно во время выполнения), однако, что вам, вероятно, нужно, это композиция, а не наследование:

class Encrypt {
    private $encoder;
    private $decoder;
    protected $stuff_for_parents;

    function __construct($configs, $encoder, $decoder) {
        $this->stuff_for_parents = $configs['SomeConf'];
        $this->encoder = $encoder;
        $this->decoder = $decoder;
    }

    public function encode($string) { $this->encoder->do_encode($string); }
    public function decode($string) { $this->decoder->do_decode($string); }
}
0 голосов
/ 03 января 2011

Я бы написал что-то вроде:

class Encrypt
{
    protected $stuff_for_parents;

    function __construct($configs) {
        $this->stuff_for_parents = $configs['SomeConf'];
    }

    protected funcion encode($string)
    {
    }

    protected funcion decode($string)
    {
    }
}
0 голосов
/ 03 января 2011

Я думаю, вы должны просто создать два метода / функции в классе шифрования.Это очень логично.

Это имеет смысл, но это может быть сделано способом, разрешенным языками программирования.Декодирование кодирования - это разные функции, которые должен выполнять класс шифрования, поэтому это должны быть методы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...