2016-12-08 35 views
0

我正在尝试编写一个程序,允许用户将字符串值输入到包含arrayLists的多个方法中。我有2个问题:面向对象与线性编程

  1. 我的代码似乎是线性的(我想确保我正在使用面向对象的编程原则)。
  2. 我很难编写while循环来将用户输入的值添加到arrayList中。由于我不知道将会输入多少个值,我认为这将是一个合适的方法。

这是我到目前为止,您的意见受到重视和赞赏:

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)); 
    } 
+2

某些逻辑像'while while true,type quit to end'用户输入可以通过Scanner.nextLine获得 –

+1

使代码容易阅读时,使用过程代码没有任何问题。面向对象的解决方案只适用于面向对象的问题。 – 4castle

+0

除非你想有重复的动物类型,那么我可能会建议你使用Set而不是ArrayList –

回答

0

要做到面向对象编程,你需要的对象。如果你不需要对象,那么对于普通/传统的结构化编码你就没问题。我不确定最初的问题需要OOP,而不是没有关于需要添加什么的附加信息。

(并不是每一个问题本身借给OOP,当你终于可以使用OOP的点,而继承有趣的是,喜欢用超过继承接口。)

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()); 

即使被警告,有真的没有一点这样的做法因为每个类都是空的。但它面向对象,就像你告诉我们你想实现的那样。

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

+0

这个答案对于构建一个良好解耦的面向对象程序来说是非常棒的,尽管我认为它会直截了当。 ---我认为你应该发布它,因为它对构造OO代码有很好的建议。 – byxor

+0

在您的提示中,我添加了我的评论作为回答 –

+0

谢谢布兰登!这是一个很棒的建议! – Victor

0

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

2)当从控制台接收未知量的输入时,while循环是正确的方法。要检测用户何时完成,我建议使用定点值。这是一个短语,当检测到时,会导致你的循环通过休息或返回来停止。这些例子将是“退出”或“停止”。你会在他们输入它检查输入,如果它的这个标记值,你就退出循环:

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

除了布兰登的伟大答案,乐于进行动物类型,OOP可以用于抽象的类AnimalTypeInputter然后可以被扩展为其他TypeInputtersaddNewTypelistAllTypesfindType等。除了提示,这些方法可能会从基底GenericTypeInputter

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)); 
    } 

} 
+0

应该使用Set而不是ArrayList。应该将'y'或'n'作为不区分大小写 –

+0

非常感谢你们,你们给了我一些很棒的点子!我非常感谢。 – Victor

0

对于所有这些,说问题太小:Horsepoop!如果你不能将面向对象,原则或模式应用于一个小问题,你将无法将它们应用于一个大问题。这个例子其实是近乎完美的!

对于那些说你不需要的对象:Bullpoop!

现在有很多的,我们必须考虑的原则,例如:

  • 如果我们有一个控制台客户端和GUI客户端是什么,如何让我们的业务逻辑可重用(即使它只是添加东西到一个列表!)
  • 我们如何测试它!因为好的代码和测试代码一样好,测试代码和生产代码一样有价值!
  • 如何我们实现失去耦合高内聚,或我们如何运用单一用途模式

现在我们分析一下,这是什么代码实际上呢,我们将其分成了目的

  1. 它告诉用户,他有动物的列表中选择,简单的消息
  2. 它读取用户
  3. 输入它添加了用户输入的动物名单
  4. (我猜),它显示了所有的动物用户输入

我“会”做这样的事情后。 ..好了,其实不是,但得到的想法,我会做这样的:

  1. MessageShower接口,具有方法showMessage(String message),如果我们考虑不同的客户:控制台客户它SYSOUT的,用于例如一个摇摆鬼,它显示消息对话thingie。
  2. 接口UserInputReaderString readInput()
  3. 接口AnimalStorageList<Animal> getAnimalList()addAnimal(Animal newAnimal)
  4. 接口AnimalDisplayer与`showAnimals(名单animalsToShow)

所以我们从主程序分离目的并尽量减少/隐藏实现失去耦合。我们隔离他们,实现高内聚,这样你就可以测试不仅他们更好,而且你的主程序,因为你可以模拟的依赖性远,而不必含蓄测试的依赖。由于他们是孤立的,他们更容易理解 - 他们的目的更清晰 - 因此,主程序的目的也将更容易理解!