Задать вопрос
  • Методика обучения C#?

    @UnformedVoid
    Разработчик ПО
    Нет никаких правильных или неправильных способов изучения. Просто изучайте дальше, без ожидания результата. Не надо себя изводить поисками волшебных ключиков. Просто делайте постепенно. Дайте себе время включить всё это объёмное описание в свою картину мира. Раз нужно возвращаться к примерам — возвращайтесь. Возвращайтесь столько, сколько нужно. Главное, чтоб был интерес.
    Ответ написан
    Комментировать
  • Как удалить элемент с поля?

    @UnformedVoid
    Разработчик ПО
    Вы пользуетесь канвасом как хранилищем состояния — это императивный подход и от этого неудобный. Это как с JQuery, только хуже, потому что тут у вас нет селекторов. Вы не должны опираться на то, что нарисовано на канвасе. Ваш канвас должен служить просто представлением. Вынесите все ваши данные в JS в качестве массива или объекта — как вам удобно. Далее напишите код, который будет перерисовывать ваш канвас при изменении состояния. Есть два способа решать проблемы: первый — тот, которым вы пытались решить вопрос — прямой способ, второй способ — это поменять задачу так, чтоб в новом контексте проблема стала невозможной, бессмысленной, в общем перестала существовать. Если вы вынесите всю логику в JS, то вопроса «как удалить» у вас не останется.
    Ответ написан
    4 комментария
  • Правильно ли понял понятие - абстрактый метод?

    @UnformedVoid
    Разработчик ПО
    В принципе, верно.
    1) Абстрактный класс может иметь абстрактный метод — то есть метод без реализации
    2) Каждый прямой потомок абстрактного класса обязуется его реализовать
    Потомок потомка уже имеет дело с перегруженным методом, поэтому не обязан самостоятельно его реализовывать.
    Ответ написан
    2 комментария
  • Как устранить дублирование рядов при сортировке таблицы?

    @UnformedVoid
    Разработчик ПО
    Вот этот участок добавляет ряды в отсортированном порядке:
    $.each(rows, function(index, row) {
        $('#table-favorites').children('tbody').append(row);
    });

    но в коде нет участка, который удалял бы ряды, вот и происходит дублирование. Сделайте так, чтоб ваша функция подчищала таблицу прежде, чем добавлять отсортированные ряды.
    Ответ написан
    Комментировать
  • Как правильно перенести логику объекта на Vue без data, methods и computed?

    @UnformedVoid
    Разработчик ПО
    Насколько я вижу логику построения структуры Vue-приложения, сделать такое нельзя. И вообще это неверный подход. Но есть воркэраунд. Можно написать функцию, которая будет мэппить ваши «плоские» js объекты в один большой Vue компонент. То есть нужно будет передать в data массив данных из полей name и val, а do_action и is_availible перенести в методы, хотя это, конечно же, нельзя считать красивым или изящным решением, так как придётся запихунть 50 методов с разными названиями в methods. Можно написать компонент, который будет отображать ваши объекты и программатически проинициализировать по экземпляру на каждый объект в массиве. Тоже не назвал бы самым красивым решением, но оно будет более изящным, хоть и более императивным, чем стоило бы быть приложению на Vue. Вы не сможете воспользоваться преимуществами темплейтинга Vue и скатитесь до JQuery подобного кода. Третий вариант — это сделать правильно, разбить данные и методы и собрать их так, чтоб можно было легко использовать с декларативным подходом Vue. Это будет самый гибкий и правильный подход. Я, если честно, не вижу практически никаких причин использовать однообразные объекты в той форме, которой делаете это вы. Зачем нужно хранить в каждом из них методы? Почему бы не вынести эти методы из объектов, ведь они должны работать на основе данных, которые у вас в name и val (или не так?). Неужели в них разная логика, в каждом из них? Если да, то вам стоит подумать о том, как правильно разделить эту логику и переиспользовать её, потому что ваш код выглядит однообразным, то есть ваши объекты, но судя по тому, как вы это делаете это не так, что может привести только к запутанному и сложноподдерживаемому коду.
    Ответ написан
  • Как лучше реализовать веб приложение на vue js?

    @UnformedVoid
    Разработчик ПО
    Суть компонентного подхода в следующем:
    1) Логика и представление отделяются друг от друга
    2) Функционал разделяется на слабозависимые и переиспользуемые компоненты
    3) Компоненты компонуются в различных комбинациях, реализуя готовое приложение

    Поэтому ответ на ваш вопрос следующий:
    1) Разбить всё на максимально простые (но не проще) переиспользуемые компоненты
    2) Объединить их в более крупные компоненты и самые крупные из них объеднить в корне приложения (файл в котором запускается корневой экземпляр Vue) в готовое приложение
    Ответ написан
    2 комментария
  • Какой вариант компонента объективно лучше?

    @UnformedVoid
    Разработчик ПО
    Аргументы вашего тимлида непрофессиональны и не подкреплены рациональной аргументацией. Ваш подход поддерживает компонентную структуру приложения. В то время как то, что предложил ваш тимлид обязывает слишком много помнить о том, как нужно писать код, увеличивает количество повторяющегося кода, в целом делает его более императивным, что плохо совместимо с идеями стоящими за Vue. В общем советую вам настоять на своём и описать почему ваш подход лучше. «я всегда так делал, мы так привыкли» — не аргумент. Ваш тимлид явно не видит абстрактную сторону и плохо понимает работу фреймворка, а может и как вы говорите, не очень-то и профессионален.

    UPD.
    Я исследовал комментарии тут, подумал и пришёл к дополнительным выводам, которые опишу тут:

    1) Ваш подход имеет минус — он избыточен, так как содержит два слота, что делает логику неясной. Дело в том, что у вас не понятно к чему относится второй слот content. Читающий может подумать, что это контент, который выводит сам аккордеон — один раз, а не для каждого элемента. Мне такая логика особо знакома из фрейморвка WPF. Там всё так и работает, но судя по вашему примеру этот слот относится к слоту item, то есть используется не для аккордеона, а для его элементов, что неправильно, так как нарушает инкапсуляцию. Это минус вашего подхода, но он легко исправляется.

    2) Минусы подхода вашего тимлида остаются теми же — многословность, императивность. Он нарушает принцип DRY.

    Так вот, требуется подход, который не будет нарушать лучших практик — гибридный подход. Для начала нужно разделить понятия аккордеона и элемента аккордеона — теперь это два слабосвязанных компонента. У нас должна быть возможность менять компонент элемент аккордеона на новый, при этом не трогая сам аккордеон. Это решается очень просто. Мы просто берём ваш подход и оставляем в нём только один слот item. Этот слот будет позволять пользователю аккордеона создавать разметку по своему усмотрению. Слот content убираем за ненадобностью. В дальнейшем мы можем аккордеону добавлять ещё слоты и они будут менять его структуру, например добавлять ему заголовок или что-то ещё, но при этом никак не трогая то, как отображается внутренность его элементов (помним об инкапсуляции)! Этим должен заниматься слот items. Теперь, у нас есть возможность создать разметку его элементов. Мы можем это сделать с помощью простых HTML тегов, если у нас аккордеон в одном месте и забыть о дальнейшем (помним о принципах YAGNI и KISS). Если же у нас аккордеон в нескольких местах, причём, разметка его элементов каждый раз одинаковая, то стоит задуматься о компоненте элемента аккордеона. Его структура не важна, так что ударяться в детали я не буду. Далее мы просто создаём ещё один компонент, который будет оборачивать наш аккордеон и подставлять в его слот item соответствующий компонент элемента аккордеона (и, возможно, добавлять ещё какую-то функциональность, разметку) — типа создаём подкласс. Таким образом мы не пишем v-for каждый раз, то есть не повторяемся (помним о DRY), и имеем полный контроль над тем, что происходит в приложении. Если понадобится что-то поменять у всех, мы просто зайдём и поменяем это в нашем последнем компоненте-обёртке. Если нужно будет реализовать что-то новое, то мы создадим новую обёртку или вовсе используем наш базовый аккордеон на нужной странице (помним о YAGNI). Некоторым может показаться это избыточным. Так и есть, этим надо пользоваться с умом. Если у вас один аккордеон на всё приложение, то и думать о переиспользовании — бессмысленно. Если же компонент требуется в нескольких местах, то приведённый мною подход прекрасно подойдёт, так как основан на лучших практиках взятых из ООП.

    P.S. С подходом-обёрткой мы можем даже не писать отдельные компоненты для элементов аккордеона, так как, в принципе, нам не нужны элементы аккордеона отдельно от него. Достаточно лишь создать аккордеон-потомок с нужной разметкой в слоте item.
    Ответ написан
    2 комментария
  • Как работает анимация в хедере на сайте JetBrains?

    @UnformedVoid
    Разработчик ПО
    Вроде такие штуки называются каплевидными объектами или метаболами (metaball). У них есть строгое математическое описание. В целом это самая сложная часть в этой задаче. А в остальном — это просто отрисовка на канвасе в пару-тройку слоёв. По ощущениям каждый «шарик» привязан к какой-то точке, от которой он не может отойти больше чем на отведённое ему расстояние. Ну и вдобавок к этому, он «убегает» от курсора. Вот и весь эффект.

    Вот почитать и пример реализации:
    https://ru.wikipedia.org/wiki/Metaball
    paperjs.org/examples/meta-balls
    Ответ написан
    2 комментария
  • Почему результаты цикла выдаёт 1 значение за рамками условия цикла?

    @UnformedVoid
    Разработчик ПО
    Это особенности консоли. Она выводит последнюю строчку в цикле так, как-будто это результат вычисления. Можете проверить это, добавив строчку 6; после x *= 3;. Если вывод будете делать не в консоль, то «лишнего» вывода не будет.
    Ответ написан
    Комментировать
  • Зачем нужно ООП?

    @UnformedVoid
    Разработчик ПО
    ООП задумывалось как подход для декомпозиции кода на модули — классы. Каждый класс выполняет свою функцию и код остаётся чистым. Это в идеале. Но в реале, ООП устраняя сложности процедурного программирования, добавляет свои. Всё как вы и описали. Идеи, описанные в книжках, в реальных примерах не имеют применений. Для написания хорошего ООП кода нужно много знать и хорошо понимать абстрактную сторону. Плюс, ООП реализовано множеством способов. Популярные реализации ООП (Java, C#) по-сути являются Класс-Ориентированным Программированием. Помимо этого ООП увеличивает объём кода. Также, постулаты на котором, основано текущее (популярное) ООП создают предпосылки для хрупкого кода. Например, наследование. Изначально наследование подразумевалось как метод для переиспользования кода. Но со временем стало понятно, что большие иерархии классов ведут к непредсказуемым ошибкам. Если обнаруживается ошибка в базовом классе при наличии уже большой иерархии, её исправление чревато появлением сложных ситуаций с падением модулей завязанных на него. Можно привести другие примеры, но это тема для целой статьи, а возможно и для нескольких. Сейчас в языки ООП внедряются фичи из функционального программирования. Функциональное программирование базируется на идее композиции функций. ООП сейчас переходит (или уже перешло) от наследования к композиции объектов. То есть рекомендуется использовать композицию вместо больших иерархий наследования. Функциональное программирование лишено проблем ООП. Многие вещи, которые в ООП надо специально изучать (например шаблоны проектирования, внедрение зависимостей), в ФП являются либо основополагающим принципом, либо естественно выплывающим следствием (в ООП тоже много хороших практик выплывают естественным образом, однако, чтоб понять их естественность приходится хорошенько вглядываться). ФП очень многое даёт из коробки. ООП — неплохая штука, однако оно отживает свой век. ФП позволяет с гораздо меньшими затратами писать надёжный, расширяемый, краткий, элегантный и эффективный код.

    Прошу не воспринимать моё отношение к ООП как негативное — у него есть свои плюсы, своя ниша. Плюс, в контексте ООП люди смогли изучить очень многое, ведь ООП навело их на многие мысли, создало необходимость в изучении структуризации и модуляризации кода. В контексте ФП это не было бы так очевидно (например, внедрение зависимостей в рамках ФП вообще не интересно изучать, так как в ФП — это просто передача параметров функции, то что мы итак понимаем). Так что всему своё место и время.
    Ответ написан
    7 комментариев
  • Как отсортировать блоки при выборе select?

    @UnformedVoid
    Разработчик ПО
    Для начала вынесите данные из HTML в JS. Идеальное решение — массив. Дальше с помощью JQuery заполняйте HTML контейнер данными из вашего массива данных. К селекту присобачьте событие изменения. В нём сортируйте массив с помощью Array.prototype.sort() и после сортировки обновляйте HTML.
    Ответ написан
  • Какой ЯП для Десктопа?

    @UnformedVoid
    Разработчик ПО
    Хм, раз уж вопрос о предпочтениях, то вставлю свои 5 копеек. F# — идеальный язык. Может всё то, что умеет C# (и сверх), но заточен под функциональное программирование. Можно писать под любую из популярных платформ. И вообще функциональное программирование — это будущее, так что советую освоить.
    Ответ написан
  • Что делать, если отслеживается папка Users в Git?

    @UnformedVoid
    Разработчик ПО
    Если у вас папка C:/Users/ находися под версионным контролем гита, то в ней должна быть подпапка .git . Поищите её там, она может быть скрытой. И если есть — удалите.
    Ответ написан
  • Почему выводится только один элемент?

    @UnformedVoid
    Разработчик ПО
    Потому что вот:
    $('.notice').each(function(index, value) {
           if (index > 0) {
              $(this).remove();
           }
    ...

    При каждом нажатии на кнопку идёт проверка количества объектов с классом .notice и удаление тех, которые имеют index больше 0. Более поздние объекты просто удаляются.
    Ответ написан
  • Как получить доступ к содержимому всплывающего окна fancybox в callback'e?

    @UnformedVoid
    Разработчик ПО
    Ответ в названии хука, которое выводит сообщение в консоль — «beforeShow». В консоль вы выводите $content, который на тот момент равен undefined и оно впоследствии не обновляется А вот вывод всего объекта current — обновляется. Поэтому после назначения контента в консоли его можно увидеть, развернув объект. И так как это происходит за миллисекунды заметить это, конечно, невозможно. Поменяйте на «afterShow» и увидите разницу.
    Ответ написан
    2 комментария
  • Как прикрутить UI для Web приложения?

    @UnformedVoid
    Разработчик ПО
    Да, вы правы, вам нужен JS. Советую воспользоваться Vue, так как он прост в использовании и достаточно мощный. В целом последовательность такова:
    Разобраться с JS
    Разобраться с Vue
    Немного разобраться с NodeJS
    Немного погрузиться в Webpack
    Выбрать какой-нибудь готовый набор элементов (например Material Design, можно и свои написать, тогда либо CSS, SCSS, либо TailwindCSS и т.д.)
    Написать SPA
    Объединить с Java бэкендом — тут я не мастер разъяснения давать, так как не специалист по Java. Примерно представляю, что есть два пути:
    1) У Spring есть способ самому отдавать js и css файлы
    2) Можно поднять NodeJS сервер (благо это очень просто) и нужные роуты перенаправлять к нему (возможно через обратный прокси, например Nginx)

    В целом, всё очень легко гуглится. Так что ссылки я сюда громоздкие пихать не буду.

    UPD.
    Разве что вот эту:
    https://www.w3schools.com
    Ответ написан
    2 комментария
  • Как работает данная рекурсия?

    @UnformedVoid
    Разработчик ПО
    paw(2, 5) = 2 * paw(2, 4)
    2 * paw(2, 4)                   --> paw(2, 4) = 2 * paw(2, 3)
    2 * (2 * paw(2, 3))             --> paw(2, 3) = 2 * paw(2, 2)
    2 * (2 * (2 * paw(2, 2)))       --> paw(2, 2) = 2 * paw(2, 1)
    2 * (2 * (2 * (2 * paw(2, 1)))) --> paw(2 ,1) = 2
    2 * (2 * (2 * (2 * 2)))


    На 3 строчке не готовый результат, а просто значение res и оно просто подставляется вместо рекурсивного вызова функции на пятой.
    Ответ написан
    8 комментариев
  • Какая есть альтернатива ООП в Java?

    @UnformedVoid
    Разработчик ПО
    Я не эксперт в Java, но для меня всё-равно вопрос «Какая есть альтернатива ООП в языке, который рассчитан на ООП?» звучит странно. Конечно, можно писать в других стилях, например, императивном (или, если точнее, в подобном императивному), но от этого теряется смысл и основные плюшки языка. Если нужен другой стиль, то лучше изучить язык ориентированный на этот стиль.
    Ответ написан
    6 комментариев