Мартин определяет ответственность как причину изменения и заключает, что классы должны иметь одну и только одну причину для изменений. Например, представьте себе класс, который составляет и печатает отчёт.
Такой класс может измениться по двум причинам:
- может измениться само содержимое отчёта
- может измениться формат отчёта.SRP говорит, что в таком случае нужно разделить класс на два новых класса, для которых будет характерна только одна ответственность.
Ориентация на "интерфейс" позволяет писать код, с заменяемыми частями
Ориентация на "интерфейс" приучает не делать "сильную связность" в коде
// тут псевдо-код
var IStorage = {
setData('key', value),
getData('key')
};
var lsStorage = {
setData: (key, value) => window.localStorage.setItem(key, value),
getData: (key) => window.localStorage.getItem(key)
}
(function(window, storage) {
// ....
var data = storage.getData('calendarData');
storage.setData('calendarData', {});
})(window, lsStorage);
var sStorage = {
setData: (key, value) => window.sessionStorage.setItem(key, value),
getData: (key) =>window.sessionStorage.getItem(key)
}
(function(window, storage) {
// ....
var data = storage.getData('calendarData');
storage.setData('calendarData', {});
})(window, sStorage);
(function() {
// тут код модуля
// то, что нужно скрыть остается в замыкании
// и недоступно снаружи
})();
(function(global) {
// теперь код может работать в любом окружении
})(window);
(function(global, dependencyInterface1, dependencyInterface2) {
// теперь код может работать в любом окружении
// c любыми реализациями интерфейса
})(window, implementation1, implementation2);
(function(global, dependencyInterface1, dependencyInterface2, undefined) {
// теперь код может работать в любом окружении
// c любыми реализациями интерфейса
})(window, implementation1, implementation2);
Совокупность всех переменных определяющих "состояние" приложения - какие данные отображаются, какие действия можно сделать.
Единый указатель ресурса (англ. Uniform Resource Locator, URL) — единообразный локатор (определитель местонахождения) ресурса.
Ранее назывался Universal Resource Locator — универсальный указатель ресурса. URL служит стандартизированным способом записи адреса ресурса в сети Интернет.
scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]
http://forum.onliner.by/viewtopic.php?t=1425824#p18162130
location.href
.back / .forward / .go
.pushState / .replaceState
document.body.addEventListener('click', (ev) => {
if(!ev.target.matches('a')) { // <--
return;
}
ev.preventDefault();
let url = ev.target.getAttribute('href');
history.pushState({}, url, url); // <--
});
window.onhashchange / "hashchange" event
window.location.href
document.body.addEventListener('click', (ev) => {
if(!ev.target.matches('a')) {
return;
}
ev.preventDefault();
let url = ev.target.getAttribute('href');
window.location.hash = url;
});
var counter = document.querySelector('#counter');
var content = document.querySelector('#content');
setInterval(() => counter.innerText = new Date(), 1000);
function handleUrl(url) {
document.querySelectorAll('a.active').forEach(el => el.classList.remove('active'));
document.querySelectorAll('a[href="' + url.split('#').pop() + '"]').forEach(el => el.classList.add('active'));
content.innerHTML = url;
}
window.addEventListener('hashchange', (ev) => handleUrl(ev.newURL));
handleUrl(window.location.href);
document.body.addEventListener('click', (ev) => {
if(!ev.target.matches('a')) {
return;
}
ev.preventDefault();
// При клике по ссылке - обновлять URL
let url = ev.target.getAttribute('href');
window.location.hash = url;
});
var counter = document.querySelector('#counter');
var content = document.querySelector('#content');
setInterval(() => counter.innerText = new Date(), 1000);
// Создать обработчик URL
function handleUrl(url) {
document.querySelectorAll('a.active').forEach(el => el.classList.remove('active'));
document.querySelectorAll('a[href="' + url.split('#').pop() + '"]').forEach(el => el.classList.add('active'));
content.innerHTML = url;
}
// Подписаться на изменения URL
window.addEventListener('hashchange', (ev) => handleUrl(ev.newURL));
// При загрузке страницы - считать состояние и запустить обработчик
handleUrl(window.location.href);
// Переопределить поведение внутренних ссылок
document.body.addEventListener('click', (ev) => {
if(!ev.target.matches('a')) {
return;
}
ev.preventDefault();
// При клике по ссылке - обновлять URL
let url = ev.target.getAttribute('href');
window.location.hash = url;
});