Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
构造Java控制台程序的正确方法_Java_Oop_Language Concepts - Fatal编程技术网

构造Java控制台程序的正确方法

构造Java控制台程序的正确方法,java,oop,language-concepts,Java,Oop,Language Concepts,我是一个80年代的老程序员,精通C和Pascal。我对Java及其概念相当陌生。在尝试使用OOP技术学习Java的新方法时,我对组合应用程序的正确方法感到相当困惑 我正在尝试用以下规则构建一个基本程序 一个组织有自己的内部图书馆。Staff类是general类,具有名称和电话。有些员工是图书管理员。其他人都是会员。所以会员和图书管理员都是专业课。我认为在这种情况下,我们称之为继承或扩展 现在,我正在尝试构建基本功能,如输入和打印成员记录。我正在尝试建立一个基于文本的菜单。也许以后我会考虑子菜单。

我是一个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组装程序的正确方法还是有其他方法

请随意建议代码的最佳选项/更改。但我想保留泛化和专业化的概念


谢谢

评论太长,但没有回答


  • 会有课。希望他们中有很多人
  • 应遵循Java命名约定,例如,以小写字母开头的命名方法
  • StaffClass
    是个糟糕的名字,只需使用
    Staff
  • 考虑以不同的方式向它提供输入:照目前的情况,
    Staff
    只能由它自己的输入方法填充。但是数据如何进入
    Staff
    实例应该与
    Staff
    的实际情况完全无关
  • 没有“一种正确的方法”可以从类中组装Java程序,甚至没有一种正确的方法可以分解责任。但这一点很重要。同样重要的是,方法(可能还有类)应该始终在相同的抽象级别上运行

  • 您过度使用了类——类是用来表示数据类型的,或者是静态方法(本质上只是函数)的持有者。但是,您使用类作为分发函数的手段,然后应用伪继承。此外,您正在继承
    菜单
    并在同一类中安装
    菜单
    ——这毫无意义

    换句话说,您不需要为了继承而使用继承和许多类。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中受益的程序设计方法:


    作为旁注:变量和成员在Java代码中应小写;只有类名应该是大写的。@ErikAllik说的是正确的。您会注意到,由于大写,代码中stackoverflow的颜色格式都是错误的。变量、类实例和方法都应该是小写的(camel-case在这里很好用)。您可能希望将读取输入的类与包含数据或逻辑的类分开。是的,这不是答案,但绝对是有用的建议。关于第4点,我不是在一个类中通过绑定方法+职员的数据成员来进行所谓的封装吗?@itsols
    InputData
    做了一些与成为
    职员
    没有本质关系的事情。相反,使用以
    name
    phone
    为参数的构造函数。其他东西可以决定这些值的来源,例如键盘、文件等。“会有类。希望有很多。”-这很可怕。@ErikAllik一点也不,类应该集中且小,这意味着它们会更多。遗憾的是,Java没有区分真正只是模块的类和表示数据类型的类。谢谢Erik。我知道我有很多课。但我的普通员工和专业成员的情况不要求我有很多课程吗?你是在建议我使用一个类来处理所有人员字段和成员特定属性吗?不是,我说你可以将函数拆分为单独的模块(用Java中的类表示);但不要使用继承。您的方法只是函数,所以请使用封装在类中的静态方法。仅对实际为数据类型的对象使用类。在某些情况下,它们也可以表示工厂或其他需要继承的函数容器之类的东西,但类背后的一般概念始终是数据类型;但这只是一种方法。但在任何情况下,您的数据类型