首页 > 其他 > 详细

结对编程项目有感

时间:2018-10-07 16:22:29      阅读:151      评论:0      收藏:0      [点我收藏+]

经过了一个星期的从零开始到运用,我们的第一个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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!