2011-07-09 7 views
4

私は、AndroidとBlackberryの両方で(将来的にはJavaMEに)利用できるようにしたいアプリを開発しています。ビジネスロジックはすべてのプラットフォームに共通しているため、コード内の対応するレイヤーも同様になります。Androidと他のプラットフォーム用のアプリケーション間でのロジックコードの再利用:ContentProviderまたはContentProviderには?

しかし、私はまた、明らかにさまざまなプラットフォームとは異なるデータレイヤーを持っています。私のアプローチは、Beanと抽象データストアクラスを持つことです。私はAndroidのメモ帳のサンプルを使用していた場合、それは次のようになります。

注豆:

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のものと(部分的に)重複上記データストアの機能はないのですか?私は、この「きれい」を作るために様々なアプローチを考えたが、私はそれらのいずれかと確信していない:

  • ContentProviderもデータストアインタフェースを実装してもらいます。 しかし、これによってContentProviderが乱雑になるのではなく、責任を「ミックスアップ」していませんか?

  • ContentProviderでSQLiteアクセスを実装して、DataStore実装でContentProviderを「呼び出し」するようにしてください。 しかし、追加レイヤーのオーバーヘッドはどうですか?さらに、私はContentProviderを直接使用する必要があります。たとえば、Android Search Frameworkを使用する場合などです。それは複数のレイヤーで同じ機能を複製するようなものではありませんか?

  • 上記のアプローチの逆です。つまり、SQLiteをデータストアレイヤーに実装します。カバーの下にContentProviderの電話をかけてください。これが以前のアプローチとどのように違うのか、私は考えることができません。

ボトムラインがある - それはContentProviderのためではなかった場合 - ちょうどデータストア層が正常に動作しますと、このデザインは、プラットフォーム間でのビジネス・ロジックを再利用可能になるだろう。私がContentProvidersを完全に破棄できない唯一の理由は、Androidシステムの特定のコンポーネントが、ContentProvider(Searchなど)としてデータを公開することを期待していることです。

あなたのアプリでこれをどのように処理したかに関するヒントをお寄せいただきありがとうございます。前もって感謝します。

EDIT:

多くの未応答これまでのところ。さまざまなプラットフォーム間でのコードの再利用に関するヒントまたは、おそらく、私は自分の質問を書き直す必要がありますか? (申し訳ありません - 私は新しいので、プロトコルは "リマインダー"のためのものではありません)。

答えて

1

ビジネスロジックはすべてのプラットフォームに共通しているため、対応するコードも同様です。

あなたのコードの大部分は、Androidと他のバージョンで異なります。 BlackberryとJ2MEはAndroidで数多くのクラスを共有しており、ほとんどがjava.iojava.utilです。あなたの "ビジネスロジック"でさえ、おそらく3つのクラスライブラリの交差点の外にクラスが必要です。

したがって、共通のコードベースを使用しようとすると心配する必要はありません。共通のデザイン、確かに。交換可能なデータモデル、確かに。実際の文字コード、心配する価値はない、IMHO。

上記の(一部)データストアの機能がAndroidのContentProviderの機能と重複していませんか?

APIはアクションの点で重複しています。それはそれです。

私がContentProviderを完全に破棄できない唯一の理由は、Androidシステムの特定のコンポーネントが、ContentProvider(検索など)としてデータを公開することを期待しているからです。

真実ですが、そのような場合、「Androidシステム」はあなたのデータモデルをサポートしません。たとえば、古いものだけでなく、かなり具体的なContentProviderの実装が必要です。

+0

実際のコードの再利用の程度はビジネスロジックに依存していると言えます。私はアンドロイド、BB&JavaMEの味を持っていた連絡先の同期アプリケーションに取り組んだ。 UIのContact/HTTPレイヤーは各プラットフォーム固有のものでしたが、コードではコア同期レイヤーも共通でした(JARライブラリとして3つすべてのフレーバに配布されました)。このシンクレイヤーは、(設計労力とコードの点で)アプリの「大量の」ものでした。 私の主張は、ビジネスロジックがコードの再利用が可能であるだけでなく有利な場合もあるということです。 – curioustechizen

1

この質問は、ContentProviderポイントを超えてより一般的な領域に移動しました。私は2番目の箇条書きを使用して、私は元の質問にについて投稿していたものを実装しました - ContentProvider

カバーの下に「コール」し、その後 DataStore実装を持っている - すなわち、

ContentProviderSQLiteアクセスを実装します

しかし、私が進むにつれて、コードを共通に保つためにこのような難題が増えています。いくつかの例:

  1. java.util.ListブラックベリーとJavaMEプラットフォームでは利用できません。唯一の回避策は配列またはVectorsを使用することです。 AndroidでVectorを使用するとどれだけヒットしますか?

  2. POJOからXML/JSONにバインドするライブラリは、JavaME/BBプラットフォームではうまく機能しません。これらのライブラリの一部は、リフレクション(GSON)を使用していますが、ほとんどの場合、注釈を使用します(少なくともjava.util.List)。いずれもJavaMEでは利用できません。 したがって、これらのプラットフォーム用のXML/JSON解析/フレーミングロジックを手作業で記述することをお勧めします。これは疑問です。そのようなパーサーを書くための努力がなされたら、Androidでもそれを再利用してみませんか?

  3. JavaME/BBはGenericsをサポートしていません。これはあまり問題ではないが(私のコードはすべてAPIではないので内部的なものだから)、Eclipseであまりにも多くの警告が表示されるか、コードに@SuppressWarnings("rawtypes")が多すぎる!

結局のところ私が達成しようとしていることは単純な仕事であると思われています。

関連する問題