Повторное использование логического кода между приложениями для Android и другими платформами: для ContentProvider или нет для ContentProvider? - PullRequest
4 голосов
/ 09 июля 2011

Я занимаюсь разработкой приложения, которое я хочу сделать доступным как для Android, так и для Blackberry (возможно, для JavaME в будущем).Бизнес-логика будет общей для всех платформ, а следовательно, и соответствующий уровень кода.

Но у меня также есть уровень данных, который, очевидно, будет отличаться для разных платформ.Мой подход к этому - иметь бин и абстрактный класс DataStore.Если бы я использовал образец NotePad для Android, он выглядел бы так:

Note Bean:

public class Note {
    private long id;
    private String title;
    private String note;
    private long created;
    private long modified;

    //Appropriate constructors
    //Getters and Setters
}

Интерфейс хранилища данных:

public interface NoteDataStore {
    public boolean deleteNote(long noteId);
    public boolean addNote(Note note);
    public List<Note> listNotes();
    public boolean editNote(long noteId, Note note);
    public List<Note> search(String searchString);
}

Каждая платформа реализует интерфейс хранилища данных и выполняет постоянный доступ к данным в зависимости от ситуации.Например, реализация Android будет использовать классы SQLite для этой цели.

Таким образом, «слои» более высокого уровня будут общими для всех платформ, если они не используют какие-либо специфичные для платформы функции..

Вопрос:

Разве функциональность хранилища данных выше (частично) не пересекается с функциональностью ContentProvider в Android?Я думал о различных подходах, чтобы сделать это «чище», но я не убежден ни в одном из них:

  • Пусть мой ContentProvider также реализует интерфейс DataStore.Но разве это не загромождает ContentProvider, не говоря уже о том, чтобы «перепутать» обязанности?

  • Реализовать доступ SQLite в ContentProvider - и затем выполнить реализацию DataStore «вызовом»ContentProvider под одеялом.Но как насчет накладных расходов дополнительного слоя?Кроме того, мне все равно нужно было бы использовать ContentProvider напрямую, например, для использования Android Search Framework.Разве это не похоже на дублирование одной и той же функциональности в нескольких слоях?

  • В противоположность вышеуказанному подходу - т. Е. Реализовать SQLite на уровне хранилища данных;и затем имейте ContentProvider вызов к нему под одеялом.Я не могу думать о том, чем это отличается от предыдущего подхода.

В итоге - если бы не было ContentProvider - просто слой DataStore будет работать нормально, и этот дизайнсделает бизнес-логику многократно используемой на разных платформах.Единственная причина, по которой я не могу полностью отказаться от ContentProviders, заключается в том, что некоторые компоненты системы Android ожидают, что вы предоставите данные как ContentProvider (например, Search).

Буду признателен за любые советы о том, как вы справились с этимПрограммы.Заранее спасибо.

РЕДАКТИРОВАТЬ:

Пока не так много ответов.Какие-нибудь советы по повторному использованию кода между различными платформами?Или, может быть, мне нужно перефразировать мой вопрос?(Извините - я новичок в SO. Не уверен, что протокол для "напоминаний").

Ответы [ 2 ]

1 голос
/ 22 июля 2011

Этот вопрос теперь перешел за пределы ContentProvider и перешел на более общую территорию. Я реализовал то, о чем писал в исходном вопросе, используя второй пункт - т. Е.

Реализация SQLite доступа в ContentProvider - и затем реализация DataStore "вызывает" ContentProvider под одеялом

Однако, продолжая, я вижу больше таких проблем в попытке сохранить общий код. Несколько примеров:

  1. java.util.List недоступно на платформах Blackberry и JavaME. Единственный обходной путь - использовать массивы или Vectors. Насколько хитом является использование Vector с в Android?

  2. Библиотеки для привязки POJO к XML / JSON плохо работают на платформах JavaME / BB. Некоторые из этих библиотек используют рефлексию (GSON), в то время как большинство из них используют аннотации или, по крайней мере, java.util.List. Ни один из которых не доступен на JavaME. Следовательно, для этих платформ лучше всего написать логику синтаксического анализа / формирования XML / JSON вручную. Возникает вопрос: как только вы попытаетесь написать такой парсер, почему бы не использовать его и на Android?

  3. JavaME / BB не поддерживают Generics. Хотя это не является большой проблемой как таковой (поскольку весь мой код является внутренним, а не API), я либо увижу слишком много предупреждений в Eclipse, либо слишком много @SuppressWarnings("rawtypes") в моем коде!

Ну, хорошо. Похоже, то, что я намеревался достичь и предположил, что это простая задача, намного сложнее!

1 голос
/ 09 июля 2011

Бизнес-логика будет общей для всех платформ, а значит, и соответствующий слой в коде.

Подавляющее большинство вашего кода будет отличаться для Android и вашегодругие версии.Blackberry и J2ME используют несколько десятков классов для Android, в основном в java.io и java.util.Даже вашей «бизнес-логике» понадобятся классы вне пересечения трех библиотек классов, скорее всего.

Следовательно, я бы не стал беспокоиться о попытках создать общую кодовую базу.Общий дизайн, конечно.Взаимозаменяемые модели данных, конечно.Фактический буквенный код, о котором не стоит беспокоиться, ИМХО.

Разве функциональность хранилища данных выше (частично) не пересекается с функциональностью ContentProvider в Android?

API перекрываются с точки зрения действий.Вот и все.

Единственная причина, по которой я не могу полностью отказаться от ContentProviders, заключается в том, что некоторые компоненты системы Android ожидают, что вы предоставите данные как ContentProvider (например, Search).

Да, но в этих случаях «система Android» не будет поддерживать вашу модель данных.Например, для поиска требуется довольно специфическая ContentProvider реализация, а не просто какая-либо старая.

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