日期:2014-05-20  浏览次数:20702 次

因为这个问题, 今天我和所谓的"技术总监"大吵一场, 来者皆有分
先说结果吧, 下班时候大吵完毕进入僵持状态的时候, 他丢下一句话"下星期这项目从头开始,不要用hibernate,直接用jdbc", 
我也没跟他客气, 直接来了句"好啊"(语气很不屑), 然后打卡下班. (要知道这项目的功能差不多完全实现了, 就因为他调用我的方法觉得别扭)
  先介绍下公司吧, 公司规模很小, 总人数不到20人, 技术部就3人(包括"技术总监", 我(一年多开发经验) , 刚来两月的应届小弟).
最近开发一个订单系统C, 要去商城系统A(这个系统A是我们自己的商城)获取订单保存在订单系统C的数据库(当然还有些更新操作), 还要去某大型网上商城系统B(这个系统B是别人的)上去获取订单保存在订单系统C的数据库. 然后从C拿出订单, 去查询该订单的物流状态.
  项目中用到的技术是(hibernate + spring), "技术总监"负责和A交互, 我负责和B交互, 应届小弟负责查询这些订单的物流状态
分工完毕后, 大家开始做开发(其中经历了从web项目修改为普通java项目的过程, 最近又喊着要做页面(又成web项目了)), 做得还算顺畅吧, 突然"技术总监"要我给他提供一个方法, 将他从A获得的订单保存到C的数据库的方法(我当时就呆掉了, 你自己从A取出来东西保存为什么要找我要方法保存呢, 你自己直接跟C的数据库打交道好了) 我的理解是大家都分工好了, 你写个业务方法(业务r层)专门拿A里面的订单, 然后自己写个保存的方法(dao层)保存到C不就完了, 大家都一样,自己写业务层, 自己写DAO层(不过我直接就把dao层揉到业务层了, 因为用了hibernate, dao层实在没什么可写的). 可他死活就是不同意(说这些方法都一样,他没必要重复体力劳动), 没办法, 我专门在我的业务层(接口)里面添加他需要操作数据库的方法(比如保存订单)给他提供服务. 
  但是我告诉他, 现在暂时为了他编译通过,用的时候先读取spring的配置文件, 得到这个业务对象, 代码如下: 
Java code

                ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
               // 我和B打交道写的业务接口, 为了"总监"使用方便, 在该接口我写了很多他需要的方法
        OrderManager orderManager = (OrderManager)ctx.getBean("orderManager");


当天大家小吵一番, 我直接问他为什么他的模块要我来实现和db的交互, 他最后直接说这是他的需求, 弄成这样虽然难调一些
好在他能编译通过, 最后和平收场.

  最近, 大家功能都实现完毕了, 打算代码整合到一起,(对不起,CVS,SVN统统没有,开发的时候为了编译成功大家相互copy源码), 他写了个专门做任务调度的类, 隔段时间就自动调用 他的跟A交互的业务方法, 我的跟B交互业务方法, 然后应届小弟的代码.  
  由于SessionFactory是重量级的, 大多数项目有一个这玩意即可, 那么执行一次即可 ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
  然后该获取和谁打交道的业务方法就去获取相应的bean, 我的想法读取完spring配置文件后的代码如下:
Java code

                // 我和B的交互
                OrderManager orderManager = (OrderManager)ctx.getBean("orderManager");
        orderManager.service();
        //技术总监的和A交互业务方法
        ShopManager shopManager = (ShopManager)ctx.getBean("shopManager");
        shopManager.service(orderManager); // 为了满足技术总监的需求, 我不得不给他这个orderManager
        // 应届小弟的
        FlowManager flowManager = (FlowManager)ctx.getBean("orderManager");
        flowManager.service();


  问题来了, 他不会hibernate和spring(至于为什么用框架是刚开始在做需求阶段的时候他问我打算怎么办, 我直接说三大框架, 他也没说什么) 所以, 他的shopmanager直接new即可,当然他不用new, 因为他把他里面的业务方法都搞成static的了
于是, 我认为他通过ShopManager.service(orderManager)调用业务即可了.
  这时候他发现, 我和物流小弟的manager都是通过getBean来获取(小弟在我的带领下用框架用的很欢快), 然后才调用业务方法, 他感觉很不爽, 问我为什么不把orderManager里的方法搞成静态的, 这样他就可以直接通过类名.方法名调用我的方法了, 各位兄弟, 我还能说些什么呢, 我无语. 然后他责问 应届小弟, 你查物流后修改订单状态与数据库交互不需要调用 orderManager的方法吗? 应届小弟说" 我自己写的业务方法, 我自己写操纵数据库方法啊"
  总监怒了, "为什么我们三个人不统一呢, orderManager里有专门操纵数据库的方法是可以复用的"
  这时候, 我想起了一个笑话, 大家开车都在靠右走, 他一个人从对面开车过来(他靠左,和我们在同一边), 发现大家都在朝他的相对方向开车, 他大呼, 你们为什么要逆行? 
  现在他的问题是, 他 和 应届小弟, 我 写的业务方法, 都调用同一个专门操纵数据库的类里的方法进行DB的交互
  我以往的经验是谁写的业务方法, 谁再去调用自己写的 和数据库操纵的方法(他认为这样极不合理)
   
  最后导致了他丢下了这样的话, 不要再用hibernate了, 用jdbc, 这和jdbc,hibernate有关系吗? "技术总监"???!!!



------解决方案--------------------
这个帖子我怎么记得前段时间看到过。。。。
------解决方案--------------------
晕死,怎么非要用,用类名.方法名去调用呢,用对象调用不是一样嘛,这叫固执

不过非要用类名.方法名调用也是可以的,但要把hibernate转为jdbc这个就不必了吧,有N多方法可以让他实现这种调用。少见的技术总监。楼主挺悲剧的。
------解决方案--------------------
三个模块都要访问数据库,把数据库访问的代码集中起来避免重复,这个想法并不差哦。不过非要用静态方法调用,非要用jdbc好像站不住脚,除非项目有特殊要求。
------解决方案--------------------