在第 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 示例中的实现方式。
这是一个完全合理的问题,但恐怕答案是 mu,在波西格意义上。该问题假设软件设计存在客观标准。这种假设几乎没有根据。
我希望更多的软件设计课程和教科书能够更明确地表明,到目前为止,软件设计更像是一门“手艺”,而不是一门科学。并不是说没有启发式、设计原则或模式来讨论该做什么和不该做什么,但它们应该被视为灵感而不是硬性规则。 例如,我认为
设计模式这本书是一本很好的目录,人们可以从中汲取灵感,但它不是标准和决策的集合。它并没有说,在这种情况下,你必须这样做,而是,如果这是你的情况,你可以考虑使用这种模式。并且考虑实际上是留给了经验者的经验。读者。 同样,
APPP介绍了SOLID原则,在提出第一个SOLID原则之前,用了100页的篇幅概述了问题、力量和其他考虑因素。即便如此,这些原则也只是指导方针,而不是硬性规定。 也许有一天,软件开发行业发展到一种更像是一门科学而不是一门手艺的状态,但这不是目前的状况。
像OP那样提出问题是合理的,但是很多软件设计技能都来自于经验和实践。你遭受的设计错误越多,你学到的就越多。这并不是说您不能加速学习过程。您也可以从别人的错误中学习,因此阅读书籍、学习课程、观看会议演示等是个好主意。
为什么课程作者选择一种设计而不是另一种?如果课程有任何好处,他或她实际上可能会解释导致给定设计选择的想法,但您不应该期望能够仅从少数示例中进行推断。