All streams
Search
Write a publication
Pull to refresh
0
0
SowingSadness @SowingSadness

User

Send message
www.itu.dk/courses/VOP/E2005/VOP2005E/8_mvc_krasner_and_pope.pdf
К тому же нужно разобраться в терминах, что есть шаблон. а что есть парадигма.
Но так как вы выделили, что:
что аббревиатурой MVC обычно понимают целое семейство паттернов

уже говорит о том что вы подразумеваете парадигму.
MVC, это не паттерн — это парадигма.
При MVC пользователь взаимодействует с Controller а не со View
Где косяки браузера то?
Да, не совсем удачное решение с кнопкой назад, но блин, браузер страницы открывает отлично.
Чем вам не угодил IE на WP?
За YouTube можете сказать спасибо корпорации «добра». Они заблокировали самое лучшее приложение Youtube как было вообще за всю время на любой из платформы на Windows Phone. Любые попытка MS договориться были отклонены.
Не связано, потому что об этом в самой парадигме не говорится.

p.s.
извините за некрокомментинг :)
etyumentcev прав. Советую почитать автора принципа Б.Мэйера. Книжку ниже я вам уже посоветовал.
Простите меня, но где вы тут увидели нарушение OCP?
По одному методу то, когда принцип касается правила использования классов.
class A
{
     protected $data;
     public function add($item)
     {
        $this->data[] = $item;
     }
}

class B extends A
{
     public function add($item)
     {
        if ($item < 52) {
           throw new Exception("Итем не может быть меньше 52");
        }
        $this->data[] = $item;
     }
}

Вот тут идет нарушение. Класс наследник в методе add бросает исключение, которое не бросает класс родитель. Это нарушение LSP.

Вообще SOLID стараются как можно больше перенести в язык(на сколько это возможно), т.к тогда можно контролировать на уровне компилятора(интерпретатора). Но естественно, это не всегда возможно.
Чуть выше, случайно умудрился ответить :)
Где вы этого бреда нахватались. Что ещё за пост-условие контракта?
В контракте у вас описано, что возвращается итератор. Он как возвращался, так и возвращается. Беда PHP в том что списки и словари объединены, но это отдельная тема. У вас же концептуальное не понимание, что такое свойство контракта.
Контракт это не мифические вещи, которые программист придумал и описал в юнит-тесте, как ему вздумалось, а условия переданные путем языковых конструкций.

Если грубо, то при замене класса его наследником программа должна дальше работать без ошибок. Либо выбрасывать ошибки такого же типа, что кидала и с родительским классом. Всё остальное — это не понимание LSP.

Советую почитать Б.Мэйера «Объектно-ориентированное конструирование программных систем»
В том виде, в котором написано — да.
Подставьте вместо DataCollector AnotherDataCollector, поведение программы не изменится. Изменится результат.

Вопрос, что результат будет вас не удовлетворять — лежит совершенно в другой плоскости.
Забыл про тип возвращаемого значения. Тип возвращаемого значения должен быть такой же как и тип перегружаемого метода.
Если бы я создал класс, такой как пример ниже, то что-то принципиально бы изменилось?

Да, тут явно видны две ошибки.
1. Нарушен Принцип единственной обязанности (класс изменяет объект и что-то вычисляет, используя его как параметр)
2. Нельзя менять входящие параметры в методе.
Дело не в правильности или неправильности вычисления площади квадрата, дело в замене поведения методов класса
Принцип гласит — «Объекты в программе могут быть заменены их наследниками без изменения свойств программы»

Принцип гласит:
Пусть q(x) является свойством, верным относительно объектов x некоторого типа T. Тогда q(y) также должно быть верным для объектов y типа S, где S является подтипом типа T.

То что вы понимаете под свойством им не является. Поведение методов не изменено. Оно изменено в следующих случаях, при перегрузке:
— бросает исключение, которые не бросает перегружаемый метод
— количество обязательных параметров контракта методов изменен
— тип обязательных параметров не соответствует типу перегруженного метода

Извините, но вы не понимаете LSP
Далее, пройдемся по коду:
Функция обрезки:

Что это за ананизм, мы JavaScript не знаем?
es5.javascript.ru/x15.5.html#x15.5.4.20

функция utf8_decode

Я боюсь вас удивить, но то что вы написали укладывается в 1 строчку:
function utf8_decode(s) {
  return decodeURIComponent(escape(s));
}


if(window.location.href.indexOf('vk.com')>1)

ЗАЧЕМ?! Вы же в манифесте всё описали:
developer.chrome.com/extensions/content_scripts

Что это делает на Хабре?!
Чему может обучить данная статья:
— как правильно оформлять расширения?
— как правильно структурировать JS расширения?
— «красивый» JS код?

Вы уверены, что он сохранит мой SSD диск и позволит не выделять всё место на диске, для данных, которые хранятся в облаке, как в OneDrive?
calculateRectangleSquare(new Square, 4, 5); // 25 ???

Ваш пример абсолютно не показал нарушения LSP. Ваш объект Square успешно используется и более того, он вычисляется правильно.
Дальше, почему вы используете функцию, которая изменяет объект, а потом вычисляет некоторое значение? Это вообще не попадает не под одну парадигму, ни под функциональную ни под Объектно ориентированную.
И если мы уж говорим о ООП, то давайте не смешивать два подхода и удивляться, что что-то пошло не так, по вашему мнению
К чему я веду, да к тому что принцип подстановки Барбары Лисков не раскрыт чуть больше чем полностью. Вы говорите вообще не о том. Весь принцип сводится к интерфейсу класса.

P.S.
По поводу сеттеров, я бы советовал поменьше их использовать в принципе, если все свойства объекта имеют сеттеры, то скорее всего это не должно быть объектом, а должно быть набором данных, которые используются для создания объектов. Т.к. если можно менять всё, то о какой бизнес-логике можно вести речь?

class Rectangle
{
    protected $width;
    protected $height;

    public function __construct($width, $height ) {
        $this->width = $width;
        $this->height = $height;
    }

    public function getWidth()
    {
        return $this->width;
    }

    public function getHeight()
    {
        return $this->height;
    }

    public function calculateSquare()
    {
       return $this->height * $this->width;
    }
}

class Square extends Rectangle
{
    public function __construct($size) {
        parent::__construct($size, $size);
    }
}


class TwoPointsData
{
     private $width;
     private $height;

     public function getWidth() 
     { 
        return $this->width; 
     }

     public function setWidth($width) 
     { 
        $this->width = $width; 
     }

     public function getHeight() 
     { 
        return $this->height; 
     }

     public function setHeight($height) 
     { 
        $this->height = $height; 
     }
}

class Rectangle 
{
    public function __construct(TwoPointsData $data) 
    {
        ...
    }

    public function calculateSquare()
    {
       return $this->height * $this->width;
    }
}

class Square extends Rectangle
{
    public function __construct(TwoPointsData $data) 
    {
        ...
    }
}

Information

Rating
Does not participate
Location
Казань, Татарстан, Россия
Registered
Activity