面向对象与线性规划

时间:2016-12-08 23:57:07

标签: java oop arraylist

我正在尝试编写一个程序,允许用户将String值输入到包含arrayLists的多个方法中。我有两个问题:

  1. 我的代码似乎是线性的(我想确保我采用面向对象编程原理)。
  2. 我在编写将用户输入的值添加到arrayList所需的while循环时遇到困难。由于我不知道将输入多少个值,我认为这将是一种适用的方法。
  3. 以下是我到目前为止所做的反馈,我们非常重视您的反馈意见:

    import java.util.ArrayList;
    import java.util.Scanner;
    
    public class Animals {
    
    public static void main(String[] args) {
        Scanner user = new Scanner(System.in);
        System.out.println(" Here are some animal types! ");
    
        ArrayList<String> animalTypes = new ArrayList<String>();
        animalTypes.add("Vertebrae");
        animalTypes.add("Reptile");
        animalTypes.add("Insect");
        animalTypes.add("Amphibian");
        System.out.println(" Enter new animal type");
        System.out.println(" Here is your animal types list! ");
    
       // This for loop is inadequate, I need a while loop as I don't know the exact number of entries from the user//
        for (int index = 0; index < animalTypes.size(); index++) {
            System.out.println(animalTypes.get(index));
        }
    

6 个答案:

答案 0 :(得分:1)

除了Brandon关于动物类型的很好的答案之外,OOP还可用于抽象AnimalTypeInputter类,然后可以扩展到其他TypeInputters {{1} } addNewType listAllTypes等。除了提示之外,这些方法可以从基础findType继承

答案 1 :(得分:0)

要进行面向对象编程,需要对象。如果您不需要对象,那么您可以使用普通/传统的结构化编码。我不确定原始问题是否需要OOP,而不是没有关于需要添加什么的其他信息。

(并非每个问题都适用于OOP。当你最终使用OOP时,虽然继承很有趣,但更喜欢使用接口而不是继承。)

答案 2 :(得分:0)

  

我的代码似乎是线性的(我想确保我采用面向对象的编程原理)。

让你的代码“更加面向对象”可能会比这个小程序更加努力,而不是值得。当它已经足够可读时,它可能会破坏你的程序。

但是,如果您想为不同类型的动物建模,可以使用inheritance

你可以:

  • Animal班。
  • Animal继承的一堆“动物类型”(例如ReptileAmphibian

以下是一些用于演示的简化代码。

public class Animal {}
public class Vertebrate extends Animal {}
public class Reptile extends Animal {}
public class Insect extends Animal {}
public class Amphibian extends Animal {}

因为这些“动物类型”中的每一个都继承自Animal类,所以Java的类型系统意识这些实际上是动物,而不是像你现在一样的字符串。

这可以让你写出类似的东西......

ArrayList<Animal> animals = new ArrayList<>();
animals.add(new Reptile());
animals.add(new Insect());

请注意,这种方法确实没有意义,因为每个类都是空的。但 面向对象,就像你告诉我们你想要实现的那样。

程序代码和面向对象代码都有合适的时间和地点。这可能是程序代码的正确位置。

答案 3 :(得分:0)

1)由于程序太短,很难完全使用自定义OOP,因为你没有任何特殊的对象,接口等。你也没有真正违反OOP在这里。当你有更长的代码来使用像对象之类的东西时,OOP真的会发挥作用,它们会变得有用和高效,但在这种情况下它们并不是必需的。从技术上讲,你仍在使用OOP,因为你正在使用像ArrayList,Scanner和System这样的东西。

2)当从控制台接收未知数量的输入时,while循环是正确的方法。要检测用户何时完成,我建议使用 sentinel值。这是一个短语,当检测到时,将导致循环通过中断或返回停止。这些的一些例子是&#34;退出&#34;或&#34;停止。&#34;您在输入后检查输入,如果是这个哨兵值,您将退出循环:

while (true) {
   String text = Scanner.nextLine();
   if (text.equalsIgnoreCase("exit"))
       break;
}

答案 4 :(得分:0)

这是一个建议。

import java.util.ArrayList;

import java.util.Scanner;

public class Animals {

public static void main(String[] args) {
    Scanner user = new Scanner(System.in);
    System.out.println("Here are some animal types! ");

    String animals = "";

    boolean loopOne = true;
    char response;

    ArrayList<String> animalTypes = new ArrayList<String>();
    animalTypes.add("Vertebrae");
    animalTypes.add("Reptile");
    animalTypes.add("Insect");
    animalTypes.add("Amphibian");


    while(loopOne) {
        System.out.println("Do you wish to enter a new animal type ?");
        response = user.nextLine().charAt(0);

        if (response == 'n') {
            System.out.println("End of the program");
            loopOne = false;

        }

        else if (response == 'y') {
            System.out.println("Please enter your animal types");
            animals = user.nextLine();
            animalTypes.add(animals);               

        }
        else {
            System.out.println("Error ! Please choose y (for yes) or n (for no)");
        }


    }

    System.out.println("\nHere's the list of the element in the ArrayList");
    for(int i = 0; i < animalTypes.size(); i++) {
        System.out.println(animalTypes.get(i));
    }

}

答案 5 :(得分:0)

对所有人来说,问题太小了:Horsepoop!如果您不能将面向对象,原则或模式应用于一个小问题,那么您将无法将它们应用于一个大问题。这个例子实际上几近完美!

对于那些说你不需要物品的人:Bullpoop!

现在我们需要考虑很多原则,例如:

  • 如果我们有一个控制台客户端和一个gui客户端,如何使我们的业务逻辑可重用(即使它只是在列表中添加内容,该怎么办?)
  • 我们如何测试它!因为好的代码和它的测试代码一样好,测试代码和生产代码一样有价值!
  • 如何实现失去耦合高内聚,或者我们如何应用单用途模式

现在我们分析一下,这段代码实际上做了什么,我们把它分成了目的

  1. 它告诉用户,他有一个可供选择的动物列表,简单消息
  2. 它读取用户的输入
  3. 它将用户输入添加到动物列表
  4. (我猜)它显示用户输入后的所有动物
  5. 我&#34;会&#34;做这样的事情......好吧,其实不是,但为了得到这个想法,我会这样做:

    1. 如果我们考虑不同的客户端,请使用方法MessageShower编写showMessage(String message)接口:对于控制台客户端,使用sysout&#39;一个摆动gui,它显示了消息对话框。
    2. 具有UserInputReader
    3. 的界面String readInput()
    4. AnimalStorageList<Animal> getAnimalList()
    5. 的界面addAnimal(Animal newAnimal)
    6. 具有`showAnimals(List animalsToShow)
    7. 的接口AnimalDisplayer

      因此我们从主程序中解析目的并尝试最小化/隐藏实现以实现失去耦合。我们隔离它们,以实现高内聚,这样你就可以测试不仅更好,而且你的主程序,因为你可以 mock 依赖项,而不必隐式地测试依赖项。由于它们是孤立的,因此更容易理解 - 它们的目的更清晰 - 因此,主程序的目的也将更容易理解!