构造Java控制台程序的正确方法
我是一个80年代的老程序员,精通C和Pascal。我对Java及其概念相当陌生。在尝试使用OOP技术学习Java的新方法时,我对组合应用程序的正确方法感到相当困惑 我正在尝试用以下规则构建一个基本程序 一个组织有自己的内部图书馆。Staff类是general类,具有名称和电话。有些员工是图书管理员。其他人都是会员。所以会员和图书管理员都是专业课。我认为在这种情况下,我们称之为继承或扩展 现在,我正在尝试构建基本功能,如输入和打印成员记录。我正在尝试建立一个基于文本的菜单。也许以后我会考虑子菜单。现在它只是一个简单的菜单 我不知道我是否应该让菜单也成为一个对象,但我想我会这么做 考虑到这一点,以下是我所做的 我的主要节目:构造Java控制台程序的正确方法,java,oop,language-concepts,Java,Oop,Language Concepts,我是一个80年代的老程序员,精通C和Pascal。我对Java及其概念相当陌生。在尝试使用OOP技术学习Java的新方法时,我对组合应用程序的正确方法感到相当困惑 我正在尝试用以下规则构建一个基本程序 一个组织有自己的内部图书馆。Staff类是general类,具有名称和电话。有些员工是图书管理员。其他人都是会员。所以会员和图书管理员都是专业课。我认为在这种情况下,我们称之为继承或扩展 现在,我正在尝试构建基本功能,如输入和打印成员记录。我正在尝试建立一个基于文本的菜单。也许以后我会考虑子菜单。
public class Library extends Menus {
public static void main(String[] args) {
Menus Start = new Menus();
Start.ShowMainMenu();
}
}
StaffClass.java
public class StaffClass {
private String Name;
private String Phone;
public void InputData() {
Scanner UserInput = new Scanner(System.in);
System.out.print("Enter staff name "); Name = UserInput.nextLine();
System.out.print("Enter staff phone number "); Phone = UserInput.nextLine();
}
public void PrintData() {
System.out.println("Name : " + Name);
System.out.println("Phone : " + Phone);
}
}//end StaffClass
public class MemberClass extends StaffClass {
int TotalBooks;
public void getInputs() {
InputData();
UpdateTotalBooks();
}
public void ShowAllInfo() {
PrintData();
System.out.println("total books taken = " + TotalBooks);
}
public void UpdateTotalBooks() {
Scanner ui = new Scanner(System.in);
System.out.print("Enter number of books "); TotalBooks = ui.nextInt();
}
}
Menus.java
public class Menus extends MemberClass {
int c;
public void ShowMainMenu() {
Scanner ui = new Scanner(System.in);
while(1==1) {
System.out.println("Main menu");
System.out.println("1. Add student");
System.out.println("2. Display all");
System.out.println("3. exit");
System.out.print("Enter choice"); c = ui.nextInt();
switch(c) {
case 1 : getInputs(); /*System.out.println("option 1");*/ break;
case 2 : ShowAllInfo(); break;
case 3 : System.out.println("Leaving the program now..."); System.exit(0); break;
default : System.out.println("error.");
}
}
}
}
MemberClass.java
public class StaffClass {
private String Name;
private String Phone;
public void InputData() {
Scanner UserInput = new Scanner(System.in);
System.out.print("Enter staff name "); Name = UserInput.nextLine();
System.out.print("Enter staff phone number "); Phone = UserInput.nextLine();
}
public void PrintData() {
System.out.println("Name : " + Name);
System.out.println("Phone : " + Phone);
}
}//end StaffClass
public class MemberClass extends StaffClass {
int TotalBooks;
public void getInputs() {
InputData();
UpdateTotalBooks();
}
public void ShowAllInfo() {
PrintData();
System.out.println("total books taken = " + TotalBooks);
}
public void UpdateTotalBooks() {
Scanner ui = new Scanner(System.in);
System.out.print("Enter number of books "); TotalBooks = ui.nextInt();
}
}
这是我第一个用这么多类和菜单系统组合起来的Java程序
我的关键问题是,这是用Java组装程序的正确方法还是有其他方法
请随意建议代码的最佳选项/更改。但我想保留泛化和专业化的概念
谢谢 评论太长,但没有回答
StaffClass
是个糟糕的名字,只需使用Staff
Staff
只能由它自己的输入方法填充。但是数据如何进入Staff
实例应该与Staff
的实际情况完全无关您过度使用了类——类是用来表示数据类型的,或者是静态方法(本质上只是函数)的持有者。但是,您使用类作为分发函数的手段,然后应用伪继承。此外,您正在继承
菜单
并在同一类中安装菜单
——这毫无意义
换句话说,您不需要为了继承而使用继承和许多类。Java中除了许多不称职的开发人员过度使用类,强迫或建议过度使用类和继承之外,没有其他东西
函数,最好是没有副作用/全局状态的函数,更容易推理和正确处理。然而,分散在父类链上的复杂状态变量是一个让人头疼的捷径
我会使用一些简单的方法,例如:
public class Library {
public static void main(final String[] args) {
showMainMenu();
}
int totalBooks;
public static void showMainMenu() {
final Scanner ui = new Scanner(System.in);
while (true) {
System.out.println("Main menu");
System.out.println("1. Add student");
System.out.println("2. Display all");
System.out.println("3. exit");
System.out.print("Enter choice");
switch (ui.nextInt()) {
case 1:
getInputs();
/*System.out.println("option 1");*/
break;
case 2:
showAllInfo();
break;
case 3:
System.out.println("Leaving the program now...");
System.exit(0);
break;
default:
System.out.println("error.");
}
}
}
public static void getInputs() {
inputData();
updateTotalBooks();
}
public static void showAllInfo() {
printData();
System.out.println("total books taken = " + totalBooks);
}
public static void updateTotalBooks() {
System.out.print("Enter number of books ");
totalBooks = new Scanner(System.in).nextInt();
}
}
如果需要在不同的模块中拆分,请不要使用继承。相反,创建一个类似于状态
或数据库
类的类,并在修改传入数据的静态函数之间传递该类,或者,如果您想深入了解函数编程和不可变数据结构的世界,则返回数据的修改副本:
class State {
// make these non-final if you want State to be mutable
// (I'm too lazy to generate getters; and in Scala you don't have to)
public final int totalBooks = 0;
public final String someOtherState = "hello";
public State(final int totalBooks, final String someOtherState) {
this.totalBooks = totalBooks;
this.someOtherState = someOtherState;
}
public State withTotalBooks(final int newValue) {
return new State(newValue, someOtherState);
}
public State withSomeOtherState(final int newValue) {
return new State(totalBooks, newValue);
}
}
class App {
public static void main(final String[] args) {
State state = new State();
// at the top-most level of the program, it's OK to use global state
state = BookManager.updateNumBooks(state)
}
}
class BookManager {
public static State updateNumBooks(final State state) {
return state.withTotalNumBooks(123);
}
// or, if State is mutable:
public static void updateNumBooks(final State state) {
// UI code here
state.totalNumBooks = 123;
}
}
class HelloModule {
public static State updateMsg(final State state) {
// UI code
return state.withSomeOtherState("hello world");
}
// or, if State is mutable:
public static void updateMsg(final State state) {
// UI code
state.someOtherState = "hello world";
}
}
// etc
最后一句话:在简洁的函数式编程JVM语言中,所有这些看起来都会更好,比如(甚至)。如果您必须继续使用Java,请至少阅读一些有关Java的内容,以及您如何从Java中受益的程序设计方法:
InputData
做了一些与成为职员
没有本质关系的事情。相反,使用以name
和phone
为参数的构造函数。其他东西可以决定这些值的来源,例如键盘、文件等。“会有类。希望有很多。”-这很可怕。@ErikAllik一点也不,类应该集中且小,这意味着它们会更多。遗憾的是,Java没有区分真正只是模块的类和表示数据类型的类。谢谢Erik。我知道我有很多课。但我的普通员工和专业成员的情况不要求我有很多课程吗?你是在建议我使用一个类来处理所有人员字段和成员特定属性吗?不是,我说你可以将函数拆分为单独的模块(用Java中的类表示);但不要使用继承。您的方法只是函数,所以请使用封装在类中的静态方法。仅对实际为数据类型的对象使用类。在某些情况下,它们也可以表示工厂或其他需要继承的函数容器之类的东西,但类背后的一般概念始终是数据类型;但这只是一种方法。但在任何情况下,您的数据类型