【问题标题】:Passing objects to different libraries in Java将对象传递给 Java 中的不同库
【发布时间】:2015-01-31 20:15:18
【问题描述】:

这是一个关于将对象传递到不同库或项目的最佳实践的问题。

假设我们有一个名为 Student and Grades 的课程。

 import Grades; 

 public class Student (){
      String StudentName;
      String StudentID;
      int age;
      int gradeForMath;
      int gradeForScience;
      Grades otherGrades; 
 }

现在在我们的主要课程中,我想将 Grades 课程和一些 Integers 传递到一个库中,以计算学生明年通过的可能性。

 public static void main (){
      MyExternalLibraryCalculatingPassRate passRate = new MyExternalLibraryCalculatingPassRate(Grades otherGrades, int math, int science); 
 }

但是,我的问题是 Library 对 Grades 没有可见性,也没有一个名为 Grades 的类。我的问题真的是,这样做的最佳方法是什么?我有以下两个想法,但我不确定是否有更好或更坏的方法 -

  1. 传递 Grades 的底层数据结构。例如,如果我们可以将成绩归结为哈希图或数组列表,或者通过什么来传递?

  2. 在库中创建一个 Grades 类并将其导入到您的项目中,然后在您的项目中使用库中的 Grades 类而不在您的项目中声明 Grades 类?

我不相信这两种方法都很好 - 但是最佳做法是什么?还是经常做的?

【问题讨论】:

  • 库的方法签名是什么?是否在签名中接受Grades
  • @SajanChandran 你没抓住重点,图书馆是他/她的。顺便说一句,让 API 传递原始数据是个好主意。如果库需要的只是一个东西的哈希图,那么#1 是个好主意。
  • API 的分离似乎有点不寻常,因为您的代码和库都在同一个域上运行。但是,由于您希望将库完全分开,如果您可以明确定义键,则选项 1 会更好。最好的办法是从库中公开一个接口并实现(如下所示)

标签: java object libraries pass-by-value


【解决方案1】:

您可以在外部库中定义一个接口,该接口指定必须如何组织数据,但不提供实现。 例如:

public class StudentPassRateData {
      int getGradeForMath();
      int getGradeForScience();
}

然后,在主项目中,你可以定义一个实现这个接口的类:

public class Student implements StudentPassRateData {
      private String StudentName;
      private String StudentID;
      private int age;
      private int gradeForMath;
      private int gradeForScience;
      private Grades otherGrades; 

      int getGradeForMath() {return gradeForMath;}
      int getGradeForScience() {return gradeForScience;}
 }

【讨论】:

    【解决方案2】:

    看来您的库和主项目在同一个域上运行,所以我认为最好的办法是共享通用数据模型。如果MyExternalLibraryCalculatingPassRate 计算Student 会通过的概率,那么使用Student 对象的方法可能会更好,而不是Grades 和两个原语。一般来说,混合对象和原语来表示相同的概念是一个坏主意。

    --更新

    我发现此代码存在其他问题,Student 类只有字段。因此,如果其他班级想要获得成绩,他们应该知道成绩的内部表示(一个Grades 字段和两个ints),这通常是一件坏事。

    【讨论】:

    • 学生类只是一个例子,实际类中没有一些方法。另外我想保持图书馆分开,因为图书馆也可以用于其他事情?
    • 可重用库是好东西,但在这种情况下MyExternalLibraryCalculatingPassRate 建议它从学校/班级域计算某种概率。您将如何在其他领域重用它?也许最好创建一个负责计算概率的库,这是相当普遍的事情,它不限于特定领域,可以被一些CalculatingPassRate类使用。那么就没有必要创建仅限于计算通过率概率的库了。
    • 谢谢马尔辛。学生班只是一个例子,但在真正的班级中有一些方法。以及成绩和数学和科学标记,它们在此处作为单独的变量传递,以简化解释,但在实际情况下,它们在概念上是不同的值。
    • 库应该是灵活的。从某种意义上说,在不同的项目/上下文/域中使用它们应该是可能的并且应该是有意义的。例如,对图进行操作的库知道什么是 Edge、Node 等,它知道如何计算节点之间的最短路径。这个库可以用于其他用于计划货物、公共交通等的应用程序,但首先开发人员必须提供从运输/货物域到顶点域的一些翻译,并且应该在应用程序中完成翻译.
    • 是的,我认为这听起来很合理。这可能是我将采取的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多