10

我目前正在实现一个最终将被移植到 Monodroid 的 Monotouch 应用程序。该应用程序只是 OData Web 服务的客户端。没有什么太花哨或性能关键。

挑战在于尽可能多地重用代码。我知道 Monotouch 和 Monodroid 的 UI API 完全不同,但我希望重用数据数据抽象和业务层。

由于我的 UI 层遵循 MVP 模式,我也希望通过编码每个视图的抽象表示来重用 UI 控制器。但是,我只能猜测这是否可行,因为我还没有被允许使用 Monodroid 测试版。

现在我的问题:

  • 您如何看待这种方法?这是一个好主意,还是会因为 iPhone 和 Android 的 UI 概念不同而导致应用程序平庸?

  • 您能否提供有关如何构建应用程序以最大限度地重用代码的任何提示?

谢谢,

阿德里安

4

5 回答 5

15

您如何看待这种方法?这是一个好主意,还是会因为 iPhone 和 Android 的 UI 概念不同而导致应用程序平庸?

我会说后者,但您绝对可以重用大部分业务和域对象。Monodroid 中使用了相同的 Mono Sqlite,因此您的应用程序的数据持久性部分(如果它使用)是可重用的。

我不会费心创建中间层 UI - 两者完全不同。例如,在 Android 应用上,您有底部菜单,屏幕上可以包含 6 个按钮。在 iPhone 上,标签栏或工具栏中很可能没有 6 个按钮。为此制定一个通用模式对您没有多大帮助。

另一个例子是 ListViews (UITableViews)。他们完全不同。正如您所期望的那样,Monodroid 实现忠实于它丑陋的 Java 姐妹。在 Android 上,您不必使用 Apple 强加给您的巨大的间接纠缠,而只需一个简单的 ArrayAdapter 作为数据源 - 为更复杂的布局进行子类化。

另一个需要注意的重要事情是Android 没有一个屏幕尺寸您为3 种不同的屏幕密度创建图像。字体大小不是绝对的。

Android 为您提供了类似于 XAML 和 web 的布局机制,但在 iPhone 上您就没有那么幸运了(或者更幸运,取决于您如何看待它),因为一切通常都是绝对定位的(他们可以做到这一点,因为它总是 320x480)。

您能否提供有关如何构建应用程序以最大限度地重用代码的任何提示?

我认为您已经为数据覆盖了大部分内容并坚持使用控制器。如果没有看到您的应用程序,很难说重用控制器有多容易(无论您使用 UITableViews 还是自定义 uis),但 Android 的开发速度要快得多,我认为这应该是一项快速的任务。

(我在 Monodroid 预览版中,也有一个 MT 应用程序)

于 2010-09-21T10:36:06.760 回答
7

听起来你在那里有一个非常可靠的概念。事实上,有一个名为 MonoCross (http://code.google.com/p/monocross/) 的开源项目使用 MVC 模式来做类似的事情。

Miguel de Icaza 已经创建了一个看起来很酷的 MVVM 项目,它也可能对您有所帮助。https://github.com/migueldeicaza/MonoTouch.MVVM

于 2011-09-01T03:14:44.367 回答
3

我已经成功地为我的表示层实现了 MVC 模式,领域模型、服务层、存储库和通用都是平台无关的。我确实需要有平台特定的代码,例如 NetworkConnectionManager(我的名字)项目作为 Android、iPhone 和 Windows Phone 项目,除了我省略了 UI 层,它是所有用户界面平台特定的 crud。我还用 CONSOLE 定义标记我的控制台,用 ANDROID 定义我的 Android 项目,以便我可以执行 #if #endif

我不得不说它工作得很好,如果我可以将我的整个 MVC 层在控制台中进行单元测试并让它在 Android 下工作,那么我几乎可以保证它会在 iPhone 和 Windows Phone 下工作,因为控制台甚至没有界面。这是测试我的表示层通用性的完美方式。尽管我采用的这种方法可能有点矫枉过正,但我​​计划长期支持此应用程序,并且我还计划将其移植到 Android 平板电脑、iPad 和 Windows 8 框架,因此 IMO 有必要花额外的时间来解决这个问题.

我尝试了 MVP 模式,但在这种情况下它不够灵活,无法工作。我也尝试了各种框架,但我最终定制了整个框架,因为它给了我最大的灵活性。这无论如何都不是微不足道的,如果你对抽象、泛型和面向对象的设计没有非常透彻的掌握,那么我建议的方法比我建议的更简单,否则你会让你的生活变得地狱般试图让它工作。

如前所述,Android 有很多来龙去脉,例如我在 Android 上遇到的最大问题是多线程或异步操作和 Activity 轮换,这将完全破坏您的 Activity 并重新创建它,从而消除您的 View随之而来。我选择了自己管理所有旋转配置的路径,这意味着我必须手动清理所有可绘制对象和活动使用的资源。

于 2011-08-31T17:57:51.707 回答
2

我尝试做类似的事情——就我而言,因为我想使用 VS 和我所有的 Windows 开发工具来编写尽可能多的代码。

然而,我恢复到只是让模型层是“通用的”——并在 Mac 上(即在 MonoDevelop 中)做 UI 层(控制器和视图)。对于我正在开发的相对较小的应用程序来说,所涉及的努力是多余的——而且只有我是唯一一个在开发它的人。

此外,如果您是 iPhone 和/或 Android 的新手,尝试做一些相对复杂的事情会使查找示例或获得问题的答案变得更加困难。我发现我让自己的生活变得更加艰难(当然在我使用 iPhone 的早期阶段)。

当然,如果不了解你的项目和商业模式的来龙去脉,很难给出任何具体的建议,但这些都是我的经验——它们的价值所在。

于 2010-09-09T10:02:59.280 回答
0

可能有点晚了,但是这个跨平台的移动开发视频很有帮助。我还在编写一个将移植到 Android 和 WP 的 MT 应用程序。对于数据存储,我正在认真考虑Vici CoolStorage,它应该使数据模型完全可重用。此外,我将任何与平台无关的代码移动到解决方案中的实用程序和通用项目。我也希望能够在 MD 和 WP 中重用 web 服务通信代码。其余的目前是特定于 iOS 的。

了解您的项目进展情况将非常有趣。代码可重用性真的有回报吗?

于 2012-10-24T10:16:33.830 回答