Рубрика «Совершенный код» - 50

Когда PVS-Studio сообщили о том, что они наконец-то выпустили standalone версию, не требующую для своей работы Visual Studio, я, конечно же, не мог пройти мимо :) До этого я уже игрался с пробной версией на коде одного из старых проектов. Сейчас же появилась возможность посмотреть на код нашего последнего проекта, собирающегося в среде разработки AVR Studio (которая eclipse-based).

Для работы требуются файлы сразу после препроцессора. Среда AVR Studio это умеет, с одним маленьким исключением — после включения флага «Только препроцессор» на выходе действительно появляются файлы после препроцессора — но по-прежнему с расширением.о вместо ожидаемого .i. Ну что ж, 5-минутный скрипт на Питоне решает это недоразумение, и анализатор отлично запускается!

На удивление, сообщений мало — около двух десятков. Большинство — незначащие замечания или ложные срабатывания (в embedded запись в регистр одного и того же значения два раза подряд встречается, анализатор же видит в этом потенциальную проблему (и я в общем-то с ним согласен — лучше перестраховаться и проверить такие места)).

В паре мест обнаруживаются реальные опечатки и ошибки копи-паст. Например, переменная типа одного enum-a сравнивается со значением из другого enum-a. Или же одной переменной присваивается два разных значения подряд (хотя, как указано выше, в большинстве случаев это было ложным срабатыванием для записей последовательности в регистр).

Но самой интересной, из-за чего я и пишу этот пост, была одна-единственная строчка «Possible NULL pointer dereferencing»…
Читать полностью »

Несколько советов less разработчикуЗачастую, создавая less-файлы (что, впрочем, касается и других препроцессоров css), мы гонимся за красотой и элегантностью less-кода, когда как частенько забываем про скомпилированный css-код. Иногда это влечет за собой критичные последствия, когда объем конечного css возрастает в раз, а код становится совершенно нечитаемым.
Читать полностью »

PVS-Studio, VirtualDub
Только что, я сел и проверил проект VirtualDub с помощью PVS-Studio. Выбор был случаен. Я считаю, самое главное регулярно проверять/перепроверять различные проекты, чтобы показать, как развивается анализатор кода PVS-Studio. А какой проект будет проверен, не так важно. Ошибки есть везде. Проект VirtualDub мы уже проверяли в 2011 году, но тогда почти ничего интересного не нашлось. Вот я и решил посмотреть, как обстоят дела, спустя 2 года.

Читать полностью »

Немножко пятничного настроения в субботу. Я думаю, все видели этот код:

image

Но Aras Pranckevičius пошел еще дальше. Как написать код, который не так просто обнаружить?
И если вначале идут простые примеры, то дальше начинается…
Читать полностью »

Хаскель отличает себя от большинства функциональных языков тем, что имеет глубокие культурные корни из области математики и информатики, которые дают обманчивое впечатление, что Хаскель плохо подходит для решения практических задач. Однако, чем больше вы знаете Хаскель, тем больше вы цените то, что теория часто является наиболее практическим решением многих общих проблем программирования. Этой статьёй хочется подчеркнуть эту точку зрения тем, что мы смешаем имеющиеся в наличии теоретические основы и создадим чистую пользовательскую систему потоков.
Кооперативные потоки с нуля в 33 линии на Хаскеле
Читать полностью »

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

Не подвергая сомнению эффективность вышеприведённых методов, предлагаю Вашему вниманию сортировку, которая при определённых входных данных легко уделывает по скорости любой другой алгоритм.
Читать полностью »

The Good, the Bad and the Ugly code
Хороший код или плохой? Лично для меня хороший код обладает следующими качествами:

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

Несмотря на короткое описание, о том, как добиться выполнения трех этих условий, написано много толстых книг.

Почему именно эти критерии? Сразу оговорюсь, речь сейчас идет о разработке ПО для бизнеса (enterprise application). Критерии оценки кода для систем реального времени, самолетов, систем жизнеобеспечения и МКС отличаются.
Читать полностью »

В данной статье последовательно рассматриваются различные аспекты улучшения производительности приложений на примере мной разработанного поисковика приложений для мобильной операционной системы Андроид. Если сам поисковик может пригодиться различным пользователям с большим количеством программ, то статья будет интересна в первую очередь разработчикам (не только андроид-разработчикам). И для всех читателей, независимо от платформы, в конце прикреплён опрос "Что для меня в первую очередь важно в мобильном приложении?"

Приветствую Вас, читатели хабра,

начну с небольшой предыстории — с описания проблемы, а далее продолжу тем, как я проблему решал.

Я, как гордый обладатель андроид-телефона, очень рад открытости системы и возможности ставить туда множество приложений как из разных маркетов, так и скачанных откуда-то. В среднем на моём старом добром Galaxy Note около 150 приложений, большинством из которых я периодически пользуюсь.

С чувством, что чем больше коров приложений, тем больше молока пользы от моего телефона, я заметил, что кучу времени я провожу в листаниях от экрана к экрану в поисках иконки нужного приложения. Когда коров программ мало, тогда их легче найти. Их можно поставить на домашний экран или разнести по папочкам. Всё это хорошо и удобно, если используются 20-30 приложений.
Но раз уж я отношусь к категории хэви-юзеров, то начал искать быстрый метод поиска приложений.

Требования к решению проблемы довольно просты:
поиск должен быть быстрым и ресурсосберегающим (процессор, батарея), а также всё должно происходить автоматически — я не хочу ничего сам устанавливать, сортировать или распихивать по папкам.

Оптимизация скорости [поиска] приложений на примере FAppSter для AndroidДля решения поставленной задачи начал искать приложение для быстрого поиска и нашёл в маркете несколько аппликаций для поиска и запуска приложений, но у всех у них были различные недостатки, особенно в поиске, поэтому пришлось довольствоваться стандартным андроидным поиском от Google. Он был конечно медленноват, но искал неплохо и находил, что нужно.

В какой-то момент после апдейта на андроид 4.1 на смену поиску пришёл Google Now, который вдруг перестал работать без соединения с интернетом (возможно только у меня?), жутко начал грызть батарею и предлагать мне поездки, куда я вовсе ехать и не хочу. Только вот искать программы совсем перестал.

С мыслью: «Ээх, гугл, что ж с тобой стало — менеджеры по сбору личных данных заменили разработчиков» стал искать другие программы, но окромя сплошных лаунчеров, которые надо самому настраивать, ничего не нашёл (возможно не по тем словам искал).

Ну раз ничего нет, что же делать, я и сам копать траншею по клавишам в IDE бить умею, думаю, там делов-то на день, сделаю сам себе удобную прогу — как говорится: «Лучше день потерять, а потом за час долететь».

Главное условие: нахождение результата должно происходить быстро.

Вот об этом и поговорю в этой статье (чтоб не скучно было, текст будет периодически сопровождаться кодом)
Всё, что написано не ново, а скорее является подборкой того, на что нужно обращать внимание для улучшения быстродействия программ.
В качестве наглядного примера приведена конкретная программа, написанная в Java для ОС Андроид, но приведённые аспекты распространяются и на другие среды.

Читать полностью »

В качестве реакции на мой предыдущий пост о защитном программировании, один из моих читателей прислал мне такой вопрос:
[Один] очень известный сценарий защитного программирования встречается, когда входным параметром является IEnumerable

public class Publisher
{
    public Publisher(IEnumerable<Subscriber> subscribers)
    {
        // defensive copy -> good or bad?
        this.subscribers = subscribers.ToArray();
    }
    //  …
}

Читать полностью »

Автономность проектов

Существует мнение, что разработку проекта можно закончить. В основном, так считают люди, далекие от самой разработки, но и внутри каждого разработчика есть ощущение, что когда-нибудь это закончится и все будет работать хорошо и само.
Этот пост я написал для разоблачения самообмана и возможности сослаться на него в диалогах. Я постарался приводить понятные аналогии и примеры.
Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js