… ISP или “Принцип разделения интерфейса“

Согласно ISP, «Клиенты не должны зависеть от интерфейсов, которые не используют».

Хороший пример демонстрации принципа: классы, для которых требуются большие объекты настроек (settings objects). Рекомендуется не требовать от клиентов настраивать много параметров, потому что по большей части они им не нужны. Если сделать их опциональными, то это поможет избежать раздутости интерфейса. (1)

Плохой пример

interface WorkerInterface {
    public function work();
    public function eat();
}

class Worker implements WorkerInterface {
    public function work() {
        // ....working
    }
    public function eat() {
        // ...... eating in launch break
    }
}

class SuperWorker implements WorkerInterface {
    public function work() {
        //.... working much more
    }

    public function eat() {
        //.... eating in launch break
    }
}

class Manager {
  /** @var WorkerInterface $worker **/
  private $worker;

  public function setWorker(WorkerInterface $worker) {
        $this->worker = $worker;
    }

    public function manage() {
        $this->worker->work();
    }
}

Хороший пример

interface WorkerInterface extends FeedableInterface, WorkableInterface {
}

interface WorkableInterface {
    public function work();
}

interface FeedableInterface {
    public function eat();
}

class Worker implements WorkableInterface, FeedableInterface {
    public function work() {
        // ....working
    }

    public function eat() {
        //.... eating in launch break
    }
}

class Robot implements WorkableInterface {
    public function work() {
        // ....working
    }
}

class SuperWorker implements WorkerInterface  {
    public function work() {
        //.... working much more
    }

    public function eat() {
        //.... eating in launch break
    }
}

class Manager {
  /** @var $worker WorkableInterface **/
    private $worker;

    public function setWorker(WorkableInterface $w) {
      $this->worker = $w;
    }

    public function manage() {
        $this->worker->work();
    }
}

(звезда) см. также видео Немчинского (2):

(function(){
var data = {
«addon_key»:»net.veniture.confluence.cloud.macrosuite»,
«uniqueKey»:»net.veniture.confluence.cloud.macrosuite__easy-html-macro6402586033902834943″,
«key»:»easy-html-macro»,
«moduleType»:»dynamicContentMacros», «moduleLocation»:»content», «cp»:»/wiki»,
«general»:»»,
«w»:»100%»,
«h»:»100%»,
«url»:»https://macrosuite.cloud.veniture.net/html?macroId=a2c11731-465c-46b2-b554-61904333f822&pageId=168591543&pageVersion=5&xdm_e=https%3A%2F%2Fmishaikon.atlassian.net&xdm_c=channel-net.veniture.confluence.cloud.macrosuite__easy-html-macro6402586033902834943&cp=%2Fwiki&xdm_deprecated_addon_key_do_not_use=net.veniture.confluence.cloud.macrosuite&lic=none&cv=1.1054.0&jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI1YmIzNGM2ODU5ZDg4MTEzYTM3MzkyZWYiLCJxc2giOiJmYzNiMjFiNTkxMWRlZmFhMmE2NTU4MGU3MWYwN2ZjNGIwZDYzMWVjZjA1MWM3ZTg4NTcwN2Q2NWUzNzczMDljIiwiaXNzIjoiOWU3NWMxNmEtNmFkYi0zZDVkLTk2ZjgtZDJjY2E2ZDQ5ZDAwIiwiY29udGV4dCI6e30sImV4cCI6MTYzMDQxNTEzNywiaWF0IjoxNjMwNDE0OTU3fQ.w5zQZTGisb2otak6gx342ou3CGgmvRLA—5plaVm5I8″,
«contextJwt»: «eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI1YmIzNGM2ODU5ZDg4MTEzYTM3MzkyZWYiLCJxc2giOiJjb250ZXh0LXFzaCIsImlzcyI6IjllNzVjMTZhLTZhZGItM2Q1ZC05NmY4LWQyY2NhNmQ0OWQwMCIsImNvbnRleHQiOnsiY29uZmx1ZW5jZSI6eyJtYWNybyI6eyJvdXRwdXRUeXBlIjoiZW1haWwiLCJoYXNoIjoiYTJjMTE3MzEtNDY1Yy00NmIyLWI1NTQtNjE5MDQzMzNmODIyIiwiaWQiOiJhMmMxMTczMS00NjVjLTQ2YjItYjU1NC02MTkwNDMzM2Y4MjIifSwiY29udGVudCI6eyJ0eXBlIjoicGFnZSIsInZlcnNpb24iOiI1IiwiaWQiOiIxNjg1OTE1NDMifSwic3BhY2UiOnsia2V5IjoiV0lLSSIsImlkIjoiODIyNDc5NCJ9fX0sImV4cCI6MTYzMDQxNTg1NywiaWF0IjoxNjMwNDE0OTU3fQ.8gOfHLG_f0gVNSjS3gL0YdZoFJE5OYh0G86X0wIjuzQ», «structuredContext»: «{»confluence»:{»macro»:{»outputType»:»email»,»hash»:»a2c11731-465c-46b2-b554-61904333f822»,»id»:»a2c11731-465c-46b2-b554-61904333f822»},»content»:{»type»:»page»,»version»:»5»,»id»:»168591543»},»space»:{»key»:»WIKI»,»id»:»8224794»}}}»,
«contentClassifier»:»content»,
«productCtx»:»{»page.id»:»168591543»,»macro.hash»:»a2c11731-465c-46b2-b554-61904333f822»,»space.key»:»WIKI»,»user.id»:»5bb34c6859d88113a37392ef»,»page.type»:»page»,»content.version»:»5»,»page.title»:»(I) Interface Segregation Principle»,»macro.localId»:»a33e14db-13e3-421d-be44-c1a9a607df0c»,»macro.body»:»»,»: = | RAW | = :»:»theme={\»label\»:\»solarized_dark\»,\»value\»:\»solarized_dark\»}|contentByMode={\»html\»:\»u003ciframe width=\\\»560\\\» height=\\\»315\\\» src=\\\»https://www.youtube.com/embed/d9RJqf2o_Sw\\\» title=\\\»YouTube video player\\\» frameborder=\\\»0\\\» allow=\\\»accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\\\» allowfullscreenu003eu003c/iframeu003e\»,\»javascript\»:\»\»,\»css\»:\»\»}»,»space.id»:»8224794»,»contentByMode»:»{\»html\»:\»u003ciframe width=\\\»560\\\» height=\\\»315\\\» src=\\\»https://www.youtube.com/embed/d9RJqf2o_Sw\\\» title=\\\»YouTube video player\\\» frameborder=\\\»0\\\» allow=\\\»accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\\\» allowfullscreenu003eu003c/iframeu003e\»,\»javascript\»:\»\»,\»css\»:\»\»}»,»macro.truncated»:»false»,»content.type»:»page»,»output.type»:»email»,»page.version»:»5»,»user.key»:»8a7f808a78f05f9f0178f48910920162»,»content.id»:»168591543»,»macro.id»:»a2c11731-465c-46b2-b554-61904333f822»,»theme»:»{\»label\»:\»solarized_dark\»,\»value\»:\»solarized_dark\»}»}»,
«timeZone»:»Europe/Moscow»,
«origin»:»https://macrosuite.cloud.veniture.net»,
«hostOrigin»:»https://mishaikon.atlassian.net»,
«sandbox»:»allow-downloads allow-forms allow-modals allow-popups allow-scripts allow-same-origin allow-top-navigation-by-user-activation allow-storage-access-by-user-activation», «pearApp»:»true», «apiMigrations»: {
«gdpr»: true
}
}
;
if(window.AP && window.AP.subCreate) {
window._AP.appendConnectAddon(data);
} else {
require([‘ac/create’], function(create){
create.appendConnectAddon(data);
});
}
}());


Источники

(1) https://habr.com/ru/company/mailru/blog/336788/

(2) https://youtu.be/d9RJqf2o_Sw

Tags

Нет комментариев

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.