我有几个活动,虽然每个活动都相当独特,但必须有一些常见的 api 调用,如 getCurrentUser() 或 updateUser()
给定 MVP 模式(我目前正在使用 MVP mosby),因为这些活动中的每一个只有一个演示者。在我开发的过程中,似乎有时我会在这些演示者身上复制粘贴很多这些常见的 api 调用。假设我有 API 调用 A、B、C、D。
A、C 用于演示者 1,
B、D、A 用于演示者 2,
C、E 用于演示者 3.....
等等。真的很难找到一个"共同"的演示者来继承。所以 api 调用,C 和 A 基本上是复制粘贴的。
我的问题是,鉴于目前的情况,避免代码复制粘贴的最佳方法是什么?这几乎是不可避免的吗?或者我应该尽力做 OOP,但每次从不同的演示者添加/删除 API 调用时都要冒着一堆重构的风险?
交互器模式(用例模式)可以解决当前重复代码的问题。
这个想法是,您将getCurrentUser()
和updateUser()
方法背后的所有逻辑提取到一个类(交互器)中,并在多个演示器中使用此交互器。
这是一个非常简单的解释。我建议你从这篇文章和这篇文章开始做更多的研究。
调用放在一个或多个可从任何表示器引用的 Java 类中来分离通用 API 和表示器代码。
因此。ServiceA 存在(A Java Class)。
ServiceA 执行 API 调用 A,B,C,D。
可以从演示者 1、演示者 2、演示者N、演示者 N+1 调用服务 A。演示者是什么应该无关紧要。
如果要限制某些演示者访问不同的 API 调用。那么这是你应该考虑拥有ServiceA,ServiceB,ServiceC的时候。其中服务A只能使API调用A和D,服务B和服务C的行为类似。
将演示器代码与通用代码(Web 服务、内部 API、w/e 代码)解耦将允许您进行扩展,而无需进行复制和粘贴。
祝你好运。
不以 OOP 风格和继承方式进行重构,您将面临更多重构的风险。假设您要修改处理某些 api 调用的方式。如果要复制代码,则必须重构最初复制代码的所有位置。如果从普通演示者继承,则只需修改一次。
您应该为 API 创建包含所有 API 请求的接口。然后创建执行这些请求的单例类,您可以轻松地从演示者访问此类。
现在,您仍然会有一些重复项,并且您需要在演示器中多次调用此单例并处理每个单例中的响应,但这就是您需要做的。每个演示者都应该能够以不同的方式处理响应,因此您不能将它们打包为一个(即使他们通常以相同的方式处理它 - 通过传递数据进行查看)。
如果你认为你正在编写很多类似的代码,但什么都不做,那么你从 MVP 中得到的。您还可以获得出色的测试能力,更容易的重构和轻松模拟请求 - 您可以将真正的单例交换为实现相同接口并且一切正常的模拟。