我正在J2ME中开发一个应用程序,它将部署在不同的平台上(全部支持J2ME)
对于UI,我将使用LWUIT并确保它在每个平台上渲染大致相同。 (LWUIT是跨平台的)
我知道每个平台都有自己的细微差别,例如库的可用性/缺失,我想知道最好的行动方案是
A)为每个平台创建一个新项目(例如一个用于Blackberry,一个用于诺基亚),并在它们之间复制并粘贴类似的可重用代码;基本上保持4-5个类似的代码库。
OR
B)有一个大项目充斥着"如果"或"开关"说(IF平台== x然后做xx)。
任何人都可以告诉我,如果上面有一些严重的愚蠢的疏忽,我不会接受?我倾向于实施A,但我认为两者都有一些可维护性问题。
非常感谢
菲尼克斯
答案 0 :(得分:1)
维护多个代码库是大多数开发人员更愿意避免的问题。
Afaik大多数开发人员使用预处理器,这基本上允许您在代码中使用大量if句子,而不会使jar文件变大。
我在所有JavaME游戏项目中都使用了预处理,能够使用一个代码库编译到多个目标。
//#if ScreenWidth==240
tilesize = 16;
spriteSheet = Image.createImage("sprites16x16");
//#endif
//#if ScreenWidth==640
tilesize = 32;
spriteSheet = Image.createImage("sprites32x32");
//#endif
您可能没有听说过预处理,因为它通常不用于Java。但是将它用于JavaME是有道理的,因为设备中存在碎片。我也喜欢能够对Android项目使用预处理,但遗憾的是,这还不可能。
其他小事,例如诺基亚UI的存在,不需要预处理。只需使用classForname来检查类是否存在,如果是,则将布尔值设置为true。然后在代码中使用此布尔值来检查是否应该执行某段代码。 (例如,我使用Nokia-UI API保持屏幕活跃,因为此API存在于诺基亚和索尼爱立信设备上。)
try {
Class.forName("com.nokia.mid.ui.DeviceControl");
nokiaui = true;
} catch (Exception e) {}
然后在我的游戏循环中:
if (nokiaui) {
com.nokia.mid.ui.DeviceControl.setLights(0, 100);
}
你可以将这样的内容放在预处理块中,但是你会错过可能支持它的设备。
答案 1 :(得分:1)
这总是支持多个平台。
你可以从LWUIT中获取灵感,因为你已经提到了它(https://java.net/projects/lwuit/sources/svn/show/trunk?rev=1653)。这是一个巨大的代码库,它需要时间来遵循它。主要思想是模块化项目,并通过接口和实现隐藏平台特定的细节。并在运行时或编译时通过依赖注入进行配置。
例如,您有Client
类,它将通过http与服务器通信。所以你可能会有下一个结构:
common
Client
Network
j2me
J2MENetwork extends Network
J2MEMidlet
blackberry
BlackBerryNetwork extends Network
BlackBerryApp
因此Network
将是抽象类,并且将有一些关于使用重试构建URL的常见逻辑。 BlackBerryNetwork
将使用特定于平台的API进行网络通信。 Client
将在J2MEMidlet
或BlackBerryApp
中注入正确的实施内容。
建议: 1)不要复制你的代码。维护一个代码库 2)我真的反对预处理。因此,如果根本无法避免它,请尝试将所有预处理集中在一两个工厂类
中 祝你好运,我的祝福!