簡體   English   中英

通過最大化代碼重用為Android和J2ME編寫應用程序的正確設計方法是什么?

[英]What's the right design approach for writing an application for both Android and J2ME by maximizing code-reuse?

大多數人都在問有關從J2ME遷移到Android的問題。 我不是。 我想開發應用程序,並使其在Android和J2ME上均可使用。 顯然,對於每個應用程序,我將擁有一個Android項目和一個J2ME項目,並且兩者都將來自具有共同代碼的共享依賴項目。

我想知道人們認為正確的設計方法應該是最大化代碼重用性(最大化共享項目中的代碼)。

在我典型的J2ME應用程序中,有一個控制器/模型和一堆視圖。
因此,每個視圖都具有對控制器的引用,並且當用戶與該視圖進行交互時,該視圖會調用該控制器的方法,並且控制器決定下一個應顯示的視圖以及該視圖中應包含的數據。 觀點彼此不了解。 我希望如果編寫正確,控制器/模型代碼應該大部分可重用。

問題是:針對多個視圖的1個控制器如何轉換為Android,其中每個活動都執行整個應用程序的子集?

一種方法是只有一個活動(其中有控制器代碼)。
這意味着應用程序將必須處理Back(無論如何對於J2ME都是這樣)。
這也意味着在onAddContextMenu時,它必須知道當前正在顯示哪種頁面才能添加頁面特定的上下文菜單。

另一種方法如下:每個應用程序視圖成為一個活動,而模型控制器從一個活動傳遞到另一個活動。

有什么更好的意見嗎? 其他方法?

我建議使用LWUIT框架。 您可以使用LWUIT進行少量更改來開發基於Android,Blackberry和Midlet的應用程序。 但是在android中,您不能使用RMS概念,PIM API和JSR 172以及某些API。 因此,您只需要更改這些內容。 LWUIT支持觸摸和非觸摸手機。

還有一個信息,您可以在Android平台上使用純Java功能。 因為通常Java ME沒有Map,Set,ArrayList,某些字符串功能等。在Android中,您可以使用所有上述功能。 無需更改,但可以降低代碼的復雜性。

好的,現在我已有一些為兩個平台開發應用程序的經驗(每個平台實際上有2個應用程序),我可以回答自己的問題了。 首先,我必須指出,平台之間的差異不僅僅是UI。 有很多不同的方法,例如藍牙,本地化,通知,存儲等。

1)我使用了一個可以在許多視圖之間切換的控制器,但是我認為,android方式更好,換句話說,應該將控制器分解為較小的子控制器,因此它更適合android的活動。 這樣可以確保僅觸發所需的代碼,而不會在應用程序處於活動狀態時將所有控制器都存儲在內存中。
2)我使用源鏈接而不是項目依賴。 我的每個應用程序都是一個項目,該項目引入了幾個源文件夾(使用鏈接的源)。 例如,一個Android應用程序指向一個android平台impl文件夾,一個通用平台文件夾,一個android藍牙impl文件夾,一個通用藍牙文件夾,一個Android Storage impl文件夾,一個通用存儲文件夾,一個通用控制器文件夾和一個特定於Andtroid的控制器文件夾,以及類似的用於存儲...(J2me應用程序拉入所有通用文件夾,但拉入J2me文件夾而不是android文件夾),每個源文件夾都包含多個軟件包... 3)我使用工廠,因此我擁有android工廠,實現創建android對象(來自android源文件夾)的通用接口和創建j2me對象(來自j2me源文件夾)的j2me工廠,當然創建的所有對象都實現通用接口(來自通用源文件夾)4)i了解了如何在每個平台上處理藍牙,通知,存儲等,而有趣的部分是將您在每個平台上的處理方式抽象為一個通用的 適用於兩個平台的bstract方法。

通過這種方式(源鏈接)進行操作的優點是:
1)我在同一個工作區中擁有所有項目/應用程序(我現在有一個j2me應用程序家族和另一個android應用程序家族)。 我可以看到每個項目中的所有通用代碼,並且可以在進行某些項目時輕松地對其進行修改,顯然,它立即影響到它使用的所有其他項目。
2)重構也很好。 我可以輕松地將類從一個源文件夾移動到另一個源文件夾。
3)用這種方法有趣的是,通常程序員編寫一個基類並將其專門化為子類。 但是通過鏈接不同的源代碼,您可以擁有一些類來擴展兩個不同的超類。 換句話說,我可以讓X類擴展Y類,但是在兩個不同的項目中Y類是不同的。 這使我可以為同一泛型類提供兩個不同的平台特定基類...(這一定會使讀者感到困惑)

因此,即使我的每個項目都鏈接到通用代碼和唯一代碼,我的所有源代碼都放在一個地方,每個項目二進制文件都在項目空間中。 因此,通用的.class文件可能會在使用它們的每個項目中復制。 因此,將所有工作抽象為通用抽象類的內容由我的控制器處理。 通常,以對我的抽象/通用控制器透明的特定於平台的方式來實現抽象類。

好吧,很抱歉這個答案很抽象,所以讓我舉一個更具體的例子:
所以現在我有了一個叫做BluetoothController的東西。 它是一個抽象實體,在J2ME和android中都有實現。 將來,如果我需要在新的android項目中使用Bluetooth,我只需輸入通用代碼和針對android的特定於Android的代碼即可。 如果我想開發一個Midlet,同樣適用於j2me。 我的可重用組件由通用和特定於平台的實體組成。

我希望這個答案能為嘗試為J2ME和android(或其他將來的Java平台)開發應用程序的人們提供一些幫助。
如有任何疑問,可以嘗試與我聯系...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM