使用Fragments时避免重复代码的最佳方法

时间:2013-12-16 11:09:59

标签: java android android-fragments

我已准备好应用并在Google Play商店中运行,现在我正在实施片段。

所以,我已经有了一个用一些方法扩展B的类A,现在我有C扩展FragmentActivity的类,所以现在我需要使用与A类相同的方法但是这里因为我扩展了FragmentActivity我无法使用B类,所以这里有重复的方法,与A类相同,但我需要重用这些方法。

以下示例显示了我的情况:

例如:

当前实施

class A extends B{

one();
two();

}

整合片段后,

例如:

class C extends FragmentActivity{

one();// same methods as in class A
two();// same methods as in class A

}

1)在这种情况下重用这些方法的最佳方法是什么?

2)我在脑海里想法创建一个类并将方法设置为静态并重复使用A和C类中的方法,但是我的方法很好,我可以将方法设置为静态,是吗?一个好方法?

3)我想到的另一种方法“战略模式”。

Eg:
class A extends ApiClass {
   private ClassContainingDupMethod strategy;
}

class N extends AnotherApiClass {
   private ClassContainingDupMethod strategy;

   public methodCallingDupMethod(){
      strategy.dupMethod();
   }
}

class ClassContainingDupMethod{
   public dupMethod(){;}
}

“策略模式”。是一个好方法吗?因为我需要在两个类中创建公共类的对象。

对此有任何建议将不胜感激。

7 个答案:

答案 0 :(得分:14)

它比你描述的更简单。你需要做的就是像这样创建D:

public class D{
   one();
   two();
}

更改A类以使用D类。

   public Class A{
       public D dLogic;
   }

与C班相同。

public Class C extends FragmentActivity{
       public D dLogic;
   }

在面向对象编程中,这是一个非常基本的东西,它调用composition

答案 1 :(得分:3)

我怀疑你有一些实用工具方法,只需将它们放在一个类Utils中,使它们保持静态并从任何你想要的地方调用它们。我的应用程序中有很多实用程序类,如WifiUtilsLogUtilsNumberUtils等等。

答案 2 :(得分:3)

如果要强制使用相同的API,可以尝试向AC类添加接口,同时将A的实例保留为{{1}的字段}}。 C将充当C的包装类。

班级A

A

班级class A extends B implements CommonApi { public void one() { ... } public boolean two() { ... } }

C

答案 3 :(得分:1)

你应该从Babibu所说的开始 - 简单的构图。

当你掌握这个时,还有其他技术。例如,依赖注入看起来像是可以在这里使用的东西。 简单的情况会是这样的。定义接口B而不是类B.在C初始化期间将接口B作为参数传递,将其作为内部变量b并调用b.one()和b.two()。 您必须创建一个在C范围之外实现B的对象A,并在活动C初始化期间将其传入。 优点:C不需要知道如何创建A,您可以稍后将其更改为AA或AAA,只要AA和AAA实现B,就不会再次触摸您的活动。您不必重新测试C.

答案 4 :(得分:1)

如果你在两个片段中都有相同的方法,为什么不使用BaseFragment类(反过来扩展FragmentActivity)并在那里使用所有常用方法。然后你可以在你想要的任何类中扩展这个BaseFragment类。 这样,无论你在BaseFragment中获得什么方法都可以在不重新定义的情况下使用。

答案 5 :(得分:0)

战略模式或'包装'是最佳选择。我认为JuanSánchez的解决方案比Babibu的解决方案更好。与Babibu的代码一样,A类不应该依赖于D.依赖于接口更好。 在您的代码中,如果A类包含某些属性或C类不需要的某些操作,您可以像下面那样重构代码。否则胡安的解决方案就足够了。 我为这种情况绘制了一个UML图像,但我没有足够的声誉发布它:-( 代码是这样的:

interface IAction
{
   public void actionA();
}

class A extends B implements IAction
{
   private IAction action;
   public void actionA() {
      action.actionA();
   }
}

class C extends FragmentActivity implements IAction
{
   private IAction action;
   public void actionA() {
      action.actionA();
   }
}

class D implements IAction
{
   public void actionA() {
   // put implementation here
   }
}

答案 6 :(得分:0)

尽可能地摆脱遗产。你不需要它。类继承几乎总是一个坏主意,特别是如果你期望在实现中有很多未来的变化。唯一真正需要的是当一个设计不佳的框架要求你扩展一些基类时。

在阅读Gamma等人的旧设计模式时,请记住它们是为一个C ++和Pascal是主要OO语言的世界而编写的。 Java仍然处于起步阶段,并引入了这些语言都没有的新颖性(接口)。因此,您应该在思想上用expand替换extends的许多用法,并且最终会得到更好的代码。

基本上,在面向对象设计中保持高一致性和低耦合是一个好主意。类继承很容易导致具有低相干性的高度耦合类(在一个类中有许多不相关的功能)。原因是基类最终具有所有子类不需要的功能,或者仅与某些子类相关的代码路径。此外,随着您的设计的发展,您将结束许多彼此继承且紧密耦合的类。我个人不喜欢处理具有多级继承的代码。它很难阅读,继承的语义也使测试更加痛苦。我从不使用扩展而不是接口,我从九十年代中期就开始使用Java。

由于这个原因,@ Babibu建议使用组合和委托是一个更好的选择。它导致更紧密耦合的更连贯的类。易于维护,易于重构,更易于测试等。