Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   тестовое задание (https://javascript.ru/forum/project/71383-testovoe-zadanie.html)

DynkanMaclaud 14.11.2017 19:34

тестовое задание
 
в общем имеются следующие условия:
http://jsbin.com/ladobefoji/edit?js,output

сделал вот так :
https://jsfiddle.net/t73w9obn/1/


по поводу сохранения данных на сервер не пойму что они от меня тут хотят...

Rasy 14.11.2017 22:10

DynkanMaclaud,
Uncaught TypeError: Cannot read property 'push' of undefined (index):138

В примере запись можно сохранять, изменять и удалять.

Цитата:

Сообщение от DynkanMaclaud
по поводу сохранения данных на сервер не пойму что они от меня тут хотят...

Возможно собирать введенный текст и сохранять в объекте.
Объект сериализовать и отдавать на сервер через протокол http, аяксом.

DynkanMaclaud 15.11.2017 01:17

Rasy,
изменил ссылку на рабочий пример...

Alexandroppolus 15.11.2017 12:19

DynkanMaclaud,

у тебя класс Notes сочетает в себе и модель, и вьюху. По сути, наследуется от модели.

Возможно, правильнее было бы оставить модель отдельно, и, например, передавать её в конструктор вьюхи, или ещё как-то.

В самой модели предусмотреть асинхронный интерфейс (для взаимодействия с сервером). В идеале - модель должна быть EventEmitter, тогда вьюха просто сможет на неё подписываться и обновляться. При таком раскладе всякие прочие компоненты смогут тоже работать с моделью, а не с вьюхой.

В общем, как-то так.

DynkanMaclaud 15.11.2017 12:36

Alexandroppolus,
т.е предлагаешь паттерн observeble (обозреватель) впилить ??

Alexandroppolus 15.11.2017 12:46

DynkanMaclaud,
ну это если совсем правильно делать :) повторюсь - это чтобы другие компоненты страницы могли с твоим компонентом работать, если вдруг такой кейс понадобится.

по рендеру - наверно, для обработки событий правильнее будет использовать делегирование, а конкретно вот такой подход: https://learn.javascript.ru/behavior - т.е. вешать один обработчик конкретного типа события на родительский элемент, смотреть target, ну и т.д. Чтобы при каждом обновлении обработчики не ставить на отдельные элементы.

destus 15.11.2017 12:50

DynkanMaclaud,
Работа с localStorage и JSON.parse без try...catch. Поправьте, пока никто не поранился.

Rasy 15.11.2017 14:31

Имхо, если предусмотрено общение с сервером, то локальное хранилище лишнее:)

DynkanMaclaud 15.11.2017 19:08

destus,
можно пример того как вызов JSON.parse именно в этом коде, может выдать ошибку ... ? другими словами что пользователь может написать что код не отработает... ?)

DynkanMaclaud 15.11.2017 19:09

Alexandroppolus,
запилил обозреватель...
https://jsfiddle.net/t73w9obn/2/

destus 15.11.2017 19:44

Цитата:

Сообщение от DynkanMaclaud (Сообщение 470231)
destus,
можно пример того как вызов JSON.parse именно в этом коде, может выдать ошибку ... ? другими словами что пользователь может написать что код не отработает... ?)

Он может банально через инструменты разработчика изменить сохраненный json и сделать его невалидным.

DynkanMaclaud 15.11.2017 23:35

destus,
и многих вы рядовых пользователей знаете которые через инструменты разработчиков правят json ???)))))

destus,
ничего не имею против, хочется увидеть именно сногсбивающую аргументацию...)))

DynkanMaclaud 15.11.2017 23:53

destus,
касательно архитектуры что скажите?? господа вам не кажется что когда в задании вас просят

Задача: отрефактировать код без использования сторонних библиотек.
Исправить баги, улучшить качество, maintainability, читабельность.
CSS писать не нужно.

Должен получится независимый компонент,
легко встраиваемый в любую вёрстку и не ломающий окружение.
Возможно в будущем захочется сохранять данные на сервер
и как-то ещё расширять возможности компонента.

и тут я юзаю паттерн, паттерн который например использовался на моей работе как взаимодействие компонентов... да это сейчас он маштабируем а когда 20 компонентов взаимодействует между собой, он не поддерживаем...

DynkanMaclaud 15.11.2017 23:55

ну а кто мне минус кармы дал то отпишите аргументы...

destus 16.11.2017 10:05

Цитата:

и многих вы рядовых пользователей знаете которые через инструменты разработчиков правят json ???)))))
Смысл в том, что нужно предусмотреть все возможные ситуации, и грамотно их обрабатывать. Это может быть json с нашего сервера, со стороннего апи. Не важно. Что более важно, так это написать гибкое приложение, которое будет обрабатывать по-возможности все возможные ошибки и грамотно на них реагировать. JSON.parse, как и обращение к localStorage всегда с try...catch.
Цитата:

касательно архитектуры что скажите??
Далее, у вас не получился компонент как таковой.
Во-первых, он наследуется от модели, что является очень плохим решением.
Во-вторых, компонент должен получать кусок состояния через биндинги сверху и отрисовывать UI. Это если мы говорим о stateless компонентах. Для statefull - источником данных могут быть сервисы. Под капотом взаимодействие с DOM событиями, но опять же, компонент сам не меняет состояние. Нужно либо генерировать событие и просить это сделать внешний код (EventEmitter), либо просить это сделать сервисы, складывая всю ответственность на них.
Ну и в-третьих, в коде есть баги. Если, например, открыть несколько записей для редактирования, и нажать Save / Remove по любой из них, то все открытые записи выйдут из режима редактирования.

Nexus 16.11.2017 10:12

Цитата:

Сообщение от destus
как и обращение к localStorage всегда с try...catch

Можете объяснить почему?
Если обернуть взаимодействие с localStorage в класс, который будет проверять доступно ли оно или нет и преобразовывать все данные в строку перед записью, то есть ли смысл оборачивать localStorage во wrapper'е в try catch?

destus 16.11.2017 10:27

Nexus,
https://developer.mozilla.org/en-US/...eb_Storage_API
пункт "Testing for availability".
Цитата:

Если обернуть взаимодействие с localStorage в класс
скорее в функцию, которая проверяет доступность хранилища.

Nexus 16.11.2017 11:28

destus,
Цитата:

Сообщение от destus
пункт "Testing for availability".

благодарю за информацию.
Цитата:

Сообщение от destus
скорее в функцию, которая проверяет доступность хранилища

Можно, конечно, в коде постоянно проверять доступно ли хранилище, но, по-моему, удобнее реализовать класс.

destus 16.11.2017 12:11

Nexus,
Можете и через класс, но просто проверить доступно оно или нет, этого мало. Установка нового значения может упереться в отсутствие памяти и выбросом исключения QuotaExceededError https://www.w3.org/TR/webstorage/#storage

Nexus 16.11.2017 12:30

destus, я понял, что доступность хранилища не гарантирует корректного с ним взаимодействия.

DynkanMaclaud 16.11.2017 13:04

Цитата:

Сообщение от destus
Во-первых, он наследуется от модели, что является очень плохим решением.

Почему наследуется?, Notes не имеет методов Storage, в конструкторе Notes я создаю Storage (да правильнее было бы передавать его как аргумент), и прокидываю туда Notes, т.е модель при инициализации подписываает View на события, а view триггерит эти события, которые улавливает Storage...

DynkanMaclaud 16.11.2017 13:06

destus,
не могли бы вы показать мне какой нибудь простой пример, именнно то как вы видите компонент

DynkanMaclaud 17.11.2017 01:53

Rise,
как такой вариант ? https://jsfiddle.net/yaepa0u2/7/
что насчет делегирования скажите?? стоит ли делать? неудобно будет сохранять индекс элемента в атрибуте ... потом через e.target , получать а далее в storage.remove ... и т.п, в данном случае из замыкания достает...

Vlasenko Fedor 17.11.2017 12:48

Плохо
Разные стили function Storage, class Notes
this.data = load() ? load() : [];

зачем дважды выполнять load(), если он вернет результат
var storageEnable = (function () {
        var state = false;
        try {
            window.localStorage.setItem('test', 'a');
            state = window.localStorage.getItem('test') === 'a';
            window.localStorage.removeItem('test');
        } catch (err) {
            console.log('Local storage disable');
        }
        return state;
    }()); // утка если крякает

this.remove :stop:
splice
this.set очень интересно. здесь либо this возвращать, для использования в дальнейшем цепочки вызовов или присваиваемое значение для плюшек в синтаксисе
если несколько раз используете document.createElement
то можно для создания написать функцию
<script>
function buildElement(tagName, props) {
  var element = document.createElement(tagName);
  for (var propName in props) element[propName] = props[propName];
  return element;
}

document.addEventListener("DOMContentLoaded", function() {
  var btn = buildElement('input', {
    type: 'button',
    value: 'Delete',
    style: 'background-color: red'
  });
  document.body.appendChild(btn);
});
</script>

и наверное лучше было раз создать, а затем по необходимости клонировать эти элементы


Часовой пояс GMT +3, время: 07:28.