首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 敏捷开发的必要技巧:保持代码简洁
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ccoderlh
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-01-09 16:24:33 楼主
    摘要:单一职责原则(The Single Responsibility Principle)认为:每个类都应该只为一个理由而修改。当一个类包含许多其他的功能时,就违反了单一职责原则。作者通过简单的例子,展示了如何让你的代码更加简洁.

    示例
        这是一个会议管理系统。它用来管理所有参会者的信息。刚开始的时候,我们只需要记录每个参会者的ID(这是会议组织者分配的),姓名,电话和地址就行。于是,我们写了如下的代码:
       


        class Participant {                                                                                  String id;                                                                                        String name;                                                                                      String telNo;                                                                                      String address;                                                                                }            class ConferenceSystem {                                                                              Participant participants[];                                                                    }     
                                                                                         

        接着,新的需求来了:现在每个参会者都可以让组织者帮忙预订酒店,所以我们要记录下他想预订的酒店名,入住日期,离开日期,房间类型(单人房或者双人房)。于是我们又扩充成如下的代码:   


        class Participant {                                                                                  String id;                                                                                        String name;                                                                                      String telNo;                                                                                      String address;                                                                                    boolean bookHotelForHim;                                                                          String hotelName;                                                                                  Date checkInDate;                                                                                  Date checkOutDate;                                                                                boolean isSingleRoom;                                                                              void setHotelBooking(String hotelName, Date checkInDate, ...) {                                        ...                                                                                            }                                                                                              }                                                                                             

        接着,又有一个新的需求来了:参会者可以参加不同的研讨会,所以我们要记录下参会者参加的研讨会。对于他要参加的每一场研讨会,我们还要记录下他的登记时间,同时他还需要什么翻译设备。于是代码又扩充成:
       

    class Participant {                                                                                  String id;      String name;        String telNo;      String address;      boolean bookHotelForHim;      String hotelName;      Date checkInDate;        Date checkOutDate;      boolean isSingleRoom;      String idOfSeminarsRegistered[];      Date seminarRegistrationDates[];      boolean needSIDeviceForEachSeminar[];      void setHotelBooking(String hotelName, Date checkInDate, ...) {          ...      }          void registerForSeminar(String seminarId, Date regDate, boolean needSIDevice) {          //将seminarId加到idOfSeminarsRegistered          //将regDate加到seminarRegistrationDates          //将needSIDevice加到needSIDeviceForEachSeminar.      }          boolean isRegisteredForSeminar(String seminarId) {          ...      }          Date getSeminarRegistrationDate(String seminarId) {          ...      }          boolean needSIDeviceForSeminar(String seminarId) {          ...      }          String [] getAllSeminarsRegistered() {          return idOfSeminarsRegistered;      }        }
         

        代码开始肿胀起来了

        请注意,这已经是我们第二次扩充Participant这个类了。每扩充一次,它就包含了更多的代码(实例变量和方法)及更多的功能。本来它只有4个属性。现在已经是12个了!此外,这个类要处理的业务逻辑也极大的增加了。本来它只需要处理参会者的基本信息(姓名,地址等等),现在它还要包含酒店,酒店预订,研讨会和翻译设备等等的逻辑。如果以后新的需求又来了,我们又要扩充Participant这个类,到时候,这个类要复杂庞大成什么样子!

        所以我们得修整这个类了!

        那怎么修整Participant这个类呢?怎么让它一直保持在第一天那样的简洁度?在回答这两个问题之前,我们先来考虑一下另一个需要优先回答的问题:给你一个类,你怎么认定它需要修整?

    怎么判断一个类需要修整

        要判断一个类是否需要修整,一个比较主观的方法是:当在读一个类的代码时,看看我们会不会觉得这个类“太长了”,“太复杂了”,或者讲的概念“太多了”?如果会这样觉得的话,我们就认定,这个类需要修整。

        另外一个比较简单而且客观的方法是:当发现我们已经在第二次或者第三次扩充这个类的时候,我们认定这个类要修整了。这是一个比较”懒惰,被动”的方法,但却很有效。

        现在让我们看一下怎么修整Participant这个类吧。

        抽取出有关酒店预订的功能

        首先,先来考虑一下怎么抽取出酒店预订的功能。一个可行的方案是:
       

    class Participant {                                                                                  String id;                                                                                        String name;                                                                                      String telNo;                                                                                      String address;                                                                                }              class HotelBooking {                                                                                  String participantId;                                                                              String hotelName;                                                                                  Date checkInDate;                                                                                  Date checkOutDate;                                                                                boolean isSingleRoom;                                                                          }            class HotelBookings {                                                                                HotelBooking hotelBookings[];                                                                      void addBooking(HotelBooking booking) {                                                                ...                                                                                            }                                                                                              }                class ConferenceSystem {                                                                              Participant participants[];                                                                        HotelBookings hotelBookings;                                                                    }
                                                                                               

        现在,Participant这个类就一点都不知道酒店预订的存在。当然,我们不一定要用数组来存放酒店预订情况。比如,我们可以用Map:

    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ccoderlh
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-01-09 16:25:471楼 得分:0
    class Participant {                                                                                  String id;                                                                                        String name;                                                                                      String telNo;                                                                                      String address;                                                                                }                                                                                                  class HotelBooking {      String participantId;      String hotelName;      Date checkInDate;        Date checkOutDate;      boolean isSingleRoom;    }            class HotelBookings {      HashMap mapFromPartIdToHotelBooking;      //必须提供参会者id      void addBooking(String participantId, HotelBooking booking) {          ...      }        }          class ConferenceSystem {      Participant participants[];      HotelBookings hotelBookings;    }
         

        这样的方案优点是Participant一点都不知道HotelBooking的存在,Participant不依赖于HotelBooking。
        还有另一个可行的方案是:


        class Participant {      String id;      String name;        String telNo;      String address;      HotelBooking hotelBooking;    }              class HotelBooking {      String hotelName;      Date checkInDate;        Date checkOutDate;      boolean isSingleRoom;    }            class ConferenceSystem {      Participant participants[];    }   
     

        注意到,在这种方案里面,Participant这个类还是要知道HotelBooking的存在,也就是说,Participant还是要知道有酒店预订这回事。只是具体酒店预订是怎么做的,这些真正的功能是放在HotelBooking这个里面实现的。因为每个Participant都直接引用了本人的酒店预订情况,所以可以直接找到他的酒店预订情况。而代价就是,Pariticipant还是要知道酒店预订的概念。从类的关系来讲,Pariticipant还要依赖HotelBooking这个类。

        当然,除了以上几种情况,还有许多其他的可行方案。

        抽取研讨会的相关功能

        现在我们来考虑一下怎么抽取出研讨会的功能。一个可行的方案:


        class Participant {                                                                                  String id;                                                                                        String name;                                                                                      String telNo;                                                                                      String address;                                                                                }          class SeminarRegistration {                                                                          String participantId;                                                                              String seminarId;                                                                                  Date registrationDate;                                                                            boolean needSIDevice;                                                                          }          class SeminarRegistry {                                                                              SeminarRegistration registrations[];                                                              void registerForSeminar(SeminarRegistration registration) {                                            //将registration加到registrations.                                                          }                                                                                                  boolean isRegisteredForSeminar(String participantId, String seminarId) {                              ...                                                                                            }                                                                                                  Date getSeminarRegistrationDate(String participantId, String seminarId) {                              ...                                                                                            }                                                                                                  boolean needSIDeviceForSeminar(String participantId, String seminarId) {                              ...                                                                                            }                                                                                                  SeminarRegistration[] getAllRegistrations(String participantId) {                                      ...                                                                                            }                                                                                              }          class ConferenceSystem {                                                                              Participant participants[];                                                                        SeminarRegistry seminarRegistry;                                                                }
                                                                                                 

        当然,除了以上的方案以外,还有其他可行的方案,这里就先不讲。

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ccoderlh
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-01-09 16:26:122楼 得分:0
    改进后的代码

        下面就是改进后的代码:


        class Participant {                                                                                  String id;                                                                                        String name;                                                                                      String telNo;                                                                                      String address;                                                                                }          class HotelBooking {        String participantId;                                                                              String hotelName;                                                                                  Date checkInDate;                                                                                  Date checkOutDate;                                                                                boolean isSingleRoom;                                                                          }              class HotelBookings {      HotelBooking hotelBookings[];                        void addBooking(HotelBooking booking) {                  ...                                              }                                                }            class SeminarRegistration {                          String participantId;                                String seminarId;                                    Date registrationDate;                              boolean needSIDevice;                            }              class SeminarRegistry {                                SeminarRegistration registrations[];                void registerForSeminar(SeminarRegistration registration) {          //将registration加到registrations.            }                                                    boolean isRegistered (String participantId, String seminarId) {          ...                                              }                                                    Date getRegistrationDate(String participantId, String seminarId) {          ...                                              }                                                    boolean needSIDevice(String participantId, String seminarId) {          ...                                              }                                                    SeminarRegistration[] getAllRegistrations(String participantId) {          ...                                              }                                                }            class ConferenceSystem {                                Participant participants[];                          HotelBookings hotelBookings;                        SeminarRegistry seminarRegistry;                  }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ccoderlh
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-01-09 16:26:533楼 得分:0
    转自:http://www.sawin.cn/doc/SP/SPExperience/blueski1128.htm
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kelph
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-01-10 08:01:044楼 得分:0
    很典型的例子。
    预订酒店的例子,个人喜欢第一种方案,Participant不依赖于HotelBooking。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • l_wenb
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-01-10 17:26:575楼 得分:0
    顶!!!!!!!!!!!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hchlee
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-01-10 17:39:516楼 得分:0
    大哥,排排版吧,选择代码粘贴效果比较好.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • snophi
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-01-13 15:04:597楼 得分:0
    支持!支持重整一下代码部分,让他读起来更爽快!!!!!!!!!!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • maco_wang
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-01-14 08:30:498楼 得分:0
    看完了,尽管眼晕。呵呵,谢谢楼主!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xiaowei_forsale
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-01-16 14:25:009楼 得分:0
    这么乱的代码  这么敏捷呀
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dobear_0922
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-01-21 18:48:4710楼 得分:0
    支持,
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dobear_0922
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-01-21 18:49:1511楼 得分:0
    代码确实应当再整理下,
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jinlong0
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-01-24 20:38:2312楼 得分:0
    代码真的贴地太乱了,整理一下,要不看完晕过去了.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tim_spac
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-01-26 12:27:2613楼 得分:0
    (内容属于楼主,这里仅作format.)
    摘要:单一职责原则(The Single Responsibility Principle)认为:每个类都应该只为一个理由而修改。当一个类包含许多其他的功能时,就违反了单一职责原则。作者通过简单的例子,展示了如何让你的代码更加简洁.

    示例
    这是一个会议管理系统。它用来管理所有参会者的信息。刚开始的时候,我们只需要记录每个参会者的ID(这是会议组织者分配的),姓名,电话和地址就行。于是,我们写了如下的代码:

    Java code
    class Participant { String id; String name; String telNo; String address; } class ConferenceSystem { Participant participants[]; }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tim_spac
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-01-26 12:28:5414楼 得分:0
      接着,新的需求来了:现在每个参会者都可以让组织者帮忙预订酒店,所以我们要记录下他想预订的酒店名,入住日期,离开日期,房间类型(单人房或者双人房)。于是我们又扩充成如下的代码:
    Java code
    class Participant { String id; String name; String telNo; String address; boolean bookHotelForHim; String hotelName; Date checkInDate; Date checkOutDate; boolean isSingleRoom; void setHotelBooking(String hotelName, Date checkInDate, ...) { ... } }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tim_spac
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-01-26 12:31:0615楼 得分:0
      接着,又有一个新的需求来了:参会者可以参加不同的研讨会,所以我们要记录下参会者参加的研讨会。对于他要参加的每一场研讨会,我们还要记录下他的登记时间,同时他还需要什么翻译设备。于是代码又扩充成:
    Java code
    class Participant { String id; String name; String telNo; String address; boolean bookHotelForHim; String hotelName; Date checkInDate; Date checkOutDate; boolean isSingleRoom; String idOfSeminarsRegistered[]; Date seminarRegistrationDates[]; boolean needSIDeviceForEachSeminar[]; void setHotelBooking(String hotelName, Date checkInDate, ...) { ... } void registerForSeminar(String seminarId, Date regDate, boolean needSIDevice) { //将seminarId加到idOfSeminarsRegistered //将regDate加到seminarRegistrationDates //将needSIDevice加到needSIDeviceForEachSeminar. } boolean isRegisteredForSeminar(String seminarId) { ... } Date getSeminarRegistrationDate(String seminarId) { ... } boolean needSIDeviceForSeminar(String seminarId) { ... } String [] getAllSeminarsRegistered() { return idOfSeminarsRegistered; } }


    代码开始肿胀起来了

    请注意,这已经是我们第二次扩充Participant这个类了。每扩充一次,它就包含了更多的代码(实例变量和方法)及更多的功能。本来它只有4个属性。现在已经是12个了!此外,这个类要处理的业务逻辑也极大的增加了。本来它只需要处理参会者的基本信息(姓名,地址等等),现在它还要包含酒店,酒店预订,研讨会和翻译设备等等的逻辑。如果以后新的需求又来了,我们又要扩充Participant这个类,到时候,这个类要复杂庞大成什么样子!

    所以我们得修整这个类了!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tim_spac
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-01-26 12:32:4916楼 得分:0
      那怎么修整Participant这个类呢?怎么让它一直保持在第一天那样的简洁度?在回答这两个问题之前,我们先来考虑一下另一个需要优先回答的问题:给你一个类,你怎么认定它需要修整?
      怎么判断一个类需要修整
      要判断一个类是否需要修整,一个比较主观的方法是:当在读一个类的代码时,看看我们会不会觉得这个类“太长了”,“太复杂了”,或者讲的概念“太多了”?如果会这样觉得的话,我们就认定,这个类需要修整。
      另外一个比较简单而且客观的方法是:当发现我们已经在第二次或者第三次扩充这个类的时候,我们认定这个类要修整了。这是一个比较”懒惰,被动”的方法,但却很有效。
      现在让我们看一下怎么修整Participant这个类吧。
      抽取出有关酒店预订的功能
      首先,先来考虑一下怎么抽取出酒店预订的功能。一个可行的方案是:
    Java code
    class Participant { String id; String name; String telNo; String address; } class HotelBooking { String participantId; String hotelName; Date checkInDate; Date checkOutDate; boolean isSingleRoom; } class HotelBookings { HotelBooking hotelBookings[]; void addBooking(HotelBooking booking) { ... } } class ConferenceSystem { Participant participants[]; HotelBookings hotelBookings; }

      现在,Participant这个类就一点都不知道酒店预订的存在。当然,我们不一定要用数组来存放酒店预订情况。比如,我们可以用Map:
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tim_spac
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-01-26 12:35:2717楼 得分:0
    Java code
    class Participant { String id; String name; String telNo; String address; } class HotelBooking { String participantId; String hotelName; Date checkInDate; Date checkOutDate; boolean isSingleRoom; } class HotelBookings { HashMap mapFromPartIdToHotelBooking; //必须提供参会者id void addBooking(String participantId, HotelBooking booking) { ... } } class ConferenceSystem { Participant participants[]; HotelBookings hotelBookings; }

      这样的方案优点是Participant一点都不知道HotelBooking的存在,Participant不依赖于HotelBooking。
      还有另一个可行的方案是:
    Java code
    class Participant { String id; String name; String telNo; String address; HotelBooking hotelBooking; } class HotelBooking { String hotelName; Date checkInDate; Date checkOutDate; boolean isSingleRoom; } class ConferenceSystem { Participant participants[]; }

      注意到,在这种方案里面,Participant这个类还是要知道HotelBooking的存在,也就是说,Participant还是要知道有酒店预订这回事。只是具体酒店预订是怎么做的,这些真正的功能是放在HotelBooking这个里面实现的。因为每个Participant都直接引用了本人的酒店预订情况,所以可以直接找到他的酒店预订情况。而代价就是,Pariticipant还是要知道酒店预订的概念。从类的关系来讲,Pariticipant还要依赖HotelBooking这个类。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tim_spac
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-01-26 12:37:1618楼 得分:0
      抽取研讨会的相关功能
      现在我们来考虑一下怎么抽取出研讨会的功能。一个可行的方案:
    Java code
    class Participant { String id; String name; String telNo; String address; } class SeminarRegistration { String participantId; String seminarId; Date registrationDate; boolean needSIDevice; } class SeminarRegistry { SeminarRegistration registrations[]; void registerForSeminar(SeminarRegistration registration) { //将registration加到registrations. } boolean isRegisteredForSeminar(String participantId, String seminarId) { ... } Date getSeminarRegistrationDate(String participantId, String seminarId) { ... } boolean needSIDeviceForSeminar(String participantId, String seminarId) { ... } SeminarRegistration[] getAllRegistrations(String participantId) { ... } } class ConferenceSystem { Participant participants[]; SeminarRegistry seminarRegistry; }

      当然,除了以上的方案以外,还有其他可行的方案,这里就先不讲。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tim_spac
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-01-26 12:39:0619楼 得分:0
    下面就是改进后的代码:
    Java code
    class Participant { String id; String name; String telNo; String address; } class HotelBooking { String participantId; String hotelName; Date checkInDate; Date checkOutDate; boolean isSingleRoom; } class HotelBookings { HotelBooking hotelBookings[]; void addBooking(HotelBooking booking) { ... } } class SeminarRegistration { String participantId; String seminarId; Date registrationDate; boolean needSIDevice; } class SeminarRegistry { SeminarRegistration registrations[]; void registerForSeminar(SeminarRegistration registration) { //将registration加到registrations. } boolean isRegistered (String participantId, String seminarId) { ... } Date getRegistrationDate(String participantId, String seminarId) { ... } boolean needSIDevice(String participantId, String seminarId) { ... } SeminarRegistration[] getAllRegistrations(String participantId) { ... } } class ConferenceSystem { Participant participants[]; HotelBookings hotelBookings; SeminarRegistry seminarRegistry; }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • guenli
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-01-26 22:33:4020楼 得分:0
    谢谢tim_spac的热情改进,看了真舒服啊!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • shakoe
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-01-28 13:10:4321楼 得分:0
    恩,有点味道了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dobear_0922
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-01-31 13:15:1122楼 得分:0
    看看,学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • l_wMING
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-01-31 18:20:4623楼 得分:0
    studing...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xinheixia
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-02 09:04:4424楼 得分:0
    勉強します
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • liyu_2004
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-02 09:19:3025楼 得分:0
    顶顶顶顶!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ZuoBaoquan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-13 21:10:3026楼 得分:0
    呵呵,楼主只会Ctrl-C和Ctrl-V吗??
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yayx
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-17 14:38:2827楼 得分:0
    网上有一份PDF的 这本书不错~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dollyn
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-18 17:23:2328楼 得分:0
    luanqibz
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • woainictok
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-19 10:00:0229楼 得分:0
    15楼还行
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • foreveryday007
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-02-19 15:50:4830楼 得分:0
    有得有失。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • falconshh
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-25 16:26:1631楼 得分:0
    learning....
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kabunhi
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-16 17:40:2132楼 得分:0
    这个帖子很好,在日常开发过程中,常常看到代码很长,功能很多,很难看个明白,修改起来也很麻烦。个人觉得容易看懂得代码才是好样的。不支持专写一些让人看不明白的代码。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • steedhorse
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      3

      4

    发表于:2008-04-16 19:39:2033楼 得分:0
    学习一下。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jikun6666
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-16 21:43:4134楼 得分:0
    路过学习了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • AwL_1124
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-18 12:56:1235楼 得分:0
    up
    ````````····
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhutoo007
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-06-29 13:54:2036楼 得分:0
    初来乍到...
    学习下
    好东西
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • MOTA
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-01 09:45:4037楼 得分:0
    代码帖的很乱
    有辱敏捷开发之名~~!

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fjm263
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-06 14:32:3038楼 得分:0
    支持,做就该做专业的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • songpengasp
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-07-09 09:49:2239楼 得分:0
    哦哦
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • javalover23
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-31 08:20:2940楼 得分:0
    该回复于2008-08-31 08:59:31被版主删除
    修改 删除 举报 引用 回复