为什么你的“BaseActivity”是反模式——Kotlin委托

程序员咋不秃头 2024-08-17 02:53:02

我们可以经常看到有名为“BaseActivity”或“BaseFragment”等的类。其主要论点是他们有时需要覆盖其所有活动类中的某些行为,而继承似乎是一个不错的选择。

但是,使用继承的问题是什么?为什么它是反模式?

首先,“BaseFragment, BaseActivity, BaseX”命名模式完全是反模式。名称应明确说明其职责。

开发者无法正确命名这些父类,原因是他们需要一个具有多重职责的单一父类。

例如,假设需要离开屏幕时记录一次日志,并在返回时再次记录一次,并希望在所有活动中执行此过程。最常见的方法是有一个父活动,例如将其命名为“AnalyticsActivity”。

接下来,假设有来自某处的输入数据,并且需要在某些或所有活动中覆盖“onNewIntent”。我们称之为“IntentHandlerActivity”。

如你所见,现在有两个父活动类,一个是“AnalyticsActivity”,一个是“IntentHandlerActivity”。

许多开发人员会创建一个单一的“BaseActivity”并在其中实现所有这些不同的职责。这完全是反模式。

Kotlin 委托 (Delegations)

委托是一种常见的编程模式。优势在于Kotlin本身支持委托。这是一个强大的特性,可以将功能从一个对象委托给另一个对象。它允许你以灵活且简洁的方式重用代码和组合对象。

接口

Kotlin中的委托通常用于接口。可以将接口的实现委托给另一个对象,而不是在一个类中实现所有方法。

被委托属性

Kotlin还支持属性的委托。可以使用被委托的属性定义属性访问和修改,而无需明确实现getter和setter方法。

如果你看到“by lazy”或“by viewModels()”之类的代码,你很可能已经了解了这种方法的强大之处。

如何用Kotlin委托解决我们的问题

接口:

interface AnalyticsLogger { fun registerLifecycleOwner(owner: LifecycleOwner)}

实现类还应该实现LifecycleEventObserver,这样才能观察注册的生命周期拥有者的状态变化。

class AnalyticsLoggerImpl : AnalyticsLogger, LifecycleEventObserver { override fun registerLifecycleOwner(owner: LifecycleOwner) { owner.lifecycle.addObserver(this) } override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) { when (event) { Lifecycle.Event.ON_START -> println("User opened the screen.") Lifecycle.Event.ON_PAUSE -> println("User leaved the screen.") else -> Unit } }}

们如何在Activity中实现它:

class MainActivity : ComponentActivity(), AnalyticsLogger by AnalyticsLoggerImpl() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) registerLifecycleOwner(this) }}

没有扩展任何父类,也没有继承任何东西,使用了一个实现,并将工作委托给其相应的委托,在例子中是“AnalyticsLoggerImpl”,并且只调用了一行代码。

现在,在任何有生命周期的类中使用这个委托时,将能够记录事件,而不需要一个具有多种不同职责的父Activity类。

再创建一个委托来处理新的 intent:

interface DeepLinkHandler { fun handleDeepLink(activity: Activity, intent: Intent?)}class DeepLinkHandlerImpl: DeepLinkHandler { override fun handleDeepLink(activity: Activity, intent: Intent?) { // 处理intent }}

在的Activity中实现它:

class MainActivity : ComponentActivity(), AnalyticsLogger by AnalyticsLoggerImpl(), DeepLinkHandler by DeepLinkHandlerImpl() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) registerLifecycleOwner(this) } override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) handleDeepLink(this, intent) }}

正如你所知,一个类只能继承一次。但是,可以随意实现任意数量的类。

1 阅读:2