我正在用J2ME开发一个应用程序,它将部署在不同的平台上(所有这些平台都支持J2ME)
对于UI,我将使用LWUIT,并确保它在每个平台上呈现的大致相同。(LWUIT跨平台)
正如我所知,每个平台都有自己的细微之处,例如库的可用性/缺位,我想知道最好的行动方针是
( A)为每个平台创建一个新项目(例如,为黑莓( Blackberry )创建一个项目,为诺基亚( Nokia)创建一个),并在它们之间复制和粘贴类似的、可重用的代码;基本上一次维护4-5个类似的代码库。
或
( B)有一个大项目充斥着"if“或"switches”,上面写着(如果平台== x那么做xx)。
有人能告诉我,上面的话是否有一些严重的愚蠢的疏忽,我没有捡到吗?我倾向于实现A,但是我认为两者都存在一些可维护性问题。
非常感谢
费尼克斯
发布于 2014-08-21 05:46:53
维护多个代码库是大多数开发人员喜欢避免的。
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项目进行预处理,但遗憾的是,这还不可能。
其他一些次要的事情,比如Nokia的存在,不需要预处理。只需使用classForname检查类是否存在,如果存在则将布尔值设置为true。然后在代码中使用这个布尔值来检查是否应该执行某一段代码。(例如,我使用Nokia来保持屏幕的活力,因为这个API存在于诺基亚和索尼爱立信设备上)。
try {
Class.forName("com.nokia.mid.ui.DeviceControl");
nokiaui = true;
} catch (Exception e) {}然后在我的游戏循环中:
if (nokiaui) {
com.nokia.mid.ui.DeviceControl.setLights(0, 100);
}也可以将类似的东西放在预处理块中,但这样就会错过可能支持它的设备。
发布于 2014-08-21 07:21:15
这始终是taft支持的几个平台。
您可以从LWUIT获得灵感,因为您已经提到它(https://java.net/projects/lwuit/sources/svn/show/trunk?rev=1653)。这是一个庞大的代码库,它需要时间来遵循它。其主要思想是模块化项目,并通过接口和实现隐藏平台特定的细节。并在运行时或编译时通过依赖注入配置它。
例如,您有将通过http与服务器通信的Client类。因此,您可能会有下一个结构:
common
Client
Network
j2me
J2MENetwork extends Network
J2MEMidlet
blackberry
BlackBerryNetwork extends Network
BlackBerryApp因此,Network将是抽象类,并将具有一些关于使用重试构造urls的公共逻辑。BlackBerryNetwork将使用特定于平台的API进行网络通信。Client将在J2MEMidlet或BlackBerryApp中注入正确的实现。
建议: 1)不要复制代码。维护一个代码库2)我真的反对预处理。因此,如果根本无法避免,请将所有预处理集中在一个-两个工厂类中。
祝你好运和我最美好的祝愿!
https://stackoverflow.com/questions/25400773
复制相似问题