Автор Тема: Нарушен ли solid ?  (Прочитано 501 раз)

0 Пользователей и 1 Гость смотрят эту тему.

Оффлайн Micweb

  • Участник форума
  • Сообщений: 6
  • Карма: 0
Нарушен ли solid ?
« : Февраль 12, 2017, 12:50:24 »
Привет.

Есть например сущности предметной области Нож и Складной Нож.
Как вы думаете нужно спроектировать классы в этом случае?

    
class Knife{
      public function 
cut {/* режем */}
    }
    class 
PocketKnife extends Knife{
      private 
$opened 0// 0/1
      // ...
      
public function cut {
        if (
$this->opened) {
          
parent::cut();
        }
      }
    }

Нарушит ли это Принцип подстановки Барбары Лисков, или я неверно его понимаю ?
Ведь для объекта Knife постусловия после операции cut() например такие:
- лезвие стало менее острым чем было (изменение атрибута самого объекта)
- разрезаемый объект получил урон.

Но если подменять Knife на PocketKnife, и второй не раскрыт, то он и не разрежет ничего, т.е. он этих постусловий не даст, сузит получается, а в принципе сказано - "Постусловия не могут быть ослаблены в подклассе"

Оффлайн S.Voytovich

  • Литературная
  • Герой
  • *
  • Сообщений: 2992
  • Карма: 135
  • Любитель ZF-кубиков.
Re: Нарушен ли solid ?
« Ответ #1 : Февраль 16, 2017, 08:55:10 »
Может тогда класс Knife сделать интерфейсом, в котором есть cute()
а классы уже будут SimpleKnife и PocketKnife ???
РНР и ZF - это моё хобби, а не основная работа ;o)
Начал играть в кубики от Zend.

ZF-быстростарт

Оффлайн BladeOfSteel

  • Герой
  • *****
  • Сообщений: 840
  • Карма: 85
    • Заметки о вебдеве и не только
Re: Нарушен ли solid ?
« Ответ #2 : Март 18, 2017, 23:35:09 »
Нарушит ли это Принцип подстановки Барбары Лисков, или я неверно его понимаю ?

Да, нарушит. LSB гласит, что замена класса на его наследника не должна менять поведение.
Мои статьи о ZendFramework
Мой персональный блог
---
Не забываем ставить плюсик в карму помогавшим ;)