【问题标题】:Proper code design for Android/Java适用于 Android/Java 的正确代码设计
【发布时间】:2014-04-16 00:00:36
【问题描述】:

代码设计问题

我有一个类,比如说 Area,它有一个名为 schools 的私有实例变量。在 Area 的构造函数中,我初始化了我所有的学校,因为这是一个耗时的过程。 Area 中有一个实例方法,它表示按学校分组,其中传递了学生列表。我将这些学生分组到他们的学校并将结果传回。

对于这个Area 班级来说,它必须维护一份学校列表以及进行分组,是否有太多的责任?但我的主要问题是 Android 相关的: 我有多个片段需要使用这个类。他们利用学校的数量、学校列表以及对它们进行分组。我不想每次打开一个新片段时都实例化这个Area。我应该在片段或其他地方在哪里以及如何实例化它们?我不能让它成为一个单例,因为area 可以改变,反过来它需要重新实例化自己。我不能打电话给setSchools,因为它是一次性的。有任何想法吗?有没有我可以遵循的设计模式?

【问题讨论】:

  • 嘿,你能显示你的代码吗?
  • 那么你是怎么做到的?

标签: java android android-fragments


【解决方案1】:

我的想法是有一个类来处理区域的创建(可能是您的应用程序类)。

然后,应用程序基本上可以将区域地图保留到某种形式的区域 ID。如果您发现一个尚不存在的区域,您可以在该点创建它并将其存储在地图中以供其他片段稍后使用。

关于学生的排序,这似乎并不是一个区域的工作。 也许使用StudentManager 之类的东西会更有意义。

这就是我的想象(简化形式):

class Student {
  String name;
}

class School {
  List<Student> students;

  boolean contains(Student) {
    return students.contains(student);
  }
}

class Area {
  List<School> schools;
}

class StudentManager {
  Map<School, Set<Student>> sortIntoSchools(Collection<Student> unsortedStudents) {
    Map<School, Set<Student>> result = new HashMap<>(); // Should use a decorated map here
    for(Student student : unsortedStudents) {
     for(Area area : areas) {
      for(School school : area.schools) {
        if(school.contains(student)){
          result.get(school).add(student);
        }
       }
      }
    }
  }
}

我确信您可以改进 StudentManager 类的排序,但这种分离对我来说很有意义...

【讨论】:

  • 问题是我根本看不到地图的重点。当用户甚至对它们不感兴趣时​​,为什么要存储所有这些区域。现在,我们可以使用 LRUCache,然后有一个小尺寸,但我仍然觉得这对于应该/可能是一个简单的设计来说是一个开销
  • 我认为您在这方面确实有两个选择。 (1) 将项目存储在内存中或 (2) 将它们存储在数据库/LRUCache 中并在需要时检索它们。无论哪种方式,在不了解更多信息的情况下,在我看来,当您无论如何都需要使用它们时,很难避免将所有 Areas 拉入内存。我认为这一切都归结为更适合您的特定情况的性能。将所有数据保存在内存中,或者在需要时将其拉入内存。这将完全取决于这些数据在您的特定应用程序中的使用方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-31
  • 2019-04-26
  • 2020-12-14
  • 2015-12-23
相关资源
最近更新 更多