• JavaScript: Архитектура приложения с нуля?

    alexiusp
    @alexiusp
    senior frontend developer
    Если говорить о высокоуровневой архитектуре приложений, то я в последнее время сталкиваюсь с двумя подходами: шина событий (event bus) и flux/redux. В клиентской части популярнее вторая, в серверной - первая (за счёт популярности микросервисной архитектуры). У обоих подходов есть свои плюсы и минусы, серебряной пули нет. Для обоих подходов есть соответствующие библиотеки в документации к которым обычно описаны best practices.
    Кроме того, не стоит бояться писать говнокод, особенно для своих проектов. Вы не научитесь писать хороший код, если не будете знать, что такое говнокод. Напишите так, как можете приложение до работающего прототипа, а потом, в следующей итерации, подумайте, как можно сделать лучше. Преждевременная оптимизация - главный враг перфекциониста!
    P.S.: забыл добавить, что прямые взаимные зависимости между компонентами - это действительно наихудший подход. Оба описанных подхода преследуют одну цель - избавиться от этих зависимостей.
    Ответ написан
    Комментировать
  • Как выбрать программиста с адекватной ценой за час?

    @cicatrix
    было бы большой ошибкой думать
    Знаете, это рынок.
    Представьте себе, не дай бог, у вас судебное разбирательство, и надо вам нанять адвоката. Один стоит 1000 р. в час, другой - 15000 р. в час. Как оценивать работу адвоката?

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

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    В чем отличие абстрактного класса от интерфейса в Java?


    Все упирается в понятие "тип". В былые времена, то есть во времена языка Simula, из которого черпали вдохновение создатели C++, были только классы. И на классах базировалась система типов. Причем механизм наследования был реализован так, как реализован, исключительно для экономии памяти, которая в те времена была очень дорогой.

    Для того чтобы достичь полиморфизма, мы должны иметь возможность объявлять абстрактные типы. Мол "любая хрень которая имеет такой тип будет работать как надо". Потому в языках типа C++ появились абстрактные классы. Поскольку иногда нам хочется делать композицию абстрактных типов, в C++ реализовали множественное наследование.

    В Java, которая во многом черпала вдохновения из C++ и smalltalk, решили ввести еще одну сущность - интерфейсы. Это был своего рода упрощенный способ задать абстрактный базовый тип. По итогу чтобы не решать проблему бриллианта (или ромба) от множественного наследования было решено отказаться и дать возможность классам имплементить несколько интерфейсов.

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

    В целом абстрактные классы нужны тогда, когда вам нужно наследование. Обычно это в ситуациях, когда у вас есть несколько классов, которые должны иметь общий абстрактный тип (то есть нельзя выделить наиболее слабого по ограничениям предка). Например если мы делаем цепочку классов String <- Email, то тут нет смысла в абстрактных классах так как тип String уже включает в себе подмножество типов Email.

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

    Так же рекомендую к прочтению: www.javaworld.com/article/2073649/core-java/why-ex...
    Ответ написан
    9 комментариев
  • Как связать андроид приложение с сайтом?

    gadfi
    @gadfi
    https://gamega.org
    1) у сайта должно быть api которое отдает информацию
    2) картинки нужно отдавать в разных размерах, иначе будет лагать (это очень важно, для листалки сначала отдаете маленькие привьюшки, потом если надо подгружаете в полном размере)
    3) для запросов рекомендую retrofit
    4) для асинхронной подгрузи картинок picasso
    Ответ написан
    Комментировать
  • Как правильно верстать android ui?

    Rou1997
    @Rou1997
    Все стандартными можно сделать, кроме разве что диаграммы кольцевой, в верстке ничего сложного, например легенда диаграммы (completed - snoozed - overdue) это обычный горизонтальный LinearLayout, к "кастомизации" дизайна стандартные виджеты достаточно гибки.
    Ответ написан
    Комментировать
  • Трекер geektimes/habr на Android-устройствах?

    GavriKos
    @GavriKos
    Что значит трекер? Мониторить новости? Смотрите в сторону RSS.
    Ответ написан
    Комментировать
  • Как правильно организовать взаимодействие между Service и Activity?

    gadfi
    @gadfi
    https://gamega.org
    я согласен с IceJOKER но для хождения в бд порекомендовал бы использовать что то другое
    например CursorLoader он наследуется от AsyncTaskLoader и в связке с ContentProvider приносит в нашу жизнь очень приятную магию и прекрасное быстродействие из коробки))
    или если вы не хотите использовать отвратительное api ContentProvider посмотрите в сторону rxjava
    Ответ написан
    Комментировать
  • Какова значимость диплома в бизнесе по СНГ (IT индустрия)?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    Диплом в первую очередь нужен чтобы свалить в другую цивилизованную страну, ибо многие из них потребуют от вас диплома для получения визы.
    Заведомо ограничивать себя одними лишь странами снг, которые крайне стремительно катятся в бездну, это крайне сомнительное и пессимистичное решение.
    Ответ написан
    8 комментариев
  • RxJava в Android - все таки "мода" или "острая необходимость"?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    ГЛАВНЫЙ КОЗЫРЬ RxJava: УДОБСТВО КОДИРОВАНИЯ и ЭКОНОМИЯ ВРЕМЕНИ НА РАЗРАБОТКУ и как следствие чуть ли ни мгновенный выпуск продукта в паблик.
    МИНУС: доп. время на исполнение, т.к. это "прослойка".

    А теперь, про остальное:
    Если кратко: почему для простых операций ГРАМОТНЫЕ КОДЕРЫ не подключают jquery, а пишут на нативном javascript'e? Чтобы обеспечить приложению более высокую производительность.

    RxJava - это как бы тот же jquery (или фреймворк), т.е. еще одна "прослойка" уменьшающая время разработки и упрощающая процесс написания кода для кодеров, НО!!! в разы увеличивающая время исполнения и требования к "железу".

    RxJava в Android — все таки «мода» или «острая необходимость»?
    это фреймворк-"времянка", PR-я который можно на какое-то время удержать мобильный рынок разработчиков (выиграть время для выпуска замены) на данной платформе.

    Действительно, Google понимает, что отношение показателя рынка разработчиков к производительности готовых приложений у него: 80/20, в то время как у других: 20/80 (Nokia та же) и что скоро Google скорее всего поменяет язык разработки на свой (и всю парадигму в целом), в ином случае - они будут не конкурентно способны. Но пока они это делают - они будут молчать. Скорее всего они перейдут на javascript с нативным "движком" на ядре ОС.

    Линки:
    1. В 4-х частях перевод о RxJava для разработки под A...
    2. Что ожидать от использования javascript в 2016 год...
    Ответ написан
  • Как реализовать GPS трекер для iPhone?

    Flanker_4
    @Flanker_4
    Буквально недавно отвечал на подобный вопрос
    iOS предоставляет сервисы для обнаружения входа в регионы. Вы добавляете интересующие Вас места и iOS сама разбудит приложение когда пользователь войдет

    Возможно ли в ios отслеживание местоположения закрытым приложением?
    Ответ написан
    Комментировать
  • Онлайн сервис по написанию мануала/документации?

    Vlad_IT
    @Vlad_IT
    Front-end разработчик
    Такое? https://readthedocs.org/ Получится вот такое peewee.readthedocs.org
    Ответ написан
    Комментировать
  • Какой должен быть файл proguard-rules имея следующую структуру проекта?

    Вам ненужно ничего дополнительно прописывать.После билда .apk, код будет автоматически обфусцирован. "proguard-rules.pro" , нужен для того, чтобы не дать ProGuard сломать некоторые вещи, из-за которых может вылететь ClassNotFoundException.Пример : -keep public class , или -dontwarn com.example.something , если ProGuard на что-то ругается.
    Также в этом файле можно указать параметры обфускации, но они не являются обязательными.

    Update:

    Имена активностей не обфусцировались, потому что они указаны в манифесте.Так что, вы всё поняли правильно.
    Ответ написан
    Комментировать
  • С точки зрения парадигмы ООП какие объекты следует выделить в программе калькулятор?

    edli007
    @edli007
    full stack, team lead
    Это вопрос больше философский и зависит от виденья структуры вашей программы.
    Можно сделать например только каркас MVC, где будет два M,
    - Где первый будет валидировать данные
    - а второй производить базовые арифметические расчеты.
    C будет осуществлять общую логику приложения а V итак понятно.
    Итого 4 класса.

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

    И при этом, эти классы могут содержать другие классы, например история изменений может быть отдельным классом.

    Добавить сюда также абстрактные классы.

    Исходя со всего этого, выходит что классы могут встречаться на не ограничено малой величине логики, а классы отвечающие за "большие структуры", зависят от виденья структуры приложения самим программистом.
    Ответ написан
    Комментировать
  • Что делают делегаты в C#?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Вашу задачу можно сделать тремя способами:
    1) создать метод, который будет суммировать каждый элемент списка в переменную, точнее, в поле класса.
    long Result;
    long Sum(List<int> intList)
    {
        Result = 0;
        intList.ForEach(AddElement);
        return Result;
    }
    
    void AddElement(int i)
    {
        Result += i;
    }

    2) Чтобы не создавать "лишнюю" функцию, необходимую только для конкретной задачи, то можно взять анонимную функцию. Анонимные функции в C# используются с помощью делегатов. Дополнительно, анонимные функции могут использовать замыкания, и нет необходимости создавать внешнее поле.
    long Sum(List<int> intList)
    {
        long result = 0;
        intList.ForEach(delegate(int i) { result += i; });
        return result;
    }

    3) Можно взять лямбду - в данном случае, это "синтаксический сахар" - упрощение создания делегата.
    long Sum(List<int> intList)
    {
        long result = 0;
        intList.ForEach(i => result += i);
        return result;
    }
    Ответ написан
    2 комментария
  • В чем разница у iOS и Android при работе с камерой?

    @FoxInSox
    Это разработчики ленятся работать с камерой android или все-таки у самой ОС с этим беда?

    Беда у вас с Гуглом. У разработчиков и системы все ок:
    https://play.google.com/store/apps/details?id=me.m...
    Ответ написан
    1 комментарий
  • Есть ли сервисы по бета тестированию?

    @georgeci
    Помимо Google Play мы используем https://fabric.io/. Он полностью бесплатен.
    Ответ написан
    3 комментария
  • Есть ли сервисы по бета тестированию?

    petermzg
    @petermzg
    Самый лучший программист
    Вы заглядывали в Google Play Developer Console.
    Там можно опубликовать альфа и бета версии
    Ответ написан
    2 комментария
  • Как выбрать открытый проект на Python для поддержки?

    EvilsInterrupt
    @EvilsInterrupt
    System programming, Reversing Engineering, C++
    Вливайтесь в сам проект по развитию Python-а. Там же много работы: Перевод, документация, библиотеки, CPython и др. Да. Сразу будет жесть как тяжело, но зато потом, потом будет такая визитная карточка, что достаточно быстро будете находить новую работу.
    Ответ написан
    2 комментария
  • Добавлять ли virtualenv в git?

    idegree
    @idegree
    Senior Workaround Developer
    Лучше писать зависимости в requirements.txt и уже этот файлик добавлять в git.
    Пример файла (можно с указанием версий через ==, можно без):
    Django==1.8.5
    django-flat-theme==1.1.1
    mysql-python==1.2.5
    gunicorn==19.4.1
    pytz==2015.6
    python-memcached==1.57
    django-debug-toolbar==1.4


    При клонировании репозитория на другой компьютер или сервер выполните (предварительно создав и активировав нужное виртуальное окружение):
    $ pip install -r requirements.txt
    Таким образом, вы разом установите все необходимые пакеты.
    Ответ написан
    3 комментария