Рубрики
Java

Андроидная венгерско-верблюжья нотация

Для разработчиков OC Android, как и для других серьёзных программистов, существует соглашение по оформлению кода.
В целом оно совпадает с соглашением в обычной Java. Как именно нужно оформлять, можно прочитать на официальной странице для Android разработчиков.

Привожу краткую справку по наименованию полей класса:

  • НЕ паблики и НЕ статики должны начинаться с "m" (анг: Non-public, non-static field names start with m).
  • Статики с "s" (Static field names start with s).
  • Все остальные - со строчной буквы (Other fields start with a lower case letter).
  • Константы - БОЛЬШИМИ_БУКВАМИ (Public static final fields (constants) are ALL_CAPS_WITH_UNDERSCORES).

Активно используется верблюжий регистр (Camel Case).

Пример с официального сайта:

public class MyClass {
    public static final int SOME_CONSTANT = 42;
    public int publicField;
    private static MyClass sSingleton;
    int mPackagePrivate;
    private int mPrivate;
    protected int mProtected;
}

Наверное, гугл не был бы гуглом, если бы не внёс изменения в стандартные соглашения Java. Очень активно используются префиксы.
Для обычных полей "m" (возможно от англ. member), а для статических полей - "s" (static).
Это очень похоже на венгерскую нотацию.

Занятный факт, если пройтись grep-ом по исходникам Android-a, можно найти места, где эти конвенции не соблюдаются. Например статические поля имеют префикс "m":


sources/adndroid-16

./android/app/ActivityThread.java: static ContextImpl mSystemContext = null;
./android/app/SearchManager.java: private static ISearchManager mService;
./android/bluetooth/BluetoothTetheringDataTracker.java: private static String mIface;
./android/content/res/Resources.java: /*package*/ static Resources mSystem = null;
./android/content/res/Resources.java: private static boolean mPreloaded;
./android/database/DatabaseUtils.java: private static Collator mColl = null;
и т.д.

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

UPD! Нужно уточнить, правила действительны для контрибуторов AOSP. То есть тех, кто пишет исходники Андроида.

Рубрики
4. Полезняшки

Отрисовка SVG внутри HTML5 Canvas.

Года два назад в интернете начали появляться статьи, в которых сравнивали SVG и Canvas. В итоге сейчас не составляет особого труда найти сайт, на котором популярно объясняются плюсы и минусы использования SVG-изображений или отрисовки напрямую в Canvas.

Здесь я хотел обозначить совсем другую задачу - отобразить картинку в SVG-формате с помощью API Canvas-a. Другими словами, тема статьи не "SVG против Canvas", а как рисовать SVG картинки внутри Canvas. Подобного рода задача возникнет, например, в случае, если у вас уже есть небольшой набор не слишком сложных SVG-файлов, и вы хотели бы их использовать, при этом ваш графический javascript-овый движок базируется на Canvas-e.

Можно выделить два основных похода:
1. Первый подход.
Парсить SVG файл JavaScript-ом и руками рисовать его в канву.
Один из самых популярных движков, которые реализуют подобный функционал это: http://code.google.com/p/canvg/

2. Второй подход.
На самом деле, многие браузеры умеют рисовать SVG файлы непосредственно в канву методом drawImage. Точно также как обычные растровые изображения (PNG, JPG и т.д.) - https://developer.mozilla.org/en-US/docs/Canvas_tutorial/Using_images.
Проблемы заключаются как всегда в том, что разные браузеры могут делать это по-разному.
В итоге пришлось провести небольшую работу для проверки отображение SVG внутри Canvas-a для различных браузеров. На момент публикации этой статьи получилась следующая картинка: