结对项目解读-队友代码解析

既然是两两一组自然是找室友搭档是最方便的了。于是在看到结对编程的时候就已经和室友商量好要搭档合作了。(当然也是为了抱住大腿)

在语言方面,搭档用的是Java语言,而我用的是C++,两个人所用语言不同,但是在结对编程的要求中要求做页面,一对比就很明确知道还是要靠搭档了。所以也主要分析一下搭档的代码方便后期结对编程在她的代码基础上进行更改提高。

 

首先是一个自我反思的过程,通过对她的代码的解读发现很多需求是我以为我完成了实际上我并没有成功达成需求。而且很多情况的产生不够随机,还是有些尴尬的。代码表面上显示的仿佛是都做到了,也随机出题随机产生了,但是相比较脑内活动,还是有很多情况不在考虑范围内的。而她的实现就比较完全了,在分析她的代码的时候还是比较有感受的。

 

那么,接下来就是主要针对她的代码的解析了。

 


 

 

首先,在阅读搭档的代码时有几点建议,感觉这个是她做的不是很完善的地方(当然,我也在这几点中有做的不完善的情况)。

    1. 她在生成文本文档时,没有生成文件夹的操作,而是直接在主函数中确定了路径然后存入。也就是说如果我没有预先为每个老师设置好文件夹的话这个就会报错。在这个方面程序的扩展性不够。
      1.  1 public class AutoQuizSystem {
         2 
         3     /**
         4      * 当前用户的存储路径 path
         5      */
         6     // 需根据实际情况修改路径
         7     static String path = "D:\\hi girl\\湖大\\作业\\大三上\\软件工程导论\\1班-李畅\\1班-李畅\\Quiz\\";
         8 
         9     public static void main(String[] args) {
        10         // TODO Auto-generated method stub
        11         /**
        12          * 运行程序,用户登录。
        13          */
        14         new Login();
        15     }
        16 
        17 }

        但是,她这里包含创建文件操作。我们可以在后期对代码进行修改时通过查阅资料等方式,将文件夹也由代码创建出来。

      2.  1 String fileName = now.get(Calendar.YEAR) + "-" + (now.get(Calendar.MONTH) + 1) + "-"
         2                 + now.get(Calendar.DAY_OF_MONTH) + "-" + now.get(Calendar.HOUR_OF_DAY) + "-" + now.get(Calendar.MINUTE)
         3                 + "-" + now.get(Calendar.SECOND) + ".txt";
         4 
         5         /**
         6          * 创建新文件,用于存储题目
         7          */
         8         File file = new File(AutoQuizSystem.path + Login.name[Login.i], fileName);
         9         if (!file.exists()) {
        10             try {
        11                 file.createNewFile();
        12             } catch (IOException e) {
        13                 e.printStackTrace();
        14             }
        15         }

         

    2. 她在运算时首先判断这个的密码是否是123,也就是将登陆密码全部设置为123,没有考虑更多其余情况。虽然是由于老师所给的需求文档里所有人的密码情况都是123,但是这样子的设置在后期设置中会导致很多问题,也加大了对代码的修改程度,是否可以运用容器等,姓名和密码分别处于一个容器,然后容器的初始长度相同,在加入的途中判断存储姓名的容器中对应的名字和存储密码的容器中对应的密码是否相互匹配。(当然,我在设置时是直接运算的,也就是直接用判断语句生成的 PS:在和她探讨的过程中有了新的想法,也许我们可以用一个类存储用户名和密码,然后用容器存储这个类。也是一个方案。
      1. 1 if (psw.equals("123")) { //type表示当前用户的等级,name中存储9个教师情况
        2                     for (i = 0; i < 9; i++) {
        3                         if (usr.equals(name[i])) {
        4                             if (i < 3)
        5                                 type = "小学";
        6                             else if (i < 6)
        7                                 type = "初中";
        8                             else
        9                                 type = "高中";

         

    3. 搭档的代码功能基本都能够实现,但是有一个问题,就是她的注释不是很多,对每一个功能的注释也不是很明确。寥寥几处注释,主要是介绍了这个函数的功能等,具有针对性的注释不是很多。但是却也有部分原因,我们后文细说~  
    4. 在具体代码方面,本次文档所写的需求较多,需要的功能函数也比较全面,但是仔细看搭档的函数会发现她的函数进行了合并——有一些功能比较简单的函数就直接与其他功能的函数合并了,在后期修改的过程中较为麻烦。

一概而论的话,搭档的代码大体情况很好,但是在部分方面可扩展性不够强。后期如果增添更多需求或者别的方案的话代码的修改幅度较大。

 


 

 

当然,瑕不掩瑜。在学习搭档代码的过程中还是学到了很多也了解了很多的。

    1. 搭档在编写代码时考虑较多,想法也比较全面。看到她直接做了界面就可以感慨了。不愧是做了n次pm的人,果然很懂需求。当然,也感谢搭档做了界面,按键等功能,在结对编程时就可以有所依据,有一定基础与打底了。
    2. 在写代码时,搭档写了几个.java为后缀的文件,不同的文件控制不同的窗口及功能,确实是感觉到了其中的逻辑性与布局的合理性。
    3. 接下来就是上文中留的悬念了,搭档在写代码时注释不是很多,但是运用了大量的Java自带API,这样也可以大大提高代码的可移植性。(就是对像我这种不是很熟悉API的人是一种折磨,为了读懂代码需要查很多API的功能啥的)
       1 /**
       2      * 构造函数
       3      * 
       4      * 功能实现:生成登录窗口(用户名输入、密码输入、登录键)。
       5      */
       6     public Login() {
       7         setTitle("自动出题系统");
       8         setLayout(null);
       9         Container c = getContentPane();
      10         JLabel username = new JLabel("用户名:");
      11         final JTextField un = new JTextField();
      12         JLabel password = new JLabel("密码:");
      13         final JPasswordField pw = new JPasswordField();
      14         pw.setEchoChar('*');
      15         JButton login = new JButton("登录");

       

    4. 在设置初高中出题过程中,搭档的随机方案较好,在每一处设置随机值,在其中安插一些需要的函数。并且设置每一个功能块的计数操作,如果从头到尾没有初中必备(开根或者平方)或高中必备(tan,sin,cos函数)操作,则在最后为其随机产生一个位置放入操作。这些方法都利于一些特殊情况的操作。也正是我在最初所说,通过阅读搭档的代码更能明确自己代码的缺陷,找到自己代码的不足。
    5. 用户出题级别较为多变。在每一次出题后用户都可以重新选择自己的出题类型。这样子也方便用户随时更改自己需要的等级。这个设计也是比较让我佩服的。我当时在分析这个需求的时候就比较懵逼,不太懂这个需求的具体意思,但是看完搭档的代码以及运算演示后更加感觉自己对需求的理解不到位,在实现过程中还是有很多问题。

 

 


 

 

最后,在小小的分析之后当然是要总结一下这个结对编程中代码复审过程的意义所在啦~

    1. 通过审核搭档的代码,反而对自己的代码更是一种反思,明确了自己在写代码过程中的种种不足,也在分析对方代码的过程中明确了一些自己没发现的不足之处与可改进之处
    2. 审核对方的代码,其实也是对自己代码的一种审核:她实现的功能我实现了吗?她在这里是这样实现的,那我呢?我们两个的实现方式谁的更好一点?这些需求我们的不同理解不同实现谁会更加贴近于用户的需求?种种问题更是一种自我反思,在不断地自我反思中我们也会不断进步。
    3. 三人行,必有我师焉。两人前行,更能相互鼓励共同前行。相互对比,共同讨论,一个问题的解决方案会有很多,一个人或许只能想出来一点,两个人一起考虑可能就会想出一个更完美的解决方式策略。这也许就是结对的魅力所在。
    4. 搭档之间相互diss,相互表扬,更能知道自己的不足,明确自己的优势所在,在未来的发展过程中更能取己精华去己糟粕。这样才能不断进步不断前行。
    5. 同样也要感谢自己的搭档啊,没有他们的diss我们可能都发现不了自己的一些失败与不足(然后还自以为自己是成功的,恩,比如我)。

 

转载于:https://www.cnblogs.com/clover-muyou/p/9715663.html

你可能感兴趣的:(结对项目解读-队友代码解析)