几个月前问了一个类似的问题:https://0xffff.one/d/280 ,是有关名称类似的object,而这个问题是关于——首先是内容非常类似的命令(command),然后希望将其推广到对方法(method)的操作,如果可能的话。
我的问题的案例是基于Java的,但希望得到的回答不限于任何编程语言,比如Java实现不了但别的能实现。
相关代码是学习Streib的Guide to Data Structures: A concise Introduction using Java 里面Ordered Linked List部分,在创建一个class LinkedList之后通过client class 测试它,开头部分如下:
public class TestLinkedList {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String response;
int number;
LinkedList list;
list=new LinkedList();
System.out.println();
System.out.print("Do you wish to i=insert, d=delete, ");
System.out.print("p=print, or s=stop: ");
response=scanner.next();
然后,如同其他测试程序,这个测试程序也一样的冗长,因为涉及多个操作(插入、删除、输入等)的选择,不可避免用到选择结构,而每个选择项下面都会出现非常类似的命令。这些命令都可以封装成方法,所以我的问题可以推广到方法的类似重复如何更简便地实现。
代码主体是一个巨大的while结构
while (!response.equals("s")){
if (response.equals("i")){
System.out.print("Enter a number to insert into the list");
number=scanner.nextInt();
System.out.print("The number "+ number);
if (list.insert(number))
System.out.println(" was inserted.");
else
System.out.println(" was not inserted.");
}
else
if (response.equals("d")){
System.out.print("Enter a number to delete from the list: ");
number=scanner.nextInt();
System.out.println("The number "+ number);
if (list.detele(number))
System.out.println(" was removed.");
else
System.out.println(" was not removed.");
}
else
if (response.equals("p"))
list.printRecursive();
else {
System.out.print("The command was not i, d, p, ");
System.out.println("or s, please try again.");
}
System.out.println();
System.out.print("Do you wish to i=insert, d=delete, ");
System.out.print("p=print, or s=stop: ");
response=scanner.next();
}
System.out.println();
System.out.println("End of Program");
System.out.println();
}
}
可以看到,每个if或else if之后的内容都非常相似,前两部分(分别选择i和d)可以抽象成如下:
注:变化的部分用[T]代替
if (response.equals("[T1]")){
System.out.print("Enter a number to [T2] the list: ");
number=scanner.nextInt();
list.[T3](number);
System.out.println("The number "+ number);
if (list.[T4](number))
System.out.println(" was [T5].");
else
System.out.println(" was not [T5].");
好了,现在的问题是,有没有办法将这相似两部分简化到一个结构中(比如循环结构:from set of instruction difference 1 to 2, run following block....)?
前三部分(加上选项p)可以从语义/内容而不是表层句发抽象成如下:
if({something true})
then run certain methods/commands
else run another command
这三部分前后承接,构成了一个有机整体,是while结构内部严整有序,这在程序编写和软件开发中是不是有相应的手段在设计层面予以首先总结?