… DIP или “Принцип инверсии зависимостей”
Этот принцип гласит:
-
Высокоуровневые модули не должны зависеть от низкоуровневых. Оба вида должны зависеть от абстракций.
-
Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
Сначала это может быть трудным для понимания, но если вы работали с PHP-фреймворками (вроде Symfony), то уже встречались с реализацией этого принципа в виде инъекции зависимости (Dependency Injection, DI).
Однако эти принципы не идентичны, DI ограждает высокоуровневые модули от деталей своих низкоуровневых модулей и их настройки. Это может быть сделано посредством DI. Огромное преимущество в том, что снижается сцепление (coupling) между модулями. Сцепление — очень плохой шаблон разработки, затрудняющий рефакторинг кода.
Плохой пример
class Worker { public function work() { // ....working } } class Manager { /** @var Worker $worker **/ private $worker; public function __construct(Worker $worker) { $this->worker = $worker; } public function manage() { $this->worker->work(); } } class SuperWorker extends Worker { public function work() { //.... working much more } }
Хороший пример
interface WorkerInterface { public function work(); } class Worker implements WorkerInterface { public function work() { // ....working } } class SuperWorker implements WorkerInterface { public function work() { //.... working much more } } class Manager { /** @var Worker $worker **/ private $worker; public function __construct(WorkerInterface $worker) { $this->worker = $worker; } public function manage() { $this->worker->work(); } }
см. также видео Немчинского:
(function(){
var data = {
«addon_key»:»net.veniture.confluence.cloud.macrosuite»,
«uniqueKey»:»net.veniture.confluence.cloud.macrosuite__easy-html-macro6212376729179584161″,
«key»:»easy-html-macro»,
«moduleType»:»dynamicContentMacros», «moduleLocation»:»content», «cp»:»/wiki»,
«general»:»»,
«w»:»100%»,
«h»:»100%»,
«url»:»https://macrosuite.cloud.veniture.net/html?macroId=25fd08e4-36a3-443a-803f-222b2833cc5f&pageId=168657042&pageVersion=3&xdm_e=https%3A%2F%2Fmishaikon.atlassian.net&xdm_c=channel-net.veniture.confluence.cloud.macrosuite__easy-html-macro6212376729179584161&cp=%2Fwiki&xdm_deprecated_addon_key_do_not_use=net.veniture.confluence.cloud.macrosuite&lic=none&cv=1.1054.0&jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI1YmIzNGM2ODU5ZDg4MTEzYTM3MzkyZWYiLCJxc2giOiJkNzFmZmVjY2U2NGE2NmFhNzUzOGIzN2E1ODQ3NTM3ODQ3YzU4ODNhMjkzNmZlOWIzMGZjOGQxNmJiMDgzZmU2IiwiaXNzIjoiOWU3NWMxNmEtNmFkYi0zZDVkLTk2ZjgtZDJjY2E2ZDQ5ZDAwIiwiY29udGV4dCI6e30sImV4cCI6MTYzMDQxNTA3NywiaWF0IjoxNjMwNDE0ODk3fQ.yB2QlPVq2giVSx2KeeVv30bZKbk3Jm4MpIsnS7i3_to»,
«contextJwt»: «eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI1YmIzNGM2ODU5ZDg4MTEzYTM3MzkyZWYiLCJxc2giOiJjb250ZXh0LXFzaCIsImlzcyI6IjllNzVjMTZhLTZhZGItM2Q1ZC05NmY4LWQyY2NhNmQ0OWQwMCIsImNvbnRleHQiOnsiY29uZmx1ZW5jZSI6eyJtYWNybyI6eyJvdXRwdXRUeXBlIjoiZW1haWwiLCJoYXNoIjoiMjVmZDA4ZTQtMzZhMy00NDNhLTgwM2YtMjIyYjI4MzNjYzVmIiwiaWQiOiIyNWZkMDhlNC0zNmEzLTQ0M2EtODAzZi0yMjJiMjgzM2NjNWYifSwiY29udGVudCI6eyJ0eXBlIjoicGFnZSIsInZlcnNpb24iOiIzIiwiaWQiOiIxNjg2NTcwNDIifSwic3BhY2UiOnsia2V5IjoiV0lLSSIsImlkIjoiODIyNDc5NCJ9fX0sImV4cCI6MTYzMDQxNTc5NywiaWF0IjoxNjMwNDE0ODk3fQ.OhE1kxGzRgFNJLdrPOtdJOymrDy84AOCV_b3YZ7Vl9E», «structuredContext»: «{»confluence»:{»macro»:{»outputType»:»email»,»hash»:»25fd08e4-36a3-443a-803f-222b2833cc5f»,»id»:»25fd08e4-36a3-443a-803f-222b2833cc5f»},»content»:{»type»:»page»,»version»:»3»,»id»:»168657042»},»space»:{»key»:»WIKI»,»id»:»8224794»}}}»,
«contentClassifier»:»content»,
«productCtx»:»{»page.id»:»168657042»,»macro.hash»:»25fd08e4-36a3-443a-803f-222b2833cc5f»,»space.key»:»WIKI»,»user.id»:»5bb34c6859d88113a37392ef»,»page.type»:»page»,»content.version»:»3»,»page.title»:»(D) Dependency Inversion Principle»,»macro.localId»:»0c6d5b41-31ab-4a18-b491-c043d80dab3e»,»macro.body»:»»,»: = | RAW | = :»:»theme={\»label\»:\»solarized_dark\»,\»value\»:\»solarized_dark\»}|contentByMode={\»html\»:\»u003ciframe width=\\\»560\\\» height=\\\»315\\\» src=\\\»https://www.youtube.com/embed/Bw6RvCSsETI\\\» 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/Bw6RvCSsETI\\\» 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»:»3»,»user.key»:»8a7f808a78f05f9f0178f48910920162»,»content.id»:»168657042»,»macro.id»:»25fd08e4-36a3-443a-803f-222b2833cc5f»,»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);
});
}
}());
Нет комментариев