经过了一个星期的从零开始到运用,我们的第一个ui系统算是有惊无险地完成了,上图上图
-----后面把图片换成了小清新的
总的来说,从不知道从哪儿下手,到一步步一行行完成一个属于自己的小程序,成就感还是不小的(今天我200斤)(国庆?那是什么,我的心中只有学习)
咳咳,总的说完,来讲讲项目过程中的一些插曲和感悟
首先,我们把个人编程时的c++代码改成了java,以方便ui的设计,那么,接下来如何将这个只有控制台随机生成题目功能的1.0,或者说0.1版本的代码变成一个有界面的机考小程序呢?
“我来把题目生成和计算的部分做了,你来做一个ui框架,然后把框架合起来不就完事了?”
“成交”
于是,结对编程项目便在这简陋的flag对话后开始了
单纯的编程实现功能,怎么能难到我们这种天才程序员,一天之后,我用后缀表达式实现了对生成的算式的运算,搭档也完成了ui的基本框架
然后我们便开始了传说中的OB编程
“诶,短信验证码怎么弄来着”
这里我必须要说下,在阿里云的教学文档中,我们看到了这样一句
而事实上,短信验证码模块需要的jar包是
嗯,点名批评
然后便可以撸代码了,代码粘上,可以扔进工具箱
在这里我们碰到了一个问题,把两个jar包丢进工程里之后还是有引用报错,满脑子黑人问号,难不成万能的CSDN骗我??
在之后仔细观察发现在官方给出的jar包里有一个和我们需要的包名字特别像,就是这个
而且它就在上一个我们要用的jar包下面。。行吧,找到我们真正要用的jar包,添加,问题解决!
package questionMaker; import java.text.SimpleDateFormat; import java.util.Date; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest; import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse; import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.http.MethodType; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; //验证码发送和接受模块 public class Send_Message { static String mess; //用于ui测试是否发送成功 static int code; public int x; public static void send(String phone) { //外部调用函数,接收手机号发送短信 try { Send_Message smsUtils = new Send_Message(); smsUtils.sendSms(phone); } catch (ClientException e) { e.printStackTrace(); } } public int getCode() { //返回验证码值 return code; } public void setCode() { //随机生成验证码 code = (int)(1000+Math.random()*9000); //每次调用生成一次四位数的随机数 } //短信API产品名称 static final String product="Dysmsapi"; //短信API产品域名 static final String domain="dysmsapi.aliyuncs.com"; static final String accessKeyId = "LTAIIXIUIruVE17v"; //秘钥 static final String accessKeySecret = "9a9iDdUOu1iZQLZ0DWd3ozFih9C5jO"; public SendSmsResponse sendSms(String telphone) throws ClientException { //设置超时时间 System.setProperty("sun.net.client.defaultConnectTimeout", "10000"); System.setProperty("sun.net.client.defaultReadTimeout", "10000"); //初始化ascClient IClientProfile profile=DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret); DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou",product, domain); IAcsClient acsClient=new DefaultAcsClient(profile); //组装请求对象 SendSmsRequest request=new SendSmsRequest(); //使用post提交 request.setMethod(MethodType.POST); //待发送的手机号 request.setPhoneNumbers(telphone); //短信签名 request.setSignName("小初高题目生成器"); //短信模板ID request.setTemplateCode("SMS_146808867"); //验证码 Send_Message sms = new Send_Message(); sms.setCode(); x=sms.getCode(); String codetemp = sms.getCode()+""; request.setTemplateParam("{\"name\":\"Tom\", \"code\":\""+codetemp+"\"}"); //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者 //request.setOutId("1454"); SendSmsResponse response=acsClient.getAcsResponse(request); if(response.getCode() != null && response.getCode().equals("OK")) { //请求成功 mess="发送成功!"; } else { mess="发送失败!"; } return response; } }
好的,不管怎么样,问题1√
然后紧接着,又遇到了问题
“我们在哪儿去验证账号密码啊”
脑子里想到的首先自然是数据库了
这里又有一个小插曲,mysql在之前设置的时候密码忘记了,摆弄了一个上午的连接问题,改密码问题,之后解决的办法竟然是把密码试出来了。
然后就去捣鼓了一个下午mysql,连接,建表,代码实现,当新建的表的属性在控制台显示成功时,心里还是有、激动的
“我有个问题,我们的代码放别人电脑上运行,人家本地没有mysql咋整”
.........
服务器,远端连接?打扰了呀,本地文件吧
package questionMaker; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; //账号名密码储存,验证模块 public class File_Oprator { static String filename="account.txt"; public static int read(String name) { try { // 防止文件建立或读取失败,用catch捕捉错误并打印,也可以throw /* 读入TXT文件 */ File file = new File(filename); // 要读取以上路径的input.txt文件 InputStreamReader reader = new InputStreamReader(new FileInputStream(file)); // 建立一个输入流对象reader BufferedReader br = new BufferedReader(reader); // 建立一个对象,它把文件内容转成计算机能读懂的语言 String line; while ((line = br.readLine()) != null) { if(line.equals(name)) { return 1; } } } catch (Exception e) { e.printStackTrace(); } return 0; } public static int readName(String name) { try { // 防止文件建立或读取失败,用catch捕捉错误并打印 /* 读入TXT文件 */ File file = new File(filename); // 要读取以上路径的input.txt文件 InputStreamReader reader = new InputStreamReader(new FileInputStream(file)); // 建立一个输入流对象reader BufferedReader br = new BufferedReader(reader); // 建立一个对象,它把文件内容转成计算机能读懂的语言 String line; while ((line = br.readLine()) != null) { char cline[]=line.toCharArray(); for(int i=0;i<line.length();i++) { if(cline[i]==‘ ‘) { line=line.substring(0, i); } } if(line.equals(name)) { return 1; } } } catch (Exception e) { e.printStackTrace(); } return 0; } public static int write(String name) { try { /* 写入Txt文件 */ File file = new File(filename); // 相对路径,如果没有则要建立一个新的output.txt文件 BufferedWriter out = new BufferedWriter(new FileWriter(file,true)); out.write(name+"\r\n"); // \r\n即为换行 out.flush(); // 把缓存区内容压入文件 out.close(); // 最后关闭文件 } catch (IOException e) { e.printStackTrace(); } return 1; } public static int check(String password) { //判断密码是否合法 int flagCap=0,flagLow=0,flagNum=0,flagLen=0; char pass[]=password.toCharArray(); for(int i=0;i<password.length();i++) { if(pass[i]>=‘a‘&&pass[i]<=‘z‘) { flagLow=1; } if(pass[i]>=‘A‘&&pass[i]<=‘Z‘) { flagCap=1; } if(pass[i]>=‘0‘&&pass[i]<=‘9‘) { flagNum=1; } } if(password.length()>=6&&password.length()<=10) { flagLen=1; } if(flagLow==1&&flagCap==1&&flagNum==1&&flagLen==1) { return 1; } return 0; } }
说人话就是,创建了一个
里面每一行放着的就是账号+密码了
问题2强行√
“诶,我这里要的是生成的算式啊,你给我返回个string数组我咋弄啊”
“你这里这个不对啊,密码为空应该也要弹一个警告出来才对吧”
“**,出bug了,问题在哪儿啊,在这儿写个main函数测试一下吧”
........
emmmmmmm,你看我们多快乐啊,满脸写着开心
原以为可以快速解决的合代码部分反而花了最多的时间,接口的事先交流不足,合起来出现的各种bug,突然想到的新需求,我们深刻地体会到了老师课上所说的交流成本,两个人围着代码看了两三天,已经实现功能的代码就因为bug都平白多出了个小300行,轻松突破1300大关
最终,分了洋洋洒洒六个模块的“大作”还是应运而生了
写bug可真开心啊
最后给一下我们ui的设计模块:
最后还是总结一下结对编程得到的感悟和教训:
1.相对于个人完成一个项目,结对编程每个人的代码量无疑少了很多,每个人只需要完成属于自己的模块
2.动手敲代码之前的交流很重要,自己的代码所需要的接口,以及给下一个模块的接口都要事先设计好,这点在之后的团队项目尤为重要
3.度娘真是个好东西(CSDN天下第一!)
4.项目开发的每个人都遵守编码规范是保持代码风格统一的最好办法
5.保持代码高内聚(一个模块做一件事)能极大地方便项目的进行
结对编程成员:石华霖,张鑫平
原文:https://www.cnblogs.com/suru723/p/9750215.html