Левшин Михаил#18
Conversation
|
🍏 Пройдено тестов 19 из 19 |
|
@chipolinka обрати внимание решено доп. задание |
robbery.js
Outdated
| * @param {String} workingHours.to – Время закрытия, например, "18:00+5" | ||
| * @returns {Object} | ||
| */ | ||
| var daysDict = { 'ПН': 0, 'ВТ': 1, 'СР': 2 }; |
There was a problem hiding this comment.
это константа? посмотри, как в гайде рекомендуют называть константы.
There was a problem hiding this comment.
Да Это по сути константа. Исправлю
robbery.js
Outdated
| * @returns {Object} | ||
| */ | ||
| var daysDict = { 'ПН': 0, 'ВТ': 1, 'СР': 2 }; | ||
| var daysArray = ['ПН', 'ВТ', 'СР']; |
There was a problem hiding this comment.
зачем тебе этот массив? можно просто взять ключи словаря)
There was a problem hiding this comment.
Для читаемости кода. daysDict.keys()[i] хуже чем daysArray[i]
There was a problem hiding this comment.
по-моему, это не повод у всех словарей выделять ключи в массив) в конце концов, можешь уж список-то заново не создавать
robbery.js
Outdated
| }; | ||
|
|
||
| this.getNextDay = function () { | ||
| return new TimeInterval(this.start + 24 * 60, this.end + 24 * 60); |
robbery.js
Outdated
| return new TimeInterval(this.start + 24 * 60, this.end + 24 * 60); | ||
| }; | ||
|
|
||
| this.timeInInterval = function (time) { |
There was a problem hiding this comment.
в названии функции надо указывать, что она делает (то бишь глагол)
robbery.js
Outdated
| }; | ||
| } | ||
|
|
||
| function timeInIntervals(timeIntervalsArray, time) { |
| for (var i = 0; i < timeIntervalsArray.length; i++) { | ||
| if (timeIntervalsArray[i].timeInInterval(time)) { | ||
|
|
||
| return true; |
robbery.js
Outdated
| var day = 0; | ||
| if (daysDict[str.slice(0, 2)] !== undefined) { | ||
| day = daysDict[str.split(' ')[0]]; | ||
| str = str.split(' ')[1]; |
There was a problem hiding this comment.
str.split(' ') наверное стоит вынести в переменную, раз часто используется
robbery.js
Outdated
| var h = parseInt(str.split(':')[0]); | ||
| var m = parseInt(str.split(':')[1]); | ||
|
|
||
| return day * 24 * 60 + (h - timezone) * 60 + m; |
robbery.js
Outdated
| var timezone = parseInt(str.split('+')[1]); | ||
| str = str.split('+')[0]; | ||
| var h = parseInt(str.split(':')[0]); | ||
| var m = parseInt(str.split(':')[1]); |
There was a problem hiding this comment.
по-моему, это не самое подходящее название переменной. мало ли чего там m может быть?) да и h тоже
robbery.js
Outdated
| }); | ||
| }); | ||
| newSchedule.Bank.push(new TimeInterval(strToIntDate(workingHours.from) + | ||
| bankTimezone * 60, strToIntDate(workingHours.to) + bankTimezone * 60)); |
There was a problem hiding this comment.
кажется, тут есть дублирование... и константы, конечно.
robbery.js
Outdated
| } | ||
| } | ||
|
|
||
| for (; i < 3 * 24 * 60; i++) { |
robbery.js
Outdated
| var i = 0; | ||
| function gangsterNotBusy(gangster) { | ||
| if (timeInIntervals(newSchedule[gangster], i)) { | ||
| goodTimeToHack = false; |
There was a problem hiding this comment.
goodTimeToHack = !timeInIntervals(newSchedule[gangster], i) ?
There was a problem hiding this comment.
В случае если время неподходит первому, но подходит второму и третьему, то значение переменной будет true. Что не совсем то что нужно.
robbery.js
Outdated
|
|
||
| var goodTimeToHack = true; | ||
| var i = 0; | ||
| function gangsterNotBusy(gangster) { |
robbery.js
Outdated
| function simplifyTimesIntervals() { | ||
| var newTimeIntervals = []; | ||
| goodTimesIntervals.forEach(function (timeInterval) { | ||
| if (!(timeInterval.getLength() < duration)) { |
There was a problem hiding this comment.
просто интересно: а почему не >=? а именно отрицание от <?
robbery.js
Outdated
| tryLater: function () { | ||
| if (this.exists()) { | ||
| var startInterval = goodTimesIntervals[0]; | ||
| if (goodTimesIntervals.length > 1 || startInterval.getLength() >= duration + 30) { |
There was a problem hiding this comment.
кажется, что это можно переписать в один if, ну или как-то более сокращенно
|
везде есть константы, которые надо вынести/переименовать. |
|
🍅 |
|
🍅 Не пройден линтинг или базовые тесты |
|
🍏 Пройдено тестов 19 из 19 |
|
@chipolinka обрати внимание решено доп. задание |
robbery.js
Outdated
| }; | ||
| } | ||
|
|
||
| function timeIsInIntervals(timeIntervalsArray, time) { |
There was a problem hiding this comment.
и аналогично во всех остальных местах)
robbery.js
Outdated
| }); | ||
| newSchedule.Bank.push(new TimeInterval( | ||
| strToIntDate(workingHours.from) + bankTimezone * MINUTES_IN_HOUR, | ||
| strToIntDate(workingHours.to) + bankTimezone * MINUTES_IN_HOUR)); |
There was a problem hiding this comment.
меня смущает, что у тебя 4 раза встречается строка
strToIntDate(something) + bankTimezone * MINUTES_IN_HOUR
это никак не сделать поизящнее?
имею в виду DRY
robbery.js
Outdated
|
|
||
| function createGoodTimesIntArray() { | ||
|
|
||
| var goodTimeToHack = true; |
There was a problem hiding this comment.
иногда отступы всплывают в самых неожиданных местах. не рекомендую их ставить после фигурных скобочек (не только здесь, но и во всём коде). тут же нечего отделять логически?
There was a problem hiding this comment.
а ещё название этой переменной предполагает, что в ней хранится время.
robbery.js
Outdated
|
|
||
| var goodTimeToHack = true; | ||
| var i = 0; | ||
| function gangsterIsNotBusy(gangster) { |
There was a problem hiding this comment.
название функции следует начинать с глагола
|
@chipolinka обрати внимание решено доп. задание |
|
🍏 Пройдено тестов 19 из 19 |
|
@chipolinka обрати внимание решено доп. задание |
robbery.js
Outdated
| var i = -1; | ||
| function isGangsterNotBusy(gangster) { | ||
| if (isTimeInIntervals(schedule[gangster], i)) { | ||
| isGoodTimeToHack = false; |
There was a problem hiding this comment.
можно сделать isGoodTimeToHack = !isTimeInIntervals(schedule[gangster], i)
There was a problem hiding this comment.
Сделать, то можно. Только это не совсем правильно(я уже писал почему). Даже базовые тесты перестают проходить.
robbery.js
Outdated
| } | ||
| } | ||
|
|
||
| while (i < DAYS_TO_HACK * MINUTES_IN_DAY) { |
There was a problem hiding this comment.
В данном while у тебя i не изменяется, кроме как увеличивается при каждой итерации? Почему бы тогда не сделать это циклом?
There was a problem hiding this comment.
функция isGangsterNotBusy использует внешние переменные, одной из которой является переменная i. А так как функции объявлять внутри цикла нельзя(lint), то следовательно нужно объявить эту переменную и функцию ее использующую заранее. Я вижу выход из этой ситуации созданием функции, которая возвращает другую функцию. Попробую это сделать.
There was a problem hiding this comment.
исправил даже изящнее чем сам предполагал)
robbery.js
Outdated
| if (!isTimeInIntervals(schedule.Bank, i)) { | ||
| continue; | ||
| } | ||
| gangsterNames.forEach(isGangsterNotBusy); |
There was a problem hiding this comment.
А зачем ты это вынес в отдельную функцию? У тебя она вынесена далеко от этого места, да и содержит в себе 1 строчку...
There was a problem hiding this comment.
В lint'е стоит ограничение, что нельзя создавать функции внутри цикла
robbery.js
Outdated
|
|
||
| function createScheduleWithTimeIntervals(bankWorkingHours, schedule, gangsterNames) { | ||
| var newSchedule = {}; | ||
| var bankShift = parseInt(bankWorkingHours.from.split('+')[1], 10) * MINUTES_IN_HOUR; |
There was a problem hiding this comment.
Очень сложная строка. И давай у тебя весь парсинг будет вынесен в одно место?
robbery.js
Outdated
| return goodTimesIntervals; | ||
| } | ||
|
|
||
| function createScheduleWithTimeIntervals(bankWorkingHours, schedule, gangsterNames) { |
There was a problem hiding this comment.
Эту функцию можно разбить на наполнение нового расписания гангстерами и банком. И объединить результат как раз в этой функции.
robbery.js
Outdated
| var gangsterNames = getGangsterNames(schedule); | ||
| var newSchedule = createScheduleWithTimeIntervals(workingHours, schedule, gangsterNames); | ||
| var goodTimesIntervals = getGoodTimeIntervals(newSchedule, gangsterNames); | ||
| goodTimesIntervals = simplifyTimesIntervals(goodTimesIntervals, duration); |
There was a problem hiding this comment.
Лучше создай новую переменную с соответствующим названием. А то не ясно, чем результат этой функции отличается от предыдущей. А так -- мне нравится организация кода 👍
| return template; | ||
| if (!this.exists()) { | ||
|
|
||
| return ''; |
| function getGangsterNames(schedule) { | ||
| var gangsterNames = []; | ||
| for (var gangsterName in schedule) { | ||
| if (schedule.hasOwnProperty(gangsterName)) { |
There was a problem hiding this comment.
Попробуй написать это как-то по-другому. Попроще :)
There was a problem hiding this comment.
Ну если честно я не знаю как. https://learn.javascript.ru/object-for-in смотрел тут. hasOwnProperty для lint'a
There was a problem hiding this comment.
| exports.isStar = true; | ||
|
|
||
| /** | ||
| * @param {Object} schedule – Расписание Банды |
There was a problem hiding this comment.
Но они же несут полезную информацию!
robbery.js
Outdated
| return false; | ||
| } | ||
|
|
||
| function strDateToInt(strDate) { |
There was a problem hiding this comment.
Если честно, на первый взгляд тут адище происходит. Слайсы не подойдут?
|
🍅 |
|
🍏 Пройдено тестов 19 из 19 |
|
@chipolinka обрати внимание решено доп. задание |
robbery.js
Outdated
| if (DAYS_INDEXES[strDateCopy.slice(0, 2)] === undefined) { | ||
| strDateCopy = 'ПН ' + strDateCopy; | ||
| } | ||
| var o = { |
robbery.js
Outdated
|
|
||
| function addOrChangeLastTimeInterval(arrayIntervals, timeToStartNewInterval) { | ||
| if (arrayIntervals.length === 0 || | ||
| arrayIntervals[arrayIntervals.length - 1].end !== timeToStartNewInterval - 1) { |
There was a problem hiding this comment.
В этой функции слишком часто используется arrayIntervals.length, лучше вынеси в отдельную переменную. Да и название покороче будет)
| var gangstersIsNotBusy = true; | ||
| gangsterNames.forEach(function (gangster) { | ||
| if (isTimeInIntervals(schedule[gangster], time)) { | ||
| gangstersIsNotBusy = false; |
There was a problem hiding this comment.
Можно написать здесь return false;, а в конце функции -- return true;. Тогда без этой переменной обойдемся и меньше бегать по циклу будем)
There was a problem hiding this comment.
К сожалению из forEach нельзя ничего возвращать(
|
В целом стало намного лучше, молодец. Исправь мелкие замечания, и я передаю тебя ментору. |
|
🚀 |
|
🍏 Пройдено тестов 19 из 19 |
|
@mokhov обрати внимание решено доп. задание |
mokhov
left a comment
There was a problem hiding this comment.
В данном решении очень много избыточного кода. Из-за этого его очень сложно читать. Хочу в ответном комментарии увидеть ответ на вопрос: как работает твой алгоритм?
| exports.isStar = true; | ||
|
|
||
| var DAYS_INDEXES = { 'ПН': 0, 'ВТ': 1, 'СР': 2, 'ЧТ': 3, 'ПТ': 4, 'СБ': 5, 'ВС': 6 }; | ||
| var DAYS_NAMES = ['ПН', 'ВТ', 'СР', 'ЧТ', 'ПТ', 'СБ', 'ВС']; |
| }; | ||
| } | ||
|
|
||
| function isTimeInIntervals(timeIntervalsArray, time) { |
There was a problem hiding this comment.
Название читаю, а понять что она делает не могу
| } | ||
|
|
||
| function strDateToDateObj(strDate) { | ||
| var strDateCopy = strDate.slice(); |
| function getGangsterNames(schedule) { | ||
| var gangsterNames = []; | ||
| for (var gangsterName in schedule) { | ||
| if (schedule.hasOwnProperty(gangsterName)) { |
There was a problem hiding this comment.
| this.start = start; | ||
| this.end = end; | ||
|
|
||
| this.getLength = function () { |
There was a problem hiding this comment.
start и end известны на этапе создания объекта, почему length нужно вычислять, а нельзя сделать полем?
| } | ||
|
|
||
| function createTimeIntervalWithShift(time, shift) { | ||
| return new TimeInterval(strDateToDateObj(time.from).intValue + shift, |
There was a problem hiding this comment.
Это нечитаемый однострочник, нужно вынести аргументы TimeIntreval в читаемые переменные
| strDateToDateObj(time.to).intValue + shift); | ||
| } | ||
|
|
||
| function simplifyTimesIntervals(timeIntervals, duration) { |
There was a problem hiding this comment.
Название функции переводится как «Упростить временные интервалы». Я честно не понимаю что тут подразумевается
|
|
||
| function simplifyTimesIntervals(timeIntervals, duration) { | ||
| var newTimeIntervals = []; | ||
| timeIntervals.forEach(function (timeInterval) { |
There was a problem hiding this comment.
Для фильтрации массивов придумали специальную функцию https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
| return newTimeIntervals; | ||
| } | ||
|
|
||
| function addOrChangeLastTimeInterval(arrayIntervals, timeToStartNewInterval) { |
There was a problem hiding this comment.
Из названия функции абсолютно не понятно что она делает. И по коду я тоже ничего не понял
|
🍅 |
No description provided.