gpt4 book ai didi

java - 方法调用者和被调用者,循环类级别方法调用

转载 作者:行者123 更新时间:2023-11-30 07:13:14 25 4
gpt4 key购买 nike

两个不同类的方法调用者和被调用者进行循环类级别不同方法调用有什么问题。您将“this”引用作为参数传递给其他一些类实例方法,并且被调用者对作为参数传递的调用者进行进一步的方法邀请。

这样做的一个原因是,在工厂类中,不同的实现需要不同类型的数据,因此您将所需的数据作为多个契约/接口(interface)方法放置,并让调用者实现它们。如果只有一个类,则更容易实现封装,但是不同的类需要不同的数据集

下面是一个简单的示例,这里 StudentService 调用 MathClassScorer 的 topscorer 方法,该方法又调用 StudentService 的 getStudentList 方法。在复杂的场景中,您可能会调用父调用者的多个方法。

public interface IStudentData { 
public List<Student> getStudentList();
}

public class StudentService implements IStudentData {
private List<Student> studentList;

public String getTop() {
// Factory returns MathClassScorer
IScore scorer = ClassScorerFactory.get();
return scorer.topscorer(someOtherData, this);
}

@Override
public getStudentList() {
// do something and return studentList;
return studentList;
}

}

// IScore contains topscorer method
public class MathClassScorer implements IScore {

@Override
public String topscorer(Map someOtherData, IStudentData data) {
List<Student> studentList = data.getStudentList();
//do something before and after
return SOMETHING_AFTER
}
}

问题是,上述方法有问题吗?

最佳答案

嗯,恐怕整个面向对象的话题都有点争议。但在我看来,上述代码的问题始于类的命名。 IStudentData 不是一个对象。持有一些数据并不是一种责任,而对象需要责任。

然后设计要求IScore对象知道IStudentData的内部数据内容,完全忽略该对象。该代码还表明 IScore 也需要了解 Student 的内部工作原理。

良好的面向对象设计是对象实际上承担责任,并且它们的数据尽可能少地可见,最好是根本不可见。

因此,在不了解所有细节的情况下,您的对象可能如下所示:

public class Student {
public boolean isBetterAtMathThan(Student other) {
...
}
}

public class Students { // or StudentRepository
public Student getBestStudentAtMath() {
return students.stream().max(toComparator(Student::isBetterAtMathThan)).get();
}
}

或者,如果您确实想概括几种不同的可比较技能,那么您仍然可以在不暴露学生数据的情况下做到这一点:

public class Students {
public Student getBestStudentAt(Comparator<Student> skillComparator) {
return students.stream().max(skillComparator).get();
}
}

重点是,Student 不应该暴露数据,而应该提供操作,或者创建其他可以东西的对象。同样,Students(代码中的服务)不应公开学生列表,而应提供实际执行操作的方法。

关于java - 方法调用者和被调用者,循环类级别方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38832112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com