该系列文章系个人读书笔记及总结性内容,任何组织和个人不得转载进行商业活动!
第五章:编写程序-超强力方法
这一章实际是在叫我们如何编写一个简单的程序;
我们不会全部记录,而是会着重关注Java语言本身;
有关程序设计的方式,略有介绍(毕竟我不是小白hahahaha)
让方法产生更大的作用:
我们已经属性变量、对象,现在我们还要接触运算符,while循环,for循环;
产生随机数的方法,将String转换成int,从无到有写一个使用的程序;
(先来个简单版的,后续再写复杂的)
需求分析,程序设计:
1.首先进行高层分析:
明确需求点,画出流程图;
2.开发类:
也许你会有自己的编程方法论(methodology)/过程(process)/步骤(approach);
我们则可以这样做(理解和学习想法):
1)找出类应该做的事情;
2)列出实例变量和方法;
3)编写方法和伪码(有点像注释);
4)编写方法的测试用程序;(预设的输入,理论的输出,用作测试)
5)实现类;
6)测试方法;
7)除错或重新设计;
你可能会设计很多类:设计类的时候最好遵循良好的面向对象原则,并且不让单一的类执行太多的任务;
上边的过程在编写时可简单理解为:
编写伪码:伪码能帮你专注于逻辑而不需要顾虑到程序的语法;
编写测试码:用于测试程序的代码;
编写真实码:实际设计出的真正Java程序代码;
伪码大致分为:
实例变量的声明(Declare);
方法的声明(Declare);
方法的逻辑(Method);
(就是用文本描述清楚上述3点)
先编写测试用程序代码的概念来自极限编程(XP)方法论;
XP部分规则如下:
多次经常小规模发布;
避免加入规格没有的功能(不管“未来”会用到的功能性有多诱人);
先写测试用的程序;
正常工作上下班;
随时随地重构(refactor),也就是改善程序代码;
保持简单;
双双结伴进行工作,并经常交换以便让大家都清楚全局;
理想上,先写一点点的测试吗,然后只编写能够通过该测试的方法就好;之后在编写另一点。。。如此反复;
你就能证明新加入的程序代码不会破坏原有已经测试的部分;
把字符串转换成int:
int guess = Integer.parseInt(“999”);
Integer:Java内建类
这个方法只会对代表数字的String产生作用,除此之外,程序会崩溃(就是抛出一个异常,后续会介绍);
for循环:(加强版)
for(int cell : cells){}
类似OC的for-in;
‘:’表示in;
注意自增、自减运算符的使用;
break:
无条件跳出循环;
伪码设计:
当你在编写伪码时,应该要假设你总有办法可以做出某些功能,如此才能让你专注于逻辑设计;
要点:
你的Java程序应该从高层设计开始;
你通常会在创建类时写出下列3种东西:
伪码;
测试码;
真实码;
伪码应该描述要做的事情,而不是如何做;
使用伪码来帮助测试码的设计;
实现方法前应编写测试码;
知道反复执行的次数,for循环比while循环更好;
使用前置或后置的递增可以为变量+1;(递减的-1)
使用Integer.parseInt()来获取String的整数值;(只会在String为数字时有作用)
使用break命令来提前跳出循环;
random():
获取0~4之间的int可以这样做:int randomNum = (int)(Math.random()*5);
Math是Java内建的类,Math.random()会返回一个介于0~1之间的数;
0.x~4.x取整之后就是0~4的某个值;
helper-从命令行获取输入:
(Code-GameHelper.java)
import java.io.*;
public class GameHelper{
public String getUserInput(String prompt){
String inputLine = null;
System.out.print(prompt + " ");
try{
BufferedReader is = new BufferedReader(new InputStreamReader(System.in));
inputLine = is.readLine();
if(inputLine.length() == 0){
return null;
}
}catch(IOException e){
System.out.println("IOException:" + e);
}
return inputLine;
}
}
比较for循环和while循环:
while循环只有boolean测试,没有内建的初始化或重复表达式;
while适合用在不知道要循环几次的循环上,若知道要执行几次,则使用for会比较容易阅读;
再看加强版for循环:
Java5.0(Tiger)开始支持,能够容易的逐个运行数组或其他集合(Collection)的元素;
转换primitive主数据类型:
long->short 转换的话,精度会损失;且由于long比short大,编译器也不允许;
若要强制编译器,可以使用cast运算符;
示例:long y = 43;
int x = (int)y;
前置的类型转换会告诉编译器要将y的值裁剪成int的大小来赋值给x;(如果超过int的范围,结果会很诡异)