• Что такое полиморфизм?

    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", на куски, идём вглубь по полученной цепочке имён, достаём значение. Опять же, сделал небольшой пример.
    Ответ написан
    Комментировать
  • Как реализовать подзагрузку страницы перед переходом на нее в 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?('')}
    Ответ написан
    Комментировать
  • Как разбить массив на равные части?

    vabka
    @vabka
    Токсичный шарпист
    Ответ легко ищется поисковиком

    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 комментарий