卡提克,
出于某种原因,我非常喜欢做初学者级别的家庭作业,如果你(OP)愚蠢到把它当作你自己的作业,那么你肯定会被抓到作弊(除非你的老师完全不称职),而仍然给你一些有用的指导。我想我只是另一个内心深处的聪明人……但只是一个有点用处的人。
呜呜呜呜呜呜呜呜呜呜呜呜呜呜
播放器类:(是/曾经是 MIA)
package forums.kartikPatel.tennis;
public class Player {
private final String name;
Player(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
这是一个不可变的数据传输对象。“不可变”是“只读”的花哨术语。这意味着一旦创建了对象(一旦构造函数完成),它就无法更改。“数据传输对象”正是它的名字所包含的:一个仅存在于传输表示其他类之间的数据的对象,这些类实际上与/向该数据“做事”。它没有(也不应该)有任何“智能”......传输对象应该尽可能简单(尽可能愚蠢)。
这是我的Team类版本:
package forums.kartikPatel.tennis;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Team implements Iterable<Player> {
private final String country;
private final List<Player> players;
public Team(String country) {
this.country = country;
this.players = new ArrayList<>();
}
public String getCountry() {
return country;
}
public void addPlayer(Player player) {
players.add(player);
}
public Player getPlayer(int index) {
return players.get(index);
}
@Override
public Iterator<Player> iterator() {
return players.iterator();
}
}
Team 类是另一个数据传输对象。它的存在仅仅是为了将我们想要存储的关于网球队的所有信息集中在一个地方。这个版本适用于任何人数的球队,这很好,因为我们可以在不改变软件的情况下处理三名球员的球队,但在这个版本中,它也可以接受没有球员的球队......我还没有看到在现实世界中(但是,嘿,如果 Kiwis 参加无人队伍,至少他们有机会参加比赛,这对他们来说是一个不错的改变),所以我们的软件可能不应该允许用户这样做,因此作为一个挑战尝试修复一些东西(不,软件,而不是 Kiwis),以便在填充每个团队时至少需要一个玩家......或者打印一个“空团队!” 当我们打印出阵容时出现错误消息。
我让团队实现了 Iterable,因为将团队视为“来自一个国家的一群玩家”是有意义的,而 Iterable 允许我们在即将推出的Application类中做到这一点。
应用类:
package forums.kartikPatel.tennis;
import java.io.PrintStream;
import java.util.Scanner;
public class Application
{
private static final Scanner keyboard = new Scanner(System.in);
private static final PrintStream screen = System.out;
public void run() {
// create two new teams: New Zealand (BOO!) and Australia (YEAH!)
Team[] teams = {new Team("NZ"), new Team("AUS")};
// populate both teams with players
populate(teams);
// display both teams, and all there players.
display(teams);
}
// ------------------------------------------------------------------------
// input
// populate both teams with players
private void populate(Team[] teams) {
for ( Team team : teams ) {
screen.println("Please enter the players for: " + team.getCountry());
for (String name=readPlayersName(); name.length()>0; name=readPlayersName())
team.addPlayer(new Player(name));
screen.println();
}
}
private String readPlayersName() {
return readString("Players Name: ");
}
private String readString(String prompt) {
screen.print(prompt);
return keyboard.nextLine();
}
// ------------------------------------------------------------------------
// output
// display both teams, and all there players.
private void display(Team[] teams) {
screen.println("The line-ups are:");
for ( Team team : teams ) {
System.out.print(team.getCountry() + ": ");
for ( Player player : team )
screen.print(player.getName() + ", ");
screen.println();
}
}
}
如您所见,这是一个“传统”的控制台应用程序。当您运行tennis.Application时,它使用屏幕和键盘来创建、填充和显示两队球员。它包含在这个相当简单的应用程序中实际“做事”的所有代码。但是,如果/当两支球队开始真正打网球比赛时,我希望我们需要一个单独的班级(可能是几个班级)来实现比赛本身......即使只是保持比分也可能涉及得分手,一些得分,一个 DueceHelper 和一大盒菠萝(或者可能没有)。
应用程序类不做的是“记住东西”......不是直接。它创建和使用“记住东西”的“传输对象”。
还值得注意的是,您将在所有类型的应用程序中看到相同的三个基本步骤:
输入,
处理,和
输出。
因此,在您的代码中明确(即明确)这些基本步骤是一个好主意,尤其是对于初学者来说,因为它可以帮助您专注于您需要在这里解决的问题以及如何解决......而不是混淆您不应该在此方法/类/模块/子系统/应用程序中尝试解决的问题......就像试图找到一把大面包刀来打开盒子让菠萝在头上击败裁判在第三盘决胜局中就一个狡猾的台词交换意见——结束了紧张的爱情——显然,你应该早点准备好你的弹药,或者只是把整个 frickin 盒子扔给他,希望他的眼睛- 视力在比赛结束前有所改善。
关键是要设计每个类来履行一组明确定义的职责。每个类都应包含具有简单易懂名称的方法,并且实际上每个方法都应实现简单易懂的任务。这是好的程序设计的本质。使事情尽可能简单有助于减少错误(错误),从而最大限度地减少误解。它还有助于使您的软件灵活且可重用,这意味着它更易于维护……以适应当前不可预见的未来需求……从长远来看,这一切都有助于降低软件拥有成本,这意味着您可以收取低于你的竞争对手做更少的工作,做得更好......这一切都很好。
最后是我的主要课程:
package forums;
import forums.kartikPatel.tennis.Application;
public class Main {
public static void main(String[] args) {
new Application().run();
}
}
Main 类有一个职责:运行Application。
这样做会产生类似于以下输出的内容(显然取决于您输入的内容):
Please enter the players for: NZ
Players Name: Bob The Builder
Players Name: Kania Fixit
Players Name: Yazzie Can
Players Name:
Please enter the players for: AUS
Players Name: Mark Horran
Players Name: Blocka Roach
Players Name: The Reverand Fred Effing Nile
Players Name:
The line-ups are:
NZ: Bob The Builder, Kania Fixit, Yazzie Can,
AUS: Mark Horran, Blocka Roach, The Reverand Fred Effing Nile,
作为另一个挑战,尝试去掉每个团队中姓氏后面的合金尾随逗号。提示:认为“逗号在每个后续项目之前”而不是传统的(更明显的)认为逗号在除最后一个之外的每个项目之后......当然,诀窍是很难知道你什么时候处理最终项目,但您可以轻松确定是否/何时处理列表的第一个(与后续项目相对)。
我希望这会有所帮助。对于初学者来说,你做得很好。继续努力,你很快就会比我理解的更多……这并不难。我曾经被一条鱼智过……长篇大论;-)
干杯。基思。