处理多个平台
管理平台差异和功能
平台差异不仅存在于跨平台开发中,即使在同一平台的设备中也可能具有不同的功能。
最明显的是屏幕尺寸的差异,但还有许多其他设备特性可能会有所不同,需要应用程序验证某些功能并根据其存在(或不存在)来调整其行为。这在设计跨范式情况下尤为重要,桌面和移动操作系统提供非常不同的交互模型。
因此,所有应用程序必须能够优雅地降低功能,否则可能会呈现出仅具有最小功能集的情况,无法充分利用底层平台的全部潜力。
平台差异的示例
有一些应用程序固有的基本特征是普遍适用的。这些是高级概念,在所有设备和平台上都适用,因此可以构成应用程序设计的核心:
- 屏幕,可以显示应用程序的用户界面。
- 某种形式的输入设备,通常是移动设备的触摸和桌面的鼠标和键盘。
- 显示数据的视图。
- 编辑数据。
- 导航功能。
平台特定功能
除了通用应用程序特征之外,您还需要在设计中解决关键的平台差异。您可能需要考虑并可能需要编写或调整代码来处理这些差异:
-
屏幕尺寸:某些平台(如iOS)具有标准化的屏幕尺寸,相对容易定位,而其他平台(如桌面和WebAssembly)则可以支持各种屏幕尺寸,这需要更多的工作来支持您的应用程序。
-
导航隐喻:这些在平台之间可能会有所不同(例如,硬件的“返回”按钮),甚至在平台内部也可能有所不同(例如,Android 2和4之间的差异,iPhone与iPad之间的差异)。
-
键盘:某些设备可能配备物理键盘,而其他设备只有软键盘。检测软键盘遮挡屏幕部分时的代码需要对这些差异进行敏感处理。
在设计Avalonia应用程序时,应仔细考虑这些平台特定差异,以确保在所有平台上实现无缝的用户体验。虽然您应该努力最大程度地重用代码,但也应避免尝试在所有支持的平台上100%重用代码。相反,为每个平台的用户界面定制以适应设备的感觉。
处理平台差异
通过抽象平台功能,可以从相同的代码库支持多个平台。
- 平台抽象:此方法利用业务外观模式,在各个平台上提供统一的访问。它将独特的平台实现抽象为一个单一的、连贯的API。其主要优点是能够编写与平台无关的代码,增强了代码的可重用性和可维护性。然而,这种方法可能无法充分利用每个平台的独特功能和能力。
平台抽象
在Avalonia中,您可以使用类抽象来简化在不同平台上的开发过程。这可以通过在共享代码中定义接口或基类,然后在特定平台的项目中实现或扩展来实现。
接口
使用接口可以创建特定于平台的类,这些类可以并入共享库以实现代码重用。
工作原理
接口在共享代码中定义,并作为参数或属性传递到共享库中。然后,特定于平台的应用程序可以实现接口,使共享代码能够有效处理它。
优点
这种方法的主要优点是实现可以包含特定于平台的代码,甚至可以引用特定于平台的外部库,提供了很高的灵活性。
缺点
潜在的缺点是需要创建和传递实现到共享代码中。如果接口在共享代码中被深度使用,可能需要通过多个方法参数传递,这可能导致更复杂的调用链。如果共享代码使用了多个不同的接口,所有这些接口都必须在共享代码中创建和设置。
继承
您的共享代码可以实现抽象或虚拟类,这些类可以在一个或多个特定平台的项目中进行扩展。这种技术类似于使用接口,但提供了一些已经实现的行为。
工作原理
通过使用继承,您可以在共享代码中创建基类,可以选择在特定平台的项目中进行扩展。然而,由于C#只允许单继承,这种方法可能会影响您未来的API设计。因此,要谨慎使用继承。
优点和缺点
使用接口的优点和缺点同样适用于继承。然而,继承的一个额外优点是基类可以包含一些实现代码。这可能提供一个完整的平台无关实现,可以根据需要进行扩展。