Расширяет + реализует, вопрос о хороших принципах дизайна - PullRequest
1 голос
/ 13 сентября 2011

--- код изменен ---

Предположим, у меня есть интерфейс и два класса, один из которых расширяет другой:

interface EncryptionModule {
    public function setup();

    public function encrypt($originalString);

    public function decrypt($encryptedString);
}

class GeneralOneWayHashingModule {
    public static $encryptionType = ALG_TYPE_HASH_FUNCTION;
    protected $salt;

    public function setSalt($salt) {
        $this->salt = $salt;
    }


    public function decrypt($encryptedString) {
        throw new Exception(__CLASS__ . ' ' . __LINE__ . ': cannot reverse an hash function ');
    }
}

class BCryptHashingModule extends GeneralOneWayHashingModule implements GeneralOneWayHashingModule {
    protected $cost;

    public function setup() {
        $this->cost = 10;
    }

    public function setCost($cost) {
        $this->cost = $cost;
    }

    public function encrypt($originalString) {
        return crypt($originalString, '$2a$' . str_pad($this->cost, 2, '0', STR_PAD_LEFT) . '$' . $this->salt);
    }
}

Интересно, какой из двух классов должен реализовывать интерфейс EncryptionModule ... расширяющий (это мой выбор)? Оба класса, возможно, с GeneralOneWayHashingModule, объявленным как абстрактный и реализующим все функции, объявленные в EncryptionModule? Только расширенный?

Спасибо.

Ответы [ 2 ]

1 голос
/ 13 сентября 2011

Вопрос о том, должен ли GeneralOneWayHashingModule быть абстрактным, не связан с другим вопросом: должен ли он реализовывать этот интерфейс. И ответ на оба вопроса таков: это зависит от Обязанности классов, от того, предназначен ли он для реализации, и, возможно, других решений .

Я мог бы дать лучший ответ, если бы знал, для чего предназначен каждый класс и какие у него есть методы.

РЕДАКТИРОВАТЬ после обновления кода

Я вижу несколько проблем здесь:

  • Почему вы называете класс … Модуль ? Я не думаю, что это модуль, а обычный класс. Его ответственность - шифрование вещей. Я бы скорее назвал это Encryption (имена очень важны для меня, они скажут мне, для чего этот класс, даже если я сконцентрируюсь на чем-то другом - что обычно имеет место, когда я использую класс)
  • Как Карлос правильно указывает в комментарии к вашему вопросу Шифрование! = Хеширование и Шифрование по определению являются обратимыми, тогда как хеширование - нет, два класса не должны расширять друг друга.
  • Какова цель функции setup()? Я думаю, что вы добавили эту функцию, потому что заметили, что некоторым подклассам она нужна для ее реализации. Вопрос, скорее, должен звучать так: все ли функции шифрования имеют процедуру настройки? Это обязательно? Я так не думаю.
  • Другая проблема, с которой вы столкнулись, заключается в том, что вы хотите, чтобы некоторые из ваших процедур шифрования использовали соль, тогда как другим, похоже, она не нужна. Так как соль обычно не используется повторно (т. Е. У вас обычно есть новая соль для каждого шифрования), он не должен быть членом класса, в противном случае ваш класс имеет состояние , которое не то, что вы хотите (то есть $encryption больше не может encrypt() 2 строки подряд, необходимо изменить состояние - необходимо вызвать setSalt() - чтобы иметь возможность шифровать вторую строку).
  • Но реальный вопрос: для чего вам нужна эта структура классов? Для тестирования / демонстрации различных алгоритмов или для хранения / проверки паролей? Если вы просто хотите внедрить проверку пароля, вы чрезмерно работаете, вы можете использовать что-то вроде этого:
    class User {
        public function encryptPassword($password, $salt) {
            // …
        }
        public function verifyPassword($password, $salt, $encryptedPassword);
            return $encryptedPassword == self::encryptPassword($password, $salt);
        }
    }
    
0 голосов
/ 13 сентября 2011

Это зависит от других классов, которые наследуются от GeneralOneWayHashingModule, если все они реализуют интерфейс EncryptionModule, тогда GeneralOneWayHashingModule должен "реализовать" его тоже.

И, кстати, еслиGeneralOneWayHashingModule "реализует" EncryptionModule, затем BCryptHashingModule также "реализует" его, потому что он наследует его (ключевое слово "extends").

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