MOOC Java 第 5 部分 如何知道何时在另一个类中使用对象作为引用变量?

问题描述 投票:0回答:1

在第 5 部分的原始和引用变量部分中,定义了一个 Person 类,然后定义了另一个名为 TimeMachine 的类,该类为 Person 类型定义了一个引用变量。

public class TimeMachine {

    private Person traveler;

    public TimeMachine(Person person) {
        this.traveler = person;
    }

    public void travelInTime(int years) {
        this.traveler.setYear(this.traveler.getYear() + years);
    }
}

司机等级:

public class TimeMachineMain {

    public static void main(String[] args){

        Person lorraine = new Person();
        TimeMachine tardis = new TimeMachine(lorraine);
        tardis.travelInTime(6);
        System.out.println(lorraine.getYear());

    }
}

在下一节中,还有另一个名为 AmusementParkRide 的类,它没有 Person 类型的实例变量,但将 Person 作为方法参数直接传递给 allowedToRide 方法。

public class AmusementParkRide {

    private String name;
    private int lowestHeight;

    public AmusementParkRide(String name, int lowestHeight){
        this.name = name;
        this.lowestHeight = lowestHeight;
    }   

    public boolean allowedToRide(Person person){
        if (person.getHeight() < this.lowestHeight){
            return false;     
        }

        return true;
    }

    public String toString(){
        return this.name + ", minimum height: " + this.lowestHeight;
    }
}

司机等级:

public class AmusementParkRideMain {

    public static void main(String[] args) {

        Person matt = new Person("Matt");
        matt.setWeight(86);
        matt.setHeight(180);    
    
        Person jasper = new Person("Jasper");
        jasper.setWeight(34);
        jasper.setHeight(132);

        AmusementParkRide waterTrack = new AmusementParkRide("Water track", 140);

        if (waterTrack.allowedToRide(matt)) {
            System.out.println(matt.getName() + " may enter the ride");
        } else {
            System.out.println(matt.getName() + " may not enter the ride");
        }

        if (waterTrack.allowedToRide(jasper)) {
            System.out.println(jasper.getName() + " may enter the ride");
        } else {
            System.out.println(jasper.getName() + " may not enter the ride");
        }

        System.out.println(waterTrack);

    }
}

问题:如何知道何时将一个对象声明为另一个对象中的引用变量? 根据上面的例子,直观上来说,TimeMachine 与类人并没有真正的 HAS A 关系,所以不确定为什么要这样实现。 与 AmusementParkRide 类中的实现类似,这样的实现会更好吗?

public class NewTimeMachine {

    public void travelInTime(Person person, int years) {
        person.setYear(person.getYear() + years);
    }

}

司机等级:

public class NewTimeMachineMain {

    public static void main(String[] args){

        Person lorraine = new Person("Lorraine");
        NewTimeMachine tardis = new NewTimeMachine();
        tardis.travelInTime(lorraine, 6);
        System.out.println(lorraine.getYear());

    }

}

通过创建 NewTimeMachine 类尝试上述方法,并获得与 TimeMachine 示例相同的结果。 只需要了解为什么/何时将一个对象声明为另一个对象中的引用变量以及它在 AmusementParkRide 示例中的实现方式。

java class object oop instance-variables
1个回答
0
投票

这是一个完全合理的问题,但恐怕答案是 mu,在波西格意义上。该问题假设软件设计存在客观标准。这种假设几乎没有根据。

我希望更多的软件设计课程和教科书能够更明确地表明,到目前为止,软件设计更像是一门“手艺”,而不是一门科学。并不是说没有启发式、设计原则或模式来讨论该做什么和不该做什么,但它们应该被视为灵感而不是硬性规则。 例如,我认为

设计模式

这本书是一本很好的目录,人们可以从中汲取灵感,但它不是标准和决策的集合。它并没有说,在这种情况下,你必须这样做,而是,如果这是你的情况,你可以考虑使用这种模式。并且考虑实际上是留给了经验者的经验。读者。 同样,

APPP

介绍了SOLID原则,在提出第一个SOLID原则之前,用了100页的篇幅概述了问题、力量和其他考虑因素。即便如此,这些原则也只是指导方针,而不是硬性规定。 也许有一天,软件开发行业发展到一种更像是一门科学而不是一门手艺的状态,但这不是目前的状况。

像OP那样提出问题是合理的,但是很多软件设计技能都来自于经验和实践。你遭受的设计错误越多,你学到的就越多。这并不是说您不能加速学习过程。您也可以从别人的错误中学习,因此阅读书籍、学习课程、观看会议演示等是个好主意。

为什么课程作者选择一种设计而不是另一种?如果课程有任何好处,他或她实际上可能会解释导致给定设计选择的想法,但您不应该期望能够仅从少数示例中进行推断。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.