2011-07-09 39 views
4

我正在開發一個應用程序,我希望爲Android和Blackberry提供這兩個應用程序(將來可能會提供給JavaME)。業務邏輯對於所有平臺都是通用的 - 因此,代碼中的相應層也是如此。針對Android和其他平臺的應用程序之間的邏輯代碼重用:要ContentProvider還是不ContentProvider?

但我也有一個數據層 - 這顯然會與各種平臺不同。我的做法是有一個bean和一個抽象的DataStore類。如果我使用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類。

這樣,所有平臺之間的更高層次的「層」將是常見的 - 只要它們不使用任何平臺特定的功能。

問題:

並不上述(部分地)與在Android中ContentProvider的重疊數據存儲的功能?我想到了各種辦法,使這個「清潔工」,但我不相信任何人:

  • 有我ContentProvider也實現了數據存儲接口。 但是,這不是混亂的ContentProvider,更不用說「混搭」了責任嗎?

  • ContentProvider中實現SQLite訪問 - 然後讓DataStore實現「調用」下面的ContentProvider。但是,附加層的開銷如何?另外,我仍然需要直接使用ContentProvider,例如使用Android搜索框架。是不是像在多個圖層中複製相同的功能?

  • 上述方法的逆 - 即在DataStore層中實現SQLite;然後讓ContentProvider打電話給它。我想不出與以前的方法有什麼不同。

底線是 - 如果不是因爲ContentProvider - 僅僅是數據存儲層將做工精細而這種設計會使得跨平臺的業務邏輯重用。我無法完全拋棄ContentProviders的唯一原因是Android系統的某些組件希望您將數據公開爲ContentProvider(例如Search)。

如果您在應用中處理過這些問題,我將不勝感激。提前致謝。

編輯:

沒有多少迴應爲止。關於各種平臺之間的代碼重用的任何提示?或者,也許我需要重新提出我的問題? (我很抱歉 - 我是新手,不確定協議是用於提醒的)。

回答

1

業務邏輯對於所有平臺都是通用的 - 因此,代碼中的對應層也是如此。

Android和其他版本的絕大多數代碼會有所不同。黑莓和J2ME與Android共享幾十個課程,主要在java.iojava.util。即使您的「業務邏輯」也需要三類圖書館交叉點之外的類,很可能。

因此,我不會擔心有人試圖建立一個共同的代碼庫。共同的設計,當然。可以互換的數據模型,當然。實際的文字代碼,不值得擔心,恕我直言。

上面的DataStore的功能沒有(部分)與Android中的ContentProvider的功能重疊嗎?

這些API在操作方面重疊。就是這樣。

我不能完全丟棄ContentProviders的唯一原因是Android系統的某些組件期望您將數據公開爲ContentProvider(例如搜索)。

確實如此,但在這些情況下,無論如何,「Android系統」都不會支持您的數據模型。例如,搜索需要一個相當具體的ContentProvider實現,而不僅僅是一個老的。

+0

我想說實際的代碼重用程度取決於業務邏輯。我已經開發了一個具有Android,BB和JavaME風格的通訊錄同步應用程序。用戶界面,聯繫人訪問和HTTP層是特定於每個平臺的 - 但核心同步層在代碼中也很常見(作爲JAR庫分發到所有3種風格)。此同步層絕對是應用程序的「批量」(在設計工作量和代碼方面)。 我的觀點是 - 有些情況下業務邏輯是這樣的,代碼重用不僅是可能的,但也是有利的。 – curioustechizen

1

這個問題現在已經超越了ContentProvider點並進入了更普遍的領域。我沒有實現我曾經在原來的問題使用第二個小點張貼有關 - 即

實現在ContentProviderSQLite訪問 - 然後讓DataStore實施「呼」的封面下ContentProvider

但是,隨着我的繼續,我在嘗試保持代碼的通用性時遇到了更多的挑戰。舉幾個例子:

  1. java.util.List不適用於Blackberry和JavaME平臺。唯一的解決方法是使用數組或Vectors。在Android中使用Vector s有多大成功?

  2. 用於將POJO綁定到XML/JSON的庫在JavaME/BB平臺上無法正常工作。其中一些庫使用反射(GSON),而其中大多數使用註釋或至少java.util.List。 JavaME中沒有一個可用。 因此,最好手動爲這些平臺編寫XML/JSON解析/成幀邏輯。這引出了一個問題 - 一旦編寫了這樣一個解析器的努力,爲什麼不在Android上重用呢?

  3. JavaME/BB不支持泛型。雖然這不是一個「問題」(因爲我所有的代碼都是內部的 - 而不是API),我會在Eclipse中看到太多的警告,或者在我的代碼中有太多的@SuppressWarnings("rawtypes")

好吧,好吧。看起來我想要實現並且被認爲是一項簡單的任務,畢竟是複雜得多!

相關問題