HuaXinIM聊项目阶段总结二(从别人身上总结经验吸取教训)
2016-05-13 00:10
246 查看
今天在华信继续完成HuaXinIM聊项目,有一个人没来,有一个只来了一会儿,其中一人项目完成得差不多了,另一个人忙完了他的事,也开始项目的编程了,但是因为他们今晚不在华信上课,所以我们没有太多的交流,对于他们的项目也不太了解,其中一个组员对框架提出了意见,经过思索,发现还是可取的。
今晚的课程时间是小组各完成各自项目,其中一个组员的对于他所负责的项目内容不太了解,思路也不太清晰,所以我今晚几乎都在他的身边帮助他理清思路。
平时他要忙的事似乎比较多,所以有可能课程不太跟得上,一些Java的基础知识也不太牢固,对于Java的基本思想封装性也了解得不够深入,这是我在帮助他,让他理清思路编写远程控制模块的时候发现的问题。
在跟他讲解的时候,我也发现了团队项目的完成不能够有太多的限定,我本以为在那个类里面只要两个方法就可以了,但是这也是我的想法。
但是我在帮助他理清思路的时候,发现他老是问我:“是不是这样”、“这样可不可以”、“这样对不对”。
刚开始我一直回答他的问题,到了后来我发现了不太对劲,似乎心里有一个疑问:怎么好像是他遇到问题,然后抛给了我,我得出了答案,然后告诉他一样?事实上也确实如此,我代替了他的思考,剥夺了他的主动性,这样确实可以让项目更快的完成,但是他从中学习到的知识与积累下的经验也就聊聊无几了。
后来我就改变了帮助的方法,我不回答他的问题,反而问他问题,然后让他自己解答;他遇到了不确定的地方,怕犯错误,然后问我正确与否,我也不回答,让他自己去尝试,这也是我亲身的经验:犯过错误才能够印象深刻。
这样之后,虽然后来时间长了很多,但是我确实帮助了他,让他从中学习到了很多知识经验,最后终于把远程控制的代码编写完成。
在代码的封装性与整洁度上看,他的代码确实惨不忍睹...下面发上来,让诸君看一看:
在编写代码的时候,发现他一个不太可取的地方就是:他是在测试项目中写实现的代码,然后直接复制粘贴到了项目框架上去了,而不想想每一行代码的逻辑结构与模块的组成,代码之间的耦合度与如何解耦。
要是我写的话,我会在框架上重新创建一个方法:里面先写上
//TODO 创建窗体,添加监听器
//TODO 实时接收截图
//TODO 发送鼠标事件
然后就是代码的一个个填充,而不会省事的把测试项目中的代码直接照搬到框架上,再慢慢修改,说实话:看到他复制粘贴那一幕我真是惊呆了...
今晚的课程时间是小组各完成各自项目,其中一个组员的对于他所负责的项目内容不太了解,思路也不太清晰,所以我今晚几乎都在他的身边帮助他理清思路。
平时他要忙的事似乎比较多,所以有可能课程不太跟得上,一些Java的基础知识也不太牢固,对于Java的基本思想封装性也了解得不够深入,这是我在帮助他,让他理清思路编写远程控制模块的时候发现的问题。
在跟他讲解的时候,我也发现了团队项目的完成不能够有太多的限定,我本以为在那个类里面只要两个方法就可以了,但是这也是我的想法。
但是我在帮助他理清思路的时候,发现他老是问我:“是不是这样”、“这样可不可以”、“这样对不对”。
刚开始我一直回答他的问题,到了后来我发现了不太对劲,似乎心里有一个疑问:怎么好像是他遇到问题,然后抛给了我,我得出了答案,然后告诉他一样?事实上也确实如此,我代替了他的思考,剥夺了他的主动性,这样确实可以让项目更快的完成,但是他从中学习到的知识与积累下的经验也就聊聊无几了。
后来我就改变了帮助的方法,我不回答他的问题,反而问他问题,然后让他自己解答;他遇到了不确定的地方,怕犯错误,然后问我正确与否,我也不回答,让他自己去尝试,这也是我亲身的经验:犯过错误才能够印象深刻。
这样之后,虽然后来时间长了很多,但是我确实帮助了他,让他从中学习到了很多知识经验,最后终于把远程控制的代码编写完成。
在代码的封装性与整洁度上看,他的代码确实惨不忍睹...下面发上来,让诸君看一看:
// 控制方法Control() 被控制方法byControled() // 获取io流 public ObjectInputStream ois; public ObjectOutputStream oos; public DistanceControl(ObjectInputStream ois, ObjectOutputStream oos) { this.ois = ois; this.oos = oos; } // 定义一个机器人类对象,用于操控 private Robot robot; { try { robot = new Robot(); } catch (AWTException e) { e.printStackTrace(); } } public JLabel imageLabel; /** * 初始化窗体 */ public void Control() { imageLabel = new JLabel(); this.add(imageLabel); Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); this.setSize(dim); this.setDefaultCloseOperation(3); this.setLocationRelativeTo(null); new Thread() { public void run() { while (true) { // 显示屏幕 receivePicture(); } } }.start(); this.setVisible(true); this.addMouseListener(ma); this.addMouseMotionListener(ma); this.addMouseWheelListener(ma); this.addKeyListener(ka); } /** * 鼠标监听 */ MouseAdapter ma = new MouseAdapter() { public void mousePressed(MouseEvent e) { sendEvent(e); } public void mouseReleased(MouseEvent e) { sendEvent(e); } public void mouseClicked(MouseEvent e) { sendEvent(e); } public void mouseMoved(MouseEvent e) { sendEvent(e); } public void mouseDragged(MouseEvent e) { sendEvent(e); } }; /** * 键盘监听 */ KeyAdapter ka = new KeyAdapter() { public void keyPressed(KeyEvent e) { sendEvent(e); } public void keyReleased(KeyEvent e) { sendEvent(e); } }; /** * 发送事件 */ private void sendEvent(InputEvent e) { try { oos.writeObject(e); oos.flush(); } catch (IOException e1) { e1.printStackTrace(); } } /** * 接收截图 */ public void receivePicture() { try { // 获取长度 int imageLength = ois.readInt(); // 创建图片字节数组 byte[] data = new byte[imageLength]; // 读取一张图片的字节数组 ois.readFully(data); // 将读入字节转化为一个BufferedImage对象 ByteArrayInputStream bais = new ByteArrayInputStream(data); BufferedImage image = ImageIO.read(bais); ImageIcon icon = new ImageIcon(image); imageLabel.setIcon(icon); imageLabel.repaint(); } catch (IOException e) { e.printStackTrace(); } } /** * 被控制方法 */ public void byControled() { try { // 发送图片 new Thread() { public void run() { while (true) { try { createImage(); } catch (Exception e) { e.printStackTrace(); } } } }.start(); new Thread() { public void run() { while (true) { // 读取操作 readOperate(); } } }.start(); } catch (Exception e) { e.printStackTrace(); } } /** * 读操作对象 */ public void readOperate() { try { // 读对象 Object ie = ois.readObject(); // 判断转换前的类型 if (ie instanceof MouseEvent) { // 转换为鼠标事件 MouseEvent me = (MouseEvent) ie; // 判断当前鼠标事件是由什么触发的 int id = me.getID(); if (id == MouseEvent.MOUSE_PRESSED) {// 按下 int number = me.getButton(); if (number == MouseEvent.BUTTON1) { robot.mousePress(InputEvent.BUTTON1_MASK); } else if (number == MouseEvent.BUTTON2) { robot.mousePress(InputEvent.BUTTON2_MASK); } else if (number == MouseEvent.BUTTON3) { robot.mousePress(InputEvent.BUTTON3_MASK); } } else if (id == MouseEvent.MOUSE_CLICKED || id == MouseEvent.MOUSE_RELEASED) {// 移动 int number = me.getButton(); if (number == MouseEvent.BUTTON1) { robot.mousePress(InputEvent.BUTTON1_MASK); } else if (number == MouseEvent.BUTTON2) { robot.mousePress(InputEvent.BUTTON2_MASK); } else if (number == MouseEvent.BUTTON3) { robot.mousePress(InputEvent.BUTTON3_MASK); } } else if (id == MouseEvent.MOUSE_DRAGGED || id == MouseEvent.MOUSE_MOVED) {// 点击 robot.mouseMove(me.getX(), me.getY()); } } else if (ie instanceof KeyEvent) { // 转换为键盘事件 KeyEvent me = (KeyEvent) ie; int id = me.getID(); System.out.println(id); if (id == KeyEvent.KEY_PRESSED) { robot.keyPress(me.getKeyCode()); } else if (id == KeyEvent.KEY_RELEASED) { robot.keyRelease(me.getKeyCode()); } } } catch (Exception e) { e.printStackTrace(); } } /** * 获取屏幕截图并发送 * * @throws IOException */ public void createImage() throws Exception { Toolkit tk = Toolkit.getDefaultToolkit(); // 获取屏幕大小 Dimension dm = tk.getScreenSize(); // 设定区域的大小 Rectangle rt = new Rectangle(0, 0, dm.width, dm.height); // 取得指定大小的一张图片 BufferedImage image = robot.createScreenCapture(rt); // 创建一段内存流 ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 将图片数据写入内存流 ImageIO.write(image, "jpeg", baos); // 创建字节数组 byte[] data = baos.toByteArray(); // 发送图片数据长度 oos.writeInt(data.length); // 写入图片字节数据 oos.write(data); oos.flush(); Thread.sleep(20); }
在编写代码的时候,发现他一个不太可取的地方就是:他是在测试项目中写实现的代码,然后直接复制粘贴到了项目框架上去了,而不想想每一行代码的逻辑结构与模块的组成,代码之间的耦合度与如何解耦。
要是我写的话,我会在框架上重新创建一个方法:里面先写上
//TODO 创建窗体,添加监听器
//TODO 实时接收截图
//TODO 发送鼠标事件
然后就是代码的一个个填充,而不会省事的把测试项目中的代码直接照搬到框架上,再慢慢修改,说实话:看到他复制粘贴那一幕我真是惊呆了...
相关文章推荐
- 专题3--1011
- linux安装tomcat
- android webview中上传控件点击无效的解决办法
- js
- 技术or管理
- Android中使用Thread造成内存泄露的分析和解决
- leetcode_c++:Remove Element (027)
- 浅谈Autolayout-04Masonry
- 两次讲座
- PHP实战之WEB计算器
- 题目要求:一个人从x年开始庆祝生日,直到死去为止,每过一年就把当年的年龄与以前相加得到一个sum值,求开始过生日的年龄,与寿命
- solution Of 1047. Student List for Course (25)
- 167 docker docker构建nginx容器系列问题
- 实验8 SQLite数据库操作
- 【Java】Map杂谈,hashcode()、equals()、HashMap、TreeMap、LinkedHashMap、ConcurrentHashMap
- Javascript运算符进阶指南
- 对JVM GC进一步的实例解析
- IE浏览器在线更新GitHub客户端
- const与define的区别!!!!!
- 软件开发——软技能(一、IDE)