• Что представляет из себя правильная декомпозиция javascript кода?

    search
    @search
    мама говорит что я особенный
    Выучите наизусть принципы SOLID. Серьёзно. Юнит тесты пойдут как по маслу. Еще разузнайте поподробнее про separation of concerns - это тоже про разбивку на модули. В общем-то если принимать решения руководствуясь правилами SOLID и постоянно думать о separation of concerns, то дела пойдут на поправку. Только не ждите скорого озарения, пожалуйста. Придётся целенаправленно попрактиковать это годик-другой. Сужу по личному опыту, но признаюсь честно, я слегка туповат. Может у вас есть шанс осилить это дело быстрее.

    Еще можно ознакомиться с тем что такое temporal coupling. Да и вообще coupling. Это про то как делать не нужно.

    Еще можно наизусть выучить мантру "low in coupling and high in cohesion".

    Еще можно попробовать сначала писать тесты, а потом код. Но так могут делать только те, кто способен превозмогать боль в течении долгого времени. Зато потом по-другому уже и не хочется. Да и не получается.

    UPD

    Забыл сказать, попробуйте писать такой код, который не стыдно выложить в npm. Если у вас получилось написать модуль, который можно подключить к любому проекту через npm, то это хороший признак того что модуль был написан по всем правилам. Да и вобще open source сильно помогает в прокачке "модульного мышления".
    Ответ написан
    Комментировать
  • Как отключить ошибки tslint при компиляции проекта?

    search
    @search
    мама говорит что я особенный
    Можно. Добавьте в конфиг tslint'a `"defaultSeverity": "warning"`.
    Ответ написан
    Комментировать
  • RxJs: условный mergeMap в pipe?

    search
    @search
    мама говорит что я особенный
    // Да, сначала мы делаем map, потому что он делается полюбому:
    
    let doSomething$ = this.myApi.getSomething(id).pipe(
      map(tags => ({ ...updatedShop, tags }))
    )
    
    // А затем мы делаем mergeMap если понадобится:
    
    if (shop.isNew) {
      doSomething$ = doSomething$.pipe(
        mergeMap(() =>
                      this.myApi.addTags(updatedShop.id, shop.tags).pipe(
                          map(() => {
                              return {
                                  ...updatedShop,
                                  tags: shop.tags
                              };
                          })
                      )
                  )
      )
    }
    
    // ну и затем подписываемся на это дело чтоб оно начало работать:
    
    doSomething$.subscribe();


    Вам будет значительно легче понять RxJS после просмотра вот этого видео: https://www.youtube.com/watch?v=3LKMwkuK0ZE Оно слега отстало от времени (операторы к обозревателю теперь добавляются через функцию pipe()), но сами принципы, описанные в видео, никуда не делись.

    UPD

    Если код выше повергает вас в тоску, то можно сделать так:

    this.myApi.getSomething(id).pipe(
      map(tags => ({ ...updatedShop, tags })),
      mergeMap((tags) => {
        if (!shop.isNew) {
          return of(tags);
        }
       return this.myApi.addTags(updatedShop.id, shop.tags).pipe(
                          map(() => {
                              return {
                                  ...updatedShop,
                                  tags: shop.tags
                              };
                          })
                      )
      }),
    )


    Имеется ввиду, что можно иф вынести в сам mergeMap. И если магаз не новый, то возвращать обзёрвбл от магаза, а если новый, то сделать что-то там еще.
    Ответ написан
    1 комментарий
  • Почему в данном примере результат замыкания 5, а не 6?

    search
    @search
    мама говорит что я особенный
    Если хотите чтоб функция counter() увеличила currentCount перед выводом, то можно делать

    return ++currentCount

    Хозяйке на заметку: оператор ++ считается антипаттерном и на уважающих себя проектах отключён на уровне линтера.
    Ответ написан
    Комментировать
  • Как правильно загрузить файлы и привязать их к сущности?

    search
    @search
    мама говорит что я особенный
    Грузить файл во временную папку и при этом задавать файлу рандомное уникальное имя. Во время поста передавать связку действительное_имя - рандомное_имя.

    Рандомное уникальное имя должен задавать сервер и возвращать его как ответ поста.
    Ответ написан
    6 комментариев
  • Как использовать тег cut?

    search
    @search
    мама говорит что я особенный
    Тег cut - это кастомный тег. В HTML спецификации такого нет.

    Возможно вас заинтересует вот эта либа https://dollarshaveclub.github.io/shave/ . Она как раз про обрезку текста и html.

    Или ищите по сочетанию js truncate html
    Ответ написан
    2 комментария
  • Нужен ли я на Stand-up митингах?

    search
    @search
    мама говорит что я особенный
    Судя по тому что вам нет дела до того как идут дела у ваших коллег, ваша команда не преследует общую цель.

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

    1. Поговорить со скрам мастером о том, что вас беспокоит качество стендапов. Кстати, раз уж ваша компания взяла курс на скрам, то скрам мастер - это тот человек, к которому следует обращаться со всеми организационными вопросами
    2. Выразить своё недовольство стендапами во время ретроспективы. Возможно, вас поддержат коллеги и это будет началом перемен к лучшему. Кстати, ретроспектива, - это специальный ритуал скрама во время которого нытьё только приветствуется
    3. Самый конструктивный путь, как по мне, - это прочесть Scrum Guide (https://www.scrumguides.org/docs/scrumguide/v2017/... - 26 несчастных страниц) и быть кравчиком, который понимает назначение артефактов скрама и может помочь компании в эффективном внедрении этого фреймворка

    Успехов!
    Ответ написан
    Комментировать
  • Как мне преобразовать полученный json в массив, который я бы мог прогнать через ngFor?

    search
    @search
    мама говорит что я особенный
    Не нужно result.json()

    Данные уже там.

    result.data достаточно.

    (при условии что вы используете Angular > 4.3)
    Ответ написан
  • Как исправить роутинг на гитхабе?

    search
    @search
    мама говорит что я особенный
    <BrowserRouter basename="/book-store">...
    Ответ написан
  • Ошибка в TypeScript, как пофиксить?

    search
    @search
    мама говорит что я особенный
    Уберите эту часть

    constructor(props: Props) {
        super(props);
      }


    Этот код выполняется автоматически в классе React.Component. Его не нужно дублировать.

    UPD

    А вообще код слегка странный. Я так понимаю что App у вас главный компонент. Предполагаю что он рисуется в файле index.ts. Вашему App точно нужны props? Если нужны, то их нужно передать. Как-то вот так:

    <App props={} />
    Ответ написан
  • Как тестировать функцию которая возвращает createStore?

    search
    @search
    мама говорит что я особенный
    Вам совершенно не нужно тестировать функцию createStore потому что она очень хорошо протестирована создателями библиотеки и прекрасно работает. Вам нет смысла убеждаться что эта функция делает то, что от неё ожидают.

    Но есть смысл протестировать свою функцию редьюсера. Это очень легко - достаточно подавать состояние и действие на вход функции редьюсера и проверять какое новое состояние она возвращает.

    UPD

    Да и в целом, юнит тестирование кода библиотек - это так себе идея. Лучше потратить время на тестирование своего кода.

    Очень часто можно увидеть что программисты в рамках тестирования пытаются убедиться что библиотека правильно вызвала их код. Это, по сути, опять же тестирование кода библиотеки. Процесс не только бесполезный, но и вредный. Почему он вредный? Потому что программист занимается дублирование тестов библиотеки, создавая код, не приносящий пользы, но требующего дополнительного времени на поддержку.

    Как понять что программист занят тестированием библиотеки, а не своего кода? По изобилию моков, стабов, предварительными установками состояния, сбросами состояния и повышенной сложности тестов в целом. Правило левой руки такое: если с первого взгляда невозможно понять что тестирует функция, то это означает что она ничего не тестирует, а сжирает время на поддержку.
    Ответ написан
  • Как вывести значение из массива в HTML элемент, по определенному шаблону?

    search
    @search
    мама говорит что я особенный
    По классике такое делается фильтром, а не ng-repeat. Потому что с ng-repeat обработка ситуаций "пустой массив", "массив с одним элементом" и "массив с двумя элементами" (про массив с двумя элементами объяснено ниже) будут выглядеть по-уродски в шаблоне.

    Вот как это выглядет

    // human-friendly-concat.js
    angular.module('yourModule', [])
    .filter('humanFriendlyConcat', function() {
      return function(input) {
        input = input || [];
        if (input.length === 0) {
            return 'does not exist';
        }
    
        if (input.length === 1) {
            return input[0];
        }
    
       if (input.length === 2) {
            return input.join(' and ');
        }
    
        return input.slice(0, -1).join(', ') + ', and ' + input.slice(-1);
      };
    })
    
    // template.html
    <p>
      This name <span ng-bind="name | humanFriendlyConcat"></span>.
    </p>


    Разница между массивом из двух элементов и массивом из больше чем двух элементов в так называемой "гарвардской запятой". Она ставится перед "and" в перечислении. Например, перечисляя страны мы напишем "Russia and Spain" для двух, но "Russia, Jamaica, and Spain" для трёх. Такие дела. https://en.wikipedia.org/wiki/Serial_comma
    Ответ написан
    Комментировать
  • TypeScript import из сабдериктории?

    search
    @search
    мама говорит что я особенный
    Если предполагается что `someFunc` хранится в своём отдельном файле, то в `Navigator/index.ts` должна быть строчка `export * from './some-func'`. Где some-func - имя файла.
    Ответ написан
    Комментировать
  • Angular2+: как надежно доставить новую версию приложения клиенту минуя кэш браузера?

    search
    @search
    мама говорит что я особенный
    В Google Inbox это реализовано через всплывающую кнопку. Если приложение определило появление новой версии, то показывается ненавязчивое сообщение и кнопка "перезагрузить". Элегантное решение.
    Ответ написан
    2 комментария
  • Как правильно скопировать свойства объекта в anjular.js?

    search
    @search
    мама говорит что я особенный
    Чтобы было проще понять почему так происходит, попробуйте разобраться с понятием "присвоение по ссылке". Это базовая концепция многих языков. Без этого знания, использовать JS очень непросто.

    Для того чтоб решить вашу проблему, можно сделать так:

    $scope.manufacturers = angular.copy(manufacturers);
    $scope.datadilers = angular.copy(datadiler);
    Ответ написан
    1 комментарий
  • Какую литературу прочитать на английском для обучения языку?

    search
    @search
    мама говорит что я особенный
    Попробуйте The Commitments автора Roddy Doyle

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

    Если собираетесь развиваться в этом направлении, то рекомендую купить электронную книгу. Почти во всех есть функция словаря. Это просто незаменимо при обучении.

    Еще попробуйте одновременно слушать аудиокнигу и бежать глазами по тексту. Это будет двойной удар по безграмотности.
    Ответ написан
    Комментировать
  • Как использовать одну админку для разных стран?

    search
    @search
    мама говорит что я особенный
    В таких случаях обычно пишется общий код и хранится в одном репозитории. Настройки по странам хранятся в конфиге. Вся разница в поведении так же определяется конфигом.
    Ответ написан
    Комментировать
  • Куда дальше расти, что изучать? Как найти команду?

    search
    @search
    мама говорит что я особенный
    Судя по описанию вашего карьерного продвижения и проектам на гитхабе, у вас всё неплохо получается. Прогресс пойдёт значительно быстрее если вы попадёте в команду и встретите там своего гуру.

    Вы пока что не видите ценности в node/gulp/angular/vue и в консоли потому что не сталкивались с крупными проектами и не работали в команде. Все эти технологии раскрывается в полную силу именно в таких условиях.

    Те разработчики, которых принято называть "крутыми" - это ребята, способные метко замечать шаблонные/повторяющиеся поведения или структуры и адекватно на них реагировать. Для того чтоб быть похожим на тех самых крутых ребят, можно почитать The Pragmatic Programmer и Clean Coder.
    Ответ написан
    Комментировать
  • Почему если передавать видео файл, то ajax не отправляет вообще никаких данных?

    search
    @search
    мама говорит что я особенный
    Вот эти переменные в своём php.ini подкрутите по своему усмотрению

    ; Maximum allowed size for uploaded files.
    upload_max_filesize = 40M
    
    ; Must be greater than or equal to upload_max_filesize
    post_max_size = 40M
    Ответ написан
    Комментировать
  • Правильно ли написано условие?

    search
    @search
    мама говорит что я особенный
    Отрицание (!) перед выражением приводит значение выражения к boolean, а затем инвертирует его. Это часто встречающаяся конструкция в JS. Это документированное и однозначное поведение.

    Часто можно встретить так же двойное отрицание !! перед выражением. Двойное отрицание направлено на приведение выражения к чистому Boolean.

    Отрицание (!) так же можно заменить на конструкцию типа (выражение) != true или (выражение) == false. Все эти конструкции приводят проверяемое выражение к Boolean. Такое поведение языка называется "неявное приведение".

    Ниже идёт небольшое исследование (провёл только что для себя из интереса) и тема для холивара.

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

    Но "хорошо" или "плохо" ли использовать отрицание перед выражение - это непростой вопрос, на который не существует однозначного ответа. Есть "эталонная" книга по лучшим практикам в JS: Javascript: The Good Parts Дугласа Крокфорда. Несмотря на многие спорные утверждения в ней, на эту книгу принято ссылаться как на истину в последней инстанции. Так вот, Крокфорд однозначно требует использование строгого равенства (операторы "===" и "!==") в пользу нестрого (операторы "==" и "!="). И многие компании с удовольствием его поддерживают и даже вводят ограничение на использование нестрогого равенства на уровне линтера. Но, к сожалению, Крокфорд ничего не сказал про оператор отрицания, который, по сути, тоже является нестрогим неравенством, явно запрещенным лучшими практиками. Раз ни Крокфорд, ни какой-либо другой влиятельный гуру ничего не сказали про отрицание, его продолжают использовать, радоваться простоте и страдать от неявных ошибок.

    Лично для себя выбрал такую тактику: использую отрицание там где явно имею дело с логическими выражениями (пример привести не могу) и строгое равенство когда имею дело с функциями. В вашем случае, скорее всего, запись имела бы вид return /^[ \\t]*$/s.test(r) === false; . Почему так? Потому что функции регулярных выражений имеют свойство возвращать чёрт знает что и хочется пожалеть девелопера, который почти наверняка споткнётся читая return ! /^[ \\t]*$/s.test(r); и полезет в документацию выяснять что именно возвращает функция test.

    Такие дела.
    Ответ написан
    Комментировать