Задать вопрос
  • Что такое полиморфизм?

    vitaly_74
    @vitaly_74
    Поли - много, морф - форма. (поправьте если что)
    представь у тебя есть бэк и фронт.
    фронт общается с бэком посредством апи.
    а теперь представь вместо бэка на php подставить бэк на ruby (или на чем нибудь другом).
    а фронт останется таким же. Так вот чтобы обеспечить четкую работу фронта, при смене языка программирования, фронт и бэк должны общаться по некоторому "контракту", т.е. если я запрашиваю с фронта на бэке корзину товаров, то ответ всегда должен содержать одни и теже поля (но например могут быть разные значения).
    Полиморфизм связан с таким понятием как "контракт" в программирование - это интерфейсы.
    Перейдем к примеру из программирования.
    Представим что бизнес требует сегодня подключить платежную систему например эпл пей, для проведения оплаты например методом makePay()
    Далее через неделю бизнес решает перейти на google и ты делаешь также реализацию makePay() для гугла.
    А затем к тебе еще раз приходит бизнес и говорит "нам нужно снова работать с эплом. Тогда Ты просто меняешь в клиентском коде объект GooglePay() на ApplePay() и у тебя все работает.
    Это и называется полиморфизм.
    У тебя 2 класса, работают по одному контракту (интерфейсу) в котором записано, что объект который исплементирует данный интерфейс должен уметь выполнять makePay();
    и вот через 3 месяца к тебе еще раз приходит бизнес и говорит давайка поменяй нам платежную систему на binanePay(). ну собственно, ты создаешь одноименный класс, имплементируешь туда интерфейс с makePay() и в клиенстком коде просто меняешь ApplePay на BinancePay и теперь бизнес уже работает не с эплом а с бинанс.
    т.е. Полиморфизм дает возможность заменить один объект на другой.
    Ответ написан
    1 комментарий
  • Как развиваться и работать junior программисту на c#?

    AgentSmith
    @AgentSmith
    Это мой правильный ответ на твой вопрос
    Полгода для программиста - это вообще ни о чём. Синтаксис языка ты выучишь за пару дней, а вот структуры данных, алгоритмы, паттерны проектирования и умение всё это применять - нарабатывается годами.
    Как минимум года три практики и программирования, чтобы хоть что-то из себя представлять.
    Да, это именно так и работает - года три работаешь бесплатно на себя, вхолостую, в удовольствие.
    А уже потом по наработанному опыту ищешь себе место для заработка.
    Говорю тебе по собственному опыту. Я около семи лет нарабатывал опыт для себя.ю в удовольствие, делал собственные проекты и только потом нашёл способ как зарабатывать своим опытом, знаниями и умениями
    Ответ написан
    Комментировать
  • Какие курсы лучше? Скиллбокс, Гикбрейнс, Яндекс Практикум?

    alexgp13
    @alexgp13
    Руководитель ИТ-проектов
    Определитесь, что подразумеваете под "программированием". Это крайне широкое понятие.
    Хорошие курсы читают, например, в Специалисте. Перечисленные Вами - очень дорогие и малоэффективные (если не вредные).
    Есть также множество бесплатных проектов (openedu, например), есть бесплатные курсы ведущих западных университетов (а заплатив после курса, можно еще и диплом получить).
    Еще вся документация доступна бесплатно, как пример - для Android разработки:
    https://developer.android.com/
    Ответ написан
    Комментировать
  • Как сделать итерацию по вложенному хешу?

    0xD34F
    @0xD34F
    data.each_value{|n|
      puts("#{n[:name]}: вес #{n[:weight]} г., количество #{n[:qty]} шт.")
    }
    Ответ написан
    1 комментарий
  • Vue-tables-2. Как выводить данные из вложенных объектов?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Поиск по свойствам вложенных объектов "из коробки" не предусмотрен. Так что без костылей не обойтись.

    Вижу три варианта:
    • Перенос свойств вложенных объектов непосредственно в объект строки таблицы. То есть, сейчас у вас есть { user: { city: { name: "..." } } } , а будет { userCityName: "..." } или { user_city_name: "..." }, как-то так.
    • Создание кастомных фильтров по столбцам, созданным с помощью templates. Всё вручную - создание фильтра, написание логики его работы и т.д. Также из минусов данного подхода - элементы управления кастомных фильтров находятся за пределами таблицы, в отличие от встроенных. Нагуглил пример реализации, на его основе сделал пример поиска по свойствам вложенных объектов.
    • Наконец, можно обернуть данные в Proxy. Определять templates в этом случае не нужно, всё работает так, будто интересующие нас свойства принадлежат не вложенным объектам, а непосредственно объекту строки таблицы. Соответственно, и встроенный поиск тоже доступен. Идея в чем: делаем get-ловушку, в ней режем имя свойства, например "user.city.name", на куски, идём вглубь по полученной цепочке имён, достаём значение. Опять же, сделал небольшой пример.

    UPD. Добавили возможность определять методы фильтрации для отдельных столбцов, так что вот четвёртый вариант.
    Ответ написан
    Комментировать
  • Как реализовать подзагрузку страницы перед переходом на нее в Vue JS?

    0xD34F
    @0xD34F Куратор тега Vue.js
    В интересующем вас компоненте определяете хук beforeRouteEnter - в нём и инициируете получение данных. Как оно конкретно выглядит - непосредственно выполнение запроса, или вызов экшена - тут вам виднее. После получения данных дёргаете next. Всё.

    UPD. Не, не всё. Если не очень поняли, о чём я - сделал небольшой пример. Три роута, первые два ни о чём, последний - показывает данные из хранилища. И при каждом переходе инициирует их обновление.
    Ответ написан
    Комментировать
  • Как управлять состоянием множества диалоговых окон (Vue, Vuex, Element UI)?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Передавайте в мутацию вместо просто состояния диалога объект вида { имя_диалога: состояние }. Тогда при обновлении состояния диалогов не будет необходимости обращаться к ним поимённо:

    mutations: {
      dialogShow: (state, payload) => Object.assign(state.modals, payload),
    },

    В компоненте, вместо вычисляемого свойства modal, отвечающего за работу с одним диалогом, будет свойство modals, обеспечивающее получение состояния всех диалогов. А чтобы изменение состояния диалога по-прежнему выглядело как присваивание, воспользуемся Proxy, где будем перехватывать установку значений и вызывать мутацию:

    modals() {
      return new Proxy(this.$store.state.modals, {
        set: (target, prop, value) => {
          this.$store.commit('dialogShow', { [prop]: value });
          return true;
        },
      });
    },

    Соответственно, в шаблоне заменяем установку значения просто свойства на установку значения свойства объекта:

    <el-button @click="modals.dialogSignIn = true">sign in</el-button>
    
    <el-dialog :visible="modals.dialogSignIn" @close="modals.dialogSignIn = false">
      <span slot="footer" class="dialog-footer">
        <el-button @click="modals.dialogSignIn = false">Закрыть</el-button>
      </span>
    </el-dialog>

    Посмотреть живьём.
    Ответ написан
    1 комментарий
  • Как сделать фильтрацию по нескольким значениям в VueJS?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Сложно это всё. Четыре селекта - очень похожие, четыре вычисляемых свойства - очень похожие. Многовато копипасты. Надо упростить.

    Первым делом внимательно посмотрим на все эти похожие куски кода, найдём, где они отличаются, и на основе этих отличий сделаем описание фильтров:

    filters: [
      { name: 'calculator.brand_filter', getter: obj => obj.brand.name, value: '' },
      { name: 'calculator.company_filter', getter: obj => obj.company.name, value: '' },
      { name: 'calculator.country_filter', getter: obj => obj.brand.country, value: '' },
      { name: 'calculator.side_filter', getter: obj => obj.sides, value: '' },
    ],

    Затем сделаем собственно фильтрацию, пропустим данные через массив фильтров (если значение фильтра выставлено - производится фильтрация, нет - оставляем данные как есть):

    computed: {
      filteredProfiles() {
        return this.filters.reduce((profiles, { value, getter }) => {
          return value
            ? profiles.filter(n => getter(n) === value)
            : profiles;
        }, this.profiles);
      },

    Далее, надо дать пользователю возможность задавать значения фильтров. Сделаем компонент фильтра:

    Vue.component('filter-select', {
      props: [ 'name', 'options', 'value' ],
      template: `
    <div>
      <p>{{ name }}<p>
      <select :value="value" @change="$emit('input', $event.target.value)">
        <option value="">-</option>
        <option v-for="n in options">{{ n }}</option>
      </select>
    </div>`
    });

    Подготовим опции для фильтров - массивы уникальных значений, по которым будет осуществляться фильтрация:

    computed: {
      filterOptions() {
        return this.filters.map(n => [...new Set(this.profiles.map(n.getter))]);
      },

    Наконец, создадим сами фильтры:

    <filter-select
      v-for="(n, i) in filters"
      v-model="n.value"
      :options="filterOptions[i]"
      :name="trans(n.name)"
    ></filter-select>

    Также не будем забывать про обнуление значений фильтров. Так что вот метод сброса фильтров и кнопка, по клику на которую он будет вызываться:

    methods: {
      resetFilters() {
        this.filters.forEach(n => n.value = '');
      },

    <button @click="resetFilters">{{ trans('calculator.reset_filter') }}</button>

    Демо можно посмотреть здесь (да, тут меньше фильтров, чем у вас - ну так вы свои данные не показали, а у меня воображения на большее не хватило).
    Ответ написан
    1 комментарий
  • Как рендерить слоты в списке?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Честно говоря, не очень понятно - а зачем тут вообще слоты. Передавайте в компонент данные обычным параметром, на их основе создавайте список.

    Но если всё-таки нужно использовать именно слот - пишите собственную render-функцию. Т.е., вместо шаблона, который есть у вас сейчас, будет что-то вроде

    export default {
      render(h) {
        return h('ul', this.$slots['list-item'].map(n => h('li', [ n ])));
      },
    };


    UPD. Если, помимо собственно списка в будущем планируется добавить в компонент List ещё какие-то элементы, то наверное будет не очень удобно рендерить всё это дело через функцию, поэтому можно написать небольшой компонент-обёртку для элементов слота:

    components: {
      SlotWrapper: {
        functional: true,
        render: (h, context) => context.props.node,
      },
    },

    <li v-for="n in $slots['list-item']">
      <slot-wrapper :node="n"></slot-wrapper>
    </li>
    Ответ написан
    5 комментариев
  • Почему массивы выводятся именно так?

    0xD34F
    @0xD34F
    Через запятую указываются не конкретные индексы, а задаётся интервал индексов. Первое число - начальный индекс, второе - сколько элементов надо взять. Читайте документацию.
    Ответ написан
    Комментировать
  • Как сделать downcase только для первых букв в руби?

    0xD34F
    @0xD34F
    str.gsub(/\b\w/){|m| m.downcase}
    Ответ написан
    Комментировать
  • Какая IDE для Ruby?

    DevMan
    @DevMan
    Ответ написан
    Комментировать
  • Как можно протестировать FizzBuzz с помощью рубиевского MiniTest`a?

    oh_shi
    @oh_shi
    Это не тру Ruby Way FizzBuzz, оно могло бы выглядеть как-то так:
    puts ((1..100).map do |i|
      str = ''
      str << 'Fizz' if i % 3 == 0
      str << 'Buzz' if i % 5 == 0
      str.empty? ? i : str
    end)

    А по тестам, вам не нужно тестировать каждое из 100 значений. Достаточно минимального, максимального и по тесту под каждую ветку в if. Лучше избегать while и заводить нужное число итераций в метод через параметр, и по нему уже идти через each/map.
    Ответ написан
    Комментировать
  • Какой двигатель выбрать?

    @rPman
    Конструкция уже есть? Нужно просто все посчитать.
    Обычными кухонными весами, зацепившись за колесо крючком, начни раскручивать колесо с тем ускорением, скоростью и рабочей нагрузкой что тебе нужна, на весах будет число в ньютонах. Теперь бери двигатель (если есть с редуктором то с ним), закрепи веревку к оси и, накручивая ее на ось, поднимай груз, закрепленный с другой стороны, равный весу, который показывали весы. Собственно все что нужно ты поймешь.

    И да, потом плюсуй 2х запас.
    Ответ написан
    Комментировать
  • Как в руби удалить массив с пустым элементов из массива массивов?

    0xD34F
    @0xD34F
    arr.delete_if{|n| n.include?('')}
    Ответ написан
    Комментировать
  • Как разбить массив на равные части?

    Ответ легко ищется поисковиком

    a = [0, 1, 2, 3, 4, 5, 6, 7]
    a.each_slice(3) # => #<Enumerator: [0, 1, 2, 3, 4, 5, 6, 7]:each_slice(3)>
    a.each_slice(3).to_a # => [[0, 1, 2], [3, 4, 5], [6, 7]]

    https://rdoc.info/stdlib/core/Enumerable#each_slic...
    Ответ написан
    2 комментария
  • Интересует мнение об онлайн школе Скиллбокс?

    daemonhk
    @daemonhk
    ПсиХоПат
    ИМХО, все онлайн обучение призвано поиметь с тебя денег. Да, дадут какую-то базу, которую ты, ленивая жопа, мог бы найти на профильных сайтах, но не более того.
    Ответ написан
    5 комментариев
  • Каков минимальный порог вхождения в программирование?

    @mkone112
    Начинающий питонист.
    Каков минимальный порог вхождения в программирование?

    Минимальные моторные функции. Полным паралитикам думаю будет сложно писать код только движением глаз.

    Функциональная сенсорная система - минимум осязание, лучше слух, в идеале - зрение с возможностью различать текст.

    Наличие цнс(хотя судя по тому коду что я пишу - это опционально).
    Ответ написан
    Комментировать
  • Создание сайта нарушение прав?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Трансляция любого фильма разрешена только по лицензии правообладателя/дистрибьютора.

    Если я буду качать контент в свободном доступе

    Если ты нашел на улице наркотики (в свободном доступе лежали на улице) и потом пошел их продавать, будет это нарушением?
    Ответ написан
    1 комментарий