java小技能:写代码的顺序、使用UML的场景

298 阅读8分钟

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 7 天,点击查看活动详情

引言

学习java的方法:先理解了方法与方法之间的关系,主要是他们之间的执行顺序和调用关系。 通过一个练习加强理解,进而继续理解类与类的关系,最后理解包与包的关系。

编程来源于生活,理解了生活,就理解编程。

I 预备知识: 方法

方法:用来表示对象的功能,它依赖于对象而存在。方法是动作,一般使用动词来声明。

1.1 定义语法

修饰符 返回值 方法名(参数列表){
return//值的类型一定要与返回值的类型匹配

}

方法没有返回值,使用void关键字占位。

1.2 调用语法

方法名 (值1,值2);

方法调用的传值,值的类型应与定义对应位置类型一致;

1.3 形参和实参

形参:在方法定义时,存在于参数列表中的变量。

作用:用来接收来自实参所传递的值。

实参:在方法调用时,存在参数列表的值或变量。

作用:传值给形参。

java只有一种传值方式,就是值传递。

II 写代码的顺序

  1. 先写子类,再写父类;先写方法的调用,再写方法的定义。

  2. 定义参数时,优先考虑八大基本数据类型。

  3. 当定义变量的需求过多,优先考虑数组类型。

  4. 定义方法:根据逻辑定义功能

III UML

UML主要用于沟通,是大家熟悉认同的语言而已。面向对象分析和设计来源于设计者的头脑,重点是设计者的思想和理念。

比如,决定一张照片的好坏是后面的头脑而不是器材。

在画UML 图的类图(Class Diagram)时,要先了解一下类的3种关系。

UML使用类图表示类,接口以及关联。类图用于静态建模,类图由3部分组成(类名,属性,操作)。

3.1 类的3种关系

在UML中,事物之间相互联系的方式(无论是逻辑上的还是物理上的)都被建模为关系。在面向对象的建模中,有3中重要的关系:依赖关联泛化

  1. 依赖(dependency)是使用关系。说明一个事物使用另一个事物的信息和服务。

例如,水管依赖热水器,对它们所运送的水进行加热。

  1. 关联(association)是实例之间的结构关系。类之间的关联关系大多用来表示变量实例持有着其他对象的引用。

其中,还有聚合与组合都是关联的一种特殊形式。聚合它意味着整体和部分的关系;而组合是一种特殊的聚合形式。

例如,一个房间是由墙和一些其他事物组成的,墙上可以嵌套门和窗,管道可以穿通墙体。

  1. 泛化(generalization),把一般类连接到较为特殊的类,也称为超类和子类关系,称为is-a-kind-of关系。

例如,观景窗是一种带有固定的大窗格的窗户,庭院是一种带有向两边开的窗格的窗户。

3.2 使用UML的场景

  1. 作为草图-与他人交流设计方案,来指导更详细的设计或编码人员进行开发
  2. 作为编程蓝图和详细设计指导
  3. 作为系统结果的road map ,这种脉络图可以使开发者快速找到类之间的依赖关系,并提供系统结构的参考。
  4. 作为代码的逆向工程图——帮助代码维护人员,阅读、分析和检查代码,快速了解代码结构。
  5. 在理论、工具和可用性方面处于发展阶段:把UML作为编程语言,即基于UML模型驱动(MDA),用UML全程建模,完成软件系统可执行规格说明,代码自动生成。

3.3 关于UML的保留和舍弃

养成舍弃UML图的习惯,最好,养成不要把图建立在能长期保存的介质上的习惯。在一个白板或一个草稿纸上画它们,经常擦掉白板或舍弃草稿纸。

原则上不使用Case工具或画图工具,这些工具只用一次即可,你的大多数UML图都是短命的。

但有一些图保存下来是非常有用的:

  1. 表现你的系统中一个通用设计解决方案图
  2. 记录了复杂的协议,难以通过代码了解的图
  3. 提供了比较少涉及到的系统范围的“路标图“的图
  4. 记录了比代码更易表述的设计意图的图。

3.4 敏捷开发工程

  1. 定义用例:需求分析可能包括人们如何使用应用的情节或场景
  2. 定义领域模型:面向对象的分析关注领域的概念,属性和关联来形成OOA结果领域模型(domain model),在领域模型中展示重要的领域对象。
  3. 分配对象职责,并绘制交互图:ood关注软件对象的定义-它们的职责和协作。

注:顺序图(sequence diagram)是描述协作的常见表达方式,它展示了软件对象之间的消息流,和由消息引起的方法调用。

  1. 定义设计类:使用设计类来表示有效类定义的静态视图,重点描述类的属性和方法。

IV 案例(试卷系统)

使用方法之间的调用关系,来完成一个试卷系统。该试卷系统有试卷Paper类,Choice抽象类,以及Choice的两个子类MultChoice和SingleChoice类。 实现一个可以在控制台录入当选题和多选题,并答题的系统。 他们之间的UML由于较简单,就不画了。具体可参照下面的代码实现。

4.1 提供用户输入管道(Scanner)

import java.util.Scanner;
Scanner sc=new Scanner(System.in);

long nextLong() 阻塞方法,用户必须输入数据,程序才继续执行

String next() 从控制台读取字符串(不允许带空白:\t ;)

String nextLine() 从控制台读取字符串(允许带空白)

注:在使用nextLine时,需要独立创一个管道,否则,nextLine()就会将上次的输入的回车记录为用户输入的字符串。

所有的方法都直接或者间接的被main方法调用;main方法是应用程序的入口点。

4.2 代码实现

  1. 试卷系统中的选择题的抽象类
package com.csuinfosoft.paper;
/**
 * 
 * @author 张坤楠
 * @date 上午8:47:11
 * 试卷系统中的选择题的抽象类
 */
public class Choice {
	private String question;//题干
	private String a;//选项A
	private String b;//选项B
	private String c;//选项C
	private String d;//选项D
	private double score;//分数
	public Choice() {
		this(null, null, null, null, null, 0.0);
	}
	public Choice(String question, String a, String b, String c, String d,
			double score) {
		this.question = question;
		this.a = a;
		this.b = b;
		this.c = c;
		this.d = d;
		this.score = score;
	}
	public String getQuestion() {
		return question;
	}
	public void setQuestion(String question) {
		this.question = question;
	}
	public String getA() {
		return a;
	}
	public void setA(String a) {
		this.a = a;
	}
	public String getB() {
		return b;
	}
	public void setB(String b) {
		this.b = b;
	}
	public String getC() {
		return c;
	}
	public void setC(String c) {
		this.c = c;
	}
	public String getD() {
		return d;
	}
	public void setD(String d) {
		this.d = d;
	}
	public double getScore() {
		return score;
	}
	public void setScore(double score) {
		this.score = score;
	}
	
}
  1. 多选题的实体类
package com.csuinfosoft.paper;
/**
 * 
 * @author 张坤楠
 * @date 下午2:30:45
 * 多选题的实体类
 */
public class MultChoice extends Choice{
	private char[] correctAnswer;
	private char[] answer;
	public MultChoice() {
		this(null, null, null, null, null, 0.0, null, null);
	}
	public MultChoice(String question, String a, String b, String c, String d,
			double score,char[] correctAnswer,char[] answer) {
		super(question, a, b, c, d, score);
		this.correctAnswer=correctAnswer;
		this.answer=answer;
		// TODO Auto-generated constructor stub
	}
	public char[] getCorrectAnswer() {
		return correctAnswer;
	}
	public void setCorrectAnswer(char[] correctAnswer) {
		this.correctAnswer = correctAnswer;
	}
	public char[] getAnswer() {
		return answer;
	}
	public void setAnswer(char[] answer) {
		this.answer = answer;
	}
	
}
  1. 单选题的实体类
package com.csuinfosoft.paper;
/**
 * 
 * @author 张坤楠
 * @date 下午2:32:46
 * 单选题的实体类
 */
public class SingleChoice extends Choice{
	private char correctAnswer;
	private char answer;
	public SingleChoice() {
		this(null,null,null,null,null,0.0,'\0','\0');
	}
	public SingleChoice(String question, String a, String b, String c,
			String d, double score,char correctAnswer,char answer) {
		super(question, a, b, c, d, score);
		this.correctAnswer=correctAnswer;
		this.answer=answer;
		// TODO Auto-generated constructor stub
	}
	public char getCorrectAnswer() {
		return correctAnswer;
	}
	public void setCorrectAnswer(char correctAnswer) {
		this.correctAnswer = correctAnswer;
	}
	public char getAnswer() {
		return answer;
	}
	public void setAnswer(char answer) {
		this.answer = answer;
	}
	
}
  1. 试卷实体
package com.csuinfosoft.paper;
/**
 * 
 * @author 张坤楠
 * @date 下午2:34:43
 * 试卷实体
 */
public class Paper {
	private Choice[] singleChoice;
	private Choice[] multChoice;
	private double score;
	public Paper() {
		this(null,null,0.0);
		// TODO Auto-generated constructor stub
	}
	public Paper(Choice[] singleChoice, Choice[] multChoice,double score) {
		this.singleChoice = singleChoice;
		this.multChoice = multChoice;
		this.score=score;
	}
	
	public double getScore() {
		return score;
	}
	public void setScore(double score) {
		this.score = score;
	}
	public Choice[] getSingleChoice() {
		return singleChoice;
	}
	public void setSingleChoice(Choice[] singleChoice) {
		this.singleChoice = singleChoice;
	}
	public Choice[] getMultChoice() {
		return multChoice;
	}
	public void setMultChoice(Choice[] multChoice) {
		this.multChoice = multChoice;
	}
	
}
  1. 试卷系统
package com.csuinfosoft.paper;
import java.util.Scanner;
import java.util.Arrays;
/**
 * 
 * @author 张坤楠
 * @date 下午2:37:23
 * 试卷系统
 */
public class PaperSystem {
	public static void main(String[] args){
		for(;;){
			//输出菜单
			menu();
			int num=getNumMenu();
			boolean flag=validata(num);
			if(!flag){
				System.out.println("您的输入有误");
				continue;
			}
			process(num);
		}
	}
	public static void process(int num){
		if(num==2){
			System.exit(0);
		}
		Choice[] singleChoice=getSingleChoice();
		Choice[] multChoice=getMultChoice();
		//生成试卷
		//获取试卷总分
		double score=getScoreAll(singleChoice,multChoice);
		Paper paper=getPaper(score,singleChoice,multChoice);
		System.out.println("您的分数:"+exam(paper));
	}
	public static double exam(Paper paper){
		
		Choice[] m=paper.getMultChoice();
		Choice[] s=paper.getSingleChoice();
		for(int i=0;i
    
    更多内容请关注公众号:iOS逆向