封装和/或组织数据的策略

时间:2015-11-06 16:59:37

标签: java android encapsulation

我的应用程序在大小和数据密度方面相当平均,但我正在尝试找出封装数据的最佳方法,因为它需要在应用程序周围的许多地方使用。

目前,我将所有数据,选项和状态存储在一个大的“DataObject”中。它看起来像这样:

public class DataObject {
  public static final String M_READY_INTENT = "com.intent.action.M_READY"
  //and more...
  public static jsonRawFoos;
  public static jsonRawBars;
  //and more..
  private static HashMap<String, Foo> catFoos = new HashMap<>();
  private static HashMap<String, Bar> catBars = new HashMap<>();
  //and more..
  private static String session;
  //and more..
  private static boolean optFoo;
  //and more..
  public static boolean dataState = false;
  //and more..

  /* Static accessors,  static data processors */
}

这总计最多42个成员字段。这些必须可以在我的应用程序中的几个不同的活动和类中访问。我考虑过只在我的MainActivity中创建一个本地实例,只是简单地连接MainActivity以访问DataObject,但我不确定在任何地方传递接口是正确的选项

总结一下我的问题,封装/组织我的数据的最佳方法是什么,以使其在多个不同的对象中可用,同时保持我的代码干净,内存高效,并且在暂停/恢复/暂停事件期间不会崩溃?

修改

要添加更多详细信息,我的应用会发出API请求以获取3种不同类型的对象的列表,我们称之为FooBarCat。这些调用的结果是JSON格式,因此在IntentService返回API调用的结果后,DataObject将解析JSON并将生成的对象存储在HashMap中。< / p>

生成的列表对象需要由Fragments中包含的MainActivity中的适配器访问。还有其他活动偶尔需要访问这些对象列表。

此外,用户可以设置某些选项,这些选项会影响整个应用程序中的一个或多个FragmentActivity。我还将这些设置放在DataObject中。

最后,在确定下一步行动之前,应用程序偶尔需要知道哪些数据已准备好以及是否已清除其他某些状态。我也将这些状态保存在DataObject中。

第二次修改:

我忘了提及,DataObject还有责任在某些数据可用时通知应用程序的其余部分。

1 个答案:

答案 0 :(得分:1)

CohesionCoupling是两个重要的概念,以便制作出您正在尝试的优秀OO设计。

凝聚力应该更加关注你,因为这将决定如何组织数据。

您需要问自己的关键问题是(因为您还没有提供所有数据,所以您需要思考并问自己):

  • 这些字段是否相互关联
  • 这些字段是否可能定义对象的状态

根据字段类型及其用途,您可以选择制作课程或将其保持在单一课程中。

查看您提供的相同代码,您已将所有内容设置为静态,并且字段看起来不像定义对象或类的状态,因此可能将它们保留在一个类中看起来很好,但您可以做的一件事是将数据划分为2个类,再创建一个类ApplicationConstants,并将所有常量如static final String M_READY_INTENT = "com.intent.action.M_READY"放在该类中。

  

我考虑过在MainActivity中创建一个本地实例   简单地连接MainActivity以访问DataObject,但是   我不确定在任何地方传递接口都是正确的   选项。

您已将所有内容设置为静态,因此您甚至想要创建DataObject类的对象,只需使用静态getter和setter方法访问所有字段。

<小时/>

根据OP的编辑进行了更新。

免责声明:我不是DataObject类的所有字段及其用途,因此以下设计基于提供的信息

看起来你需要有3个不同的类来维持你所谓的Foo,Bar和Cat的状态。

因此,请将此DataObject类作为您的超级类,并在其中包含不需要唯一状态的字段,因此:

public class DataObject {
  public static final String M_READY_INTENT = "com.intent.action.M_READY"
  // Code for informing the rest of the application when certain data has become available. Could be static ...
  //Anything else which is not unique and is not dependent on Foo, Cat or Bar...
}

然后创建3个新类,它们将保持状态,样本FooDataObject

public class FooDataObject extends DataObject {
     public jsonRawFoo;
      public HashMap<String, Foo> catFoos = new HashMap<>();
      public String session;
      public boolean optFoo;
      public boolean dataState = false;
      //Etc... more methods and getter/setter ...
}


public class BarDataObject extends DataObject {
     public jsonRawBar;
      public HashMap<String, Foo> catBars = new HashMap<>();
      public String session;
      public boolean optBar;
      public boolean dataState = false;
      //Etc... more methods and getter/setter ...
}

因此,基本上任何全局状态都将作为DataObject中的字段结束,而任何特定状态的内容最终都会作为FooDataObjectCatDataObject中的字段或{ {1}}。