我目前正在实施Monotouch应用程序,最终将移植到Monodroid。该应用程序只是OData Web服务的客户端。没有什么太花哨或性能至关重要。
挑战在于尽可能多地重用代码。我知道Monotouch和Monodroid的UI API完全不同,但我希望重用数据数据抽象和业务层。
由于我的UI层遵循MVP模式,我也希望通过编码每个视图的抽象表示来重用UI控制器。但是,我只能猜测这是否有效,因为我还没有被允许进入Monodroid测试版。
现在我的问题:
您如何看待这种方法?这是一个好主意,还是会因为iPhone和Android之间的UI概念不同而导致平庸的应用程序?
您能否提供有关如何构建应用程序的任何提示,以最大限度地重复使用代码?
谢谢,
阿德里安
答案 0 :(得分:15)
我会说后者,但您绝对可以重复使用大部分业务和域对象。在Monodroid中使用相同的Mono Sqlite,因此应用程序的数据持久性部分(如果使用它)可以重复使用。
我不打算创建一个中间层UI - 两者完全不同。例如,在Android应用上,您有底部菜单,其中可以包含6个屏幕按钮。在iPhone上,您很可能在标签栏或工具栏中没有6个按钮。为此制定一个共同的模式对你没有多大帮助。
另一个例子是ListViews(UITableViews)。他们完全不同。正如你所期望的那样Monodroid的实施忠实于丑陋的Java妹妹。在Android上你不必使用Apple强加给你的间接的巨大纠结,而只需要一个简单的ArrayAdapter作为数据源 - 为更复杂的布局子类化。
另一个需要注意的重要事项是 Android没有一个屏幕尺寸。您为3 different screen densities创建图像。字体大小不是绝对的。
Android为您提供类似于XAML和网络的布局机制,在iPhone上你不是那么幸运(或者更幸运,取决于你如何看待它)因为一切都是绝对定位的(他们可以这样做,因为它总是480)。
我认为你已经掌握了大部分用于数据和坚持控制器的单独层。在没有看到你的应用程序的情况下,很难说它是多么容易重复使用控制器(无论你使用UITableViews还是自定义uis),但Android的开发速度要快得多,我认为它应该是一项快速的任务。
(我正在进行Monodroid预览并且还有一个MT应用程序)
答案 1 :(得分:7)
听起来你有一个相当坚实的概念。事实上,有一个名为MonoCross的开源项目(http://code.google.com/p/monocross/)使用MVC模式做类似的事情。
Miguel de Icaza已经分出了一个看起来很酷的MVVM项目,可能对你有所帮助。 https://github.com/migueldeicaza/MonoTouch.MVVM
答案 2 :(得分:3)
我已经为我的Presentation层成功实现了MVC模式,域模型,服务层,存储库和Common都是平台无关的。我需要有特定于平台的代码,例如NetworkConnectionManager(我的名字),我使用#if #endif来包装对象或我需要做的单元测试我使用Console应用程序进行所有单元测试,它完全相同项目作为Android,iPhone和Windows Phone项目,除了我省略了UI层,这是所有用户界面平台特定的crud。我还使用CONSOLE定义标记我的控制台,并使用ANDROID定义我的Android项目,以便我可以执行#if #endif
我必须说它很有效,如果我可以在控制台中将我的整个MVC层置于单元测试之下并让它在Android下工作,那么我可以在iPhone和Windows Phone下工作,因为控制台没有甚至有一个界面。这是测试Presentation层的Genericness的完美方式。虽然我采取的这种方法可能有点矫枉过正,我计划长时间支持这个应用程序,我还计划将其移植到Android平板电脑,iPad和Windows 8框架,因此IMO必须花费额外的时间才能做到这一点
我尝试了MVP模式,但在这种情况下它不够灵活。我也尝试了各种框架,但我最终定制了整个框架,因为它给了我最大的灵活性。无论如何,如果你没有对抽象,泛型和面向对象设计有一个非常全面的把握,那么我建议采用一种更简单的方法,或者你会让你的生活变得难以实现。
如前所述,Android有很多细节,例如我遇到的最大问题是多线程或异步操作和活动轮换,这将完全破坏你的活动并重新创建它随之消除你的视图。我选择了自己管理所有旋转配置的路径,这意味着我必须手动清理活动使用的所有drawable和资源。
答案 3 :(得分:2)
我尝试做类似的事情 - 在我的情况下,因为我想使用VS和我所有的Windows开发工具尽可能多的代码。
然而,我还原到模型层是“通用的” - 并且在Mac上(即在MonoDevelop中)执行UI层(控制器和视图)。所涉及的工作对于我正在进行的相对较小的应用来说是过度杀伤 - 而且只有我是唯一一个正在努力的应用程序。
此外,如果您是iPhone和/或Android新手,尝试做一些相对复杂的事情会使查找样本或获得问题答案变得更加困难。我发现自己的生活更加艰难(当然是在我工作的早期)。
当然,在不了解项目和商业模式的细节的情况下,很难给出任何具体的建议,但这些是我的经验 - 因为它们的价值。
答案 4 :(得分:0)
可能有点晚了,但这个cross-platform mobile development视频非常有用。我也在写一个MT应用程序,它将被移植到Android和WP。对于数据存储,我正在认真考虑Vici CoolStorage,它应该创建数据模型completely re-usable。此外,我正在将任何与平台无关的代码移动到解决方案中的Utilities和Common项目中。我也希望能够在MD和WP中重用Web服务通信代码。其余的是iOS特定的。
了解项目进展情况将非常有趣。代码可重用性真的得到了回报吗?