




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
BestpracticeofcodereviewusingGit/Gerrit
AgendaCodeReview案例学习如何推广、实施CodeReview如何提高review质量2CaseStudy–Cisco/CollaboratorCodeReviewCaseStudy:CiscoSystems提高代码review效率和积极性团队5人,10月,2500review,3200KLOC线下review协作,方便交流与bug系统集成(我们是fisheye+jira)直观、易用、高效3BeforeCodeReview4AfterCodeReview5AgendaCodeReview案例学习如何推广、实施CodeReview如何提高CodeReview质量6大家都想要的7减少RCA、Bug提高代码质量提高开发水平团队凝聚力营造工程师文化。。。以前的codereview为何执行不下去?工具不专业:XX项目请review,哪行改了不知道,自己去找绩效难定义:缺少数据分析和KPI,没法监控,领导不好抓各种形式的Codereview,没工具,没闭环。Review了,但代码没改SMARTGoalSMARTCodereviewSystemSpecific需要专业的工具。Relevant不影响开发效率的流程.Achievable容易操作,容易分享、容易整体提高效率Measureable可度量,可评测的KPI(提交85%,完成95%)Timebase一定时间范围内的考核机制8首先转变和培养大部分Dev对代码质量的意思和重视度以我们的经验,工具/流程/KPI最重要9What&WhyWho主管、经理–发现问题,最终负责人不同的角色,review的目的可以不同资深开发人员–发现问题资深领域专家–发现问题新人
-学习、融入架构师
-确保设计被正确实现;检验设计是否有偏差When开发阶段,毫无疑问
mit改变的是review子流程,影响review的及时性和覆盖率,从而影响质量和效率,需要区别对待来推广WhereWeb,IDE看代码面对面讨论代码How单人review–简单case多人review–复杂caseReviewmeeting–核心代码酒店codereview经验分享10阶段成果:2月试点与优化,5月开始酒店全面执行已完成600万行,产生4000条comments测试反馈:测试bug少了,代码质量有提高AchievementAgendaCodeReview案例学习如何推广、实施CodeReview如何提高CodeReview质量11如何提高review质量如何提高review质量Code质量Comments质量自动化预审核12代码质量指标正确性可编译可读性可维护性可复用性13可读性
publicSearchHotelDataResponseProcessData(SearchHotelDataResponsesearchHotelResponse,SearchHotelDataRequestsearchHotelRequest,objectstatus=null)
{
Stopwatchsw=null;
try
{
#regionlogic
if(ConfigurationTypeConst.EnableRoomTicketGiftsProcess())
{
sw=Stopwatch.StartNew();
stringsearchtype=searchHotelRequest.SearchTypeEntity.SearchType.ToString();
varRoomTicketGiftsDic=RoomTicketGiftsDataBusiness.Instance.GetAllDataFromNativeCache();
searchHotelResponse.HotelDataList.ForEach(hotelDataList=>
{
intcity=hotelDataList.HotelStaticInfoEntity.HotelBaseInfoEntity.City;
intstar=hotelDataList.HotelStaticInfoEntity.HotelBaseInfoEntity.Star;
Dictionary<int,List<int>>cityTicketIDDict=null;
Dictionary<int,List<int>>starTicketIDDict=null;
Dictionary<int,List<int>>typeTicketIDDict=null;
List<RoomTicketGifts>roomTicketGifts=null;……………….14publicSearchHotelDataResponseProcessData(SearchHotelDataResponsesearchHotelResponse,SearchHotelDataRequestsearchHotelRequest,objectstatus=null)
{
Stopwatchsw=null;
try
{
#regionlogic
if(ConfigurationTypeConst.EnableRoomTicketGiftsProcess())
{
sw=Stopwatch.StartNew();
stringsearchtype=searchHotelRequest.SearchTypeEntity.SearchType.ToString();
varRoomTicketGiftsDic=RoomTicketGiftsDataBusiness.Instance.GetAllDataFromNativeCache();
searchHotelResponse.HotelDataList.ForEach(hotelDataList=>
{
intcity=hotelDataList.HotelStaticInfoEntity.HotelBaseInfoEntity.City;
intstar=hotelDataList.HotelStaticInfoEntity.HotelBaseInfoEntity.Star;
Dictionary<int,List<int>>cityTicketIDDict=null;
Dictionary<int,List<int>>starTicketIDDict=null;
Dictionary<int,List<int>>typeTicketIDDict=null;
List<RoomTicketGifts>roomTicketGifts=null;
List<int>ticketIDsOfCity=null;
List<int>ticketIDsOfStar=null;
//缓存中获取:送券规则字典
Dictionary<int,RoomTicketGiftRule>ticketRuleComponent=RoomTicketGiftRuleBusiness.Instance.GetAllDataFromNativeCache();
//这个字典中如果有值的话,只可能有个Key=0,Value=Component。所以这里只取key=0的
if(ticketRuleComponent.Count==1&&ticketRuleComponent.ContainsKey(0))
{
cityTicketIDDict=ticketRuleComponent[0].CityTicketIDDict;
starTicketIDDict=ticketRuleComponent[0].StarTicketIDDict;
typeTicketIDDict=ticketRuleComponent[0].TypeTicketIDDict;
roomTicketGifts=ticketRuleComponent[0].RoomTicketGifts;
if(cityTicketIDDict!=null&&cityTicketIDDict.ContainsKey(city))
{
ticketIDsOfCity=cityTicketIDDict[city];
}
if(starTicketIDDict!=null&&starTicketIDDict.ContainsKey(star))
{
ticketIDsOfStar=starTicketIDDict[star];
}
}
List<RoomTicketGifts>roomTicketGifts_temp=null;
if(RoomTicketGiftsDic!=null&&RoomTicketGiftsDic.Count>0)
{
hotelDataList.BaseRoomEntity.ForEach(delegate(BaseRoomEntitybaseRoomentity_temp)
{
baseRoomentity_temp.RoomDataEntity.ForEach(delegate(RoomDataEntityroomListEntity_temp)
{
//是否是返现房型
boolIsHandBackCashRoomType=false;//返现房型(送券,送游票,券返,直返)3
boolIsPrePayDiscountRoomType=roomListEntity_temp.RoomStatusEntity.PriceType==PriceType.PrePayDiscount;//预付立减房型
4
boolIsPP=roomListEntity_temp.RoomStatusEntity.PayType==PayType.PP;//预付房型2
boolIsFG=roomListEntity_temp.RoomStatusEntity.PayType==PayType.FG;//现付房型1
List<int>excludeTicketIDsOfType=newList<int>();
#region得到要排除的ticketID
if(typeTicketIDDict!=null&&roomTicketGifts!=null)
{
foreach(RoomTicketGiftsgiftinroomTicketGifts)
{
boolcheckinAfterEnd=DateTime.Now.Date>gift.EndDate;
boolcheckoutBeforeStart=DateTime.Now.Date<gift.StartDate;
boolweekdayMatch=CheckWeek(searchHotelRequest,gift.WeekDayIndex);
//boolpaymentTypeMatch=string.IsNullOrEmpty(gift.PaymentType)?false:gift.PaymentType.Equals(roomListEntity_temp.RoomStatusEntity.PayType.ToString());
//如果已过期,或者星期不匹配,或者支付方式不匹配
if(checkinAfterEnd||checkoutBeforeStart||!weekdayMatch)//||!paymentTypeMatch
{
excludeTicketIDsOfType.Add(gift.RoomTicketGiftsID);
continue;
}
if(IsPrePayDiscountRoomType&&typeTicketIDDict.ContainsKey(4))
{
if(typeTicketIDDict[4].Contains(gift.RoomTicketGiftsID))
{
excludeTicketIDsOfType.Add(gift.RoomTicketGiftsID);
continue;
}
}
if(IsPP&&typeTicketIDDict.ContainsKey(2))
{
if(typeTicketIDDict[2].Contains(gift.RoomTicketGiftsID))
{
excludeTicketIDsOfType.Add(gift.RoomTicketGiftsID);
continue;
}
}
if(IsFG&&typeTicketIDDict.ContainsKey(1))
{
if(typeTicketIDDict[1].Contains(gift.RoomTicketGiftsID))
{
excludeTicketIDsOfType.Add(gift.RoomTicketGiftsID);
continue;
}
}
}
}
#endregion
//只有取到了gift信息才进去处理
if(RoomTicketGiftsDic.TryGetValue(roomListEntity_temp.RoomStatusEntity.Room,outroomTicketGifts_temp))
{
List<RoomTicketGifts>roomTicketGifts_temps=newList<RoomTicketGifts>();
//判断筛选信息是否符合条件活动循环
roomTicketGifts_temp.ForEach(delegate(RoomTicketGiftsroomTicketGifts_temp1)
{
List<RoomTicketGiftsDetail>roomTicketGiftsDetailsList=newList<RoomTicketGiftsDetail>();
//明细循环
roomTicketGifts_temp1.RoomTicketGiftsDetail.ForEach(delegate(RoomTicketGiftsDetailroomTicketGiftsDetail_temp1)
{
if(!CheckWeek(searchHotelRequest,roomTicketGiftsDetail_temp1.WeekDayIndex)&&string.Compare(roomTicketGiftsDetail_temp1.TicketType,"Y",StringComparison.OrdinalIgnoreCase)==0)//星期不适用时不返回
{
return;
}
//日期判断
if(roomTicketGiftsDetail_temp1.Arrival<searchHotelRequest.PublicSearchParameter.CheckOutDate&&roomTicketGiftsDetail_temp1.Departure>=searchHotelRequest.PublicSearchParameter.CheckInDate&&DateTime.Now.Date>=roomTicketGiftsDetail_temp1.StartDate&&DateTime.Now.Date<=roomTicketGiftsDetail_temp1.EndDate)
{
if(searchHotelRequest.SearchTypeEntity.SearchType==SearchType.PkgResSearch)//度假送券不判支付类型
{
if(string.Equals(roomTicketGiftsDetail_temp1.PaymentType,"FP",StringComparison.OrdinalIgnoreCase)
||(roomListEntity_temp.RoomStatusEntity.IsFGToPP&&string.Equals(roomTicketGiftsDetail_temp1.PaymentType,"FG",StringComparison.OrdinalIgnoreCase))
||string.Equals(roomTicketGiftsDetail_temp1.PaymentType,roomListEntity_temp.RoomStatusEntity.PayType.ToString(),StringComparison.OrdinalIgnoreCase))
{
RoomTicketGiftsDetailroomTicketGiftsDetail_tempCopy=roomTicketGiftsDetail_temp1.Clone()asRoomTicketGiftsDetail;
roomTicketGiftsDetail_tempCopy.CalculateAmount=GetRoomTicketgiftsCalculateAmount(roomTicketGiftsDetail_tempCopy,roomListEntity_temp,searchHotelRequest.SearchTypeEntity.IntlCity,searchHotelRequest.PublicSearchParameter.IgnoreExchange);
AddTicketGiftsDetailWithWirelessChecking(roomTicketGiftsDetailsList,roomTicketGiftsDetail_tempCopy,searchHotelRequest);
//如果是false,说明房型目前还没有返现,需要判断。如果是true,说明房型已有返现,不需要再判断了
if(!IsHandBackCashRoomType)
{
//Y是平台券,非平台券既是返现券
IsHandBackCashRoomType=roomTicketGiftsDetail_tempCopy.TicketType!="Y";
}
}
}
else
{
if(searchHotelRequest.PublicSearchParameter.IsRequestTravelMoney
&&(searchHotelRequest.SearchTypeEntity.SearchType==SearchType.OnLineSearch)
&&string.Compare(roomTicketGiftsDetail_temp1.TicketType,"Y",StringComparison.OrdinalIgnoreCase)==0
&&roomListEntity_temp.RoomStatusEntity.PayType==PayType.FG
&&(roomTicketGiftsDetail_temp1.PaymentType=="FP"||roomTicketGiftsDetail_temp1.PaymentType=="PP")
)
{
RoomTicketGiftsDetailroomTicketGiftsDetail_tempCopy=roomTicketGiftsDetail_temp1.Clone()asRoomTicketGiftsDetail;
roomTicketGiftsDetail_tempCopy.CalculateAmount=GetRoomTicketgiftsCalculateAmount(roomTicketGiftsDetail_tempCopy,roomListEntity_temp,searchHotelRequest.SearchTypeEntity.IntlCity,searchHotelRequest.PublicSearchParameter.IgnoreExchange);
AddTicketGiftsDetailWithWirelessChecking(roomTicketGiftsDetailsList,roomTicketGiftsDetail_tempCopy,searchHotelRequest);
//如果是false,说明房型目前还没有返现,需要判断。如果是true,说明房型已有返现,不需要再判断了
if(!IsHandBackCashRoomType)
{
//Y是平台券,非平台券既是返现券
IsHandBackCashRoomType=roomTicketGiftsDetail_tempCopy.TicketType!="Y";
}
}
elseif(roomTicketGiftsDetail_temp1.PaymentType=="FP"||string.Compare(roomTicketGiftsDetail_temp1.PaymentType.Trim(),roomListEntity_temp.RoomStatusEntity.PayType.ToString(),StringComparison.OrdinalIgnoreCase)==0)
{
RoomTicketGiftsDetailroomTicketGiftsDetail_tempCopy=roomTicketGiftsDetail_temp1.Clone()asRoomTicketGiftsDetail;
roomTicketGiftsDetail_tempCopy.CalculateAmount=GetRoomTicketgiftsCalculateAmount(roomTicketGiftsDetail_tempCopy,roomListEntity_temp,searchHotelRequest.SearchTypeEntity.IntlCity,searchHotelRequest.PublicSearchParameter.IgnoreExchange);
AddTicketGiftsDetailWithWirelessChecking(roomTicketGiftsDetailsList,roomTicketGiftsDetail_tempCopy,searchHotelRequest);
//如果是false,说明房型目前还没有返现,需要判断。如果是true,说明房型已有返现,不需要再判断了
if(!IsHandBackCashRoomType)
{
//Y是平台券,非平台券既是返现券
IsHandBackCashRoomType=roomTicketGiftsDetail_tempCopy.TicketType!="Y";
}
}
}
}
});
if(roomTicketGiftsDetailsList.Count>0)
{
RoomTicketGiftsroomTicketgifts=newRoomTicketGifts();
roomTicketgifts.PlatformPromotionID=roomTicketGifts_temp1.PlatformPromotionID;
roomTicketgifts.RoomTicketGiftsID=roomTicketGifts_temp1.RoomTicketGiftsID;
roomTicketgifts.RoomTicketGiftsName=roomTicketGifts_temp1.RoomTicketGiftsName;
roomTicketgifts.TicketGiftsChannels=roomTicketGifts_temp1.TicketGiftsChannels;
roomTicketgifts.RoomTicketGiftsRealID=roomTicketGifts_temp1.RoomTicketGiftsRealID;
roomTicketgifts.RoomTicketGiftsDetail=roomTicketGiftsDetailsList;
roomTicketGifts_temps.Add(roomTicketgifts);
}
});
#region追加新的送券rule1.2到房型
if(ConfigurationTypeConst.TicketGiftRuleSearchType().Contains(searchtype)&&roomTicketGifts!=null)
{
//先循环一遍,添加排除项
foreach(RoomTicketGiftsgiftinroomTicketGifts)
{
if(IsHandBackCashRoomType&&typeTicketIDDict.ContainsKey(3))
{
if(typeTicketIDDict[3].Contains(gift.RoomTicketGiftsID))
{
excludeTicketIDsOfType.Add(gift.RoomTicketGiftsID);
continue;
}
}
}
//验证规则是否完全匹配,匹配的话添加
foreach(RoomTicketGiftsgiftinroomTicketGifts)
{
if(ticketIDsOfCity!=null&&ticketIDsOfStar!=null)
{
boolcityMatch=ticketIDsOfCity.Contains(gift.RoomTicketGiftsID);
boolstarMatch=ticketIDsOfStar.Contains(gift.RoomTicketGiftsID);
booltypeMatch=!excludeTicketIDsOfType.Contains(gift.RoomTicketGiftsID);
if(cityMatch&&starMatch&&typeMatch)
{
if(roomTicketGifts_temps.Find(e=>e.RoomTicketGiftsID==gift.RoomTicketGiftsID)==null)
{
roomTicketGifts_temps.Add(gift);
}
}
}
}
}
#endregion
//送券信息赋值
roomListEntity_temp.RoomStaticInfoEntity.RoomTicketGifts=roomTicketGifts_temps;
}
else
//如果这个房型原来还没有关联任何ticket
{
if(ConfigurationTypeConst.TicketGiftRuleSearchType().Contains(searchtype)&&roomTicketGifts!=null)
{
List<RoomTicketGifts>roomTicketGifts_temps=newList<RoomTicketGifts>();
if(roomTicketGifts!=null)
{
foreach(RoomTicketGiftsgiftinroomTicketGifts)
{
if(ticketIDsOfCity!=null&&ticketIDsOfStar!=null)
{
boolcityMatch=ticketIDsOfCity.Contains(gift.RoomTicketGiftsID);
boolstarMatch=ticketIDsOfStar.Contains(gift.RoomTicketGiftsID);
booltypeMatch=!excludeTicketIDsOfType.Contains(gift.RoomTicketGiftsID);
if(cityMatch&&starMatch&&typeMatch)
{
if(roomTicketGifts_temps.Find(e=>e.RoomTicketGiftsID==gift.RoomTicketGiftsID)==null)
{
roomTicketGifts_temps.Add((RoomTicketGifts)gift.Clone());
}
}
}
}
}
roomListEntity_temp.RoomStaticInfoEntity.RoomTicketGifts=roomTicketGifts_temps;
}
}
});
});
}
});
}
#endregion
}
catch(Exceptionex)
{
HelpBusiness.Logger.Error("RoomTicketGiftsProcess",
"RoomTicketGiftsProcess"+"\n"+
ex.Message+"\n"+ex.StackTrace+"\n"
+(searchHotelRequest.StatusisShareStatus?(searchHotelRequest.StatusasShareStatus).RawRequest:"nullrawrequest"),
addinfo);
searchHotelResponse=newSearchHotelDataResponse();
}
finally
{
if(sw!=null)
{
sw.Stop();
PerformanceDataRecorderUtility.AddOrUpdate("RoomTicketGiftsProcess",sw.ElapsedMilliseconds);
}
}
searchHotelResponse.DebugEntity.RoomTicketGiftsProcessTime=Math.Round(sw.Elapsed.TotalSeconds,6);
returnsearchHotelResponse;
}可读性15
}
#endregion
}
catch(Exceptionex)
{
HelpBusiness.Logger.Error("RoomTicketGiftsProcess",
"RoomTicketGiftsProcess"+"\n"+
ex.Message+"\n"+ex.StackTrace+"\n"
+(searchHotelRequest.StatusisShareStatus?(searchHotelRequest.StatusasShareStatus).RawRequest:"nullrawrequest"),
addinfo);
searchHotelResponse=newSearchHotelDataResponse();
}
finally
{
if(sw!=null)
{
sw.Stop();
PerformanceDataRecorderUtility.AddOrUpdate("RoomTicketGiftsProcess",sw.ElapsedMilliseconds);
}
}
searchHotelResponse.DebugEntity.RoomTicketGiftsProcessTime=Math.Round(sw.Elapsed.TotalSeconds,6);
returnsearchHotelResponse;
}可读性差而没有发现问题可读性
publicSearchHotelDataResponseProces
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 厂房楼顶维修合同范例
- 劳动纠纷合同范例
- 协议转让物业合同范例
- 养殖饵料合同范例
- 出租小居改造合同范例
- 关于保险赔偿合同范例
- 农村小产权租房合同范例
- 共享农场认领合同范例
- 三角梅购销合同范例
- 北京建房施工合同范例
- 2023精麻药品培训知识试题库及答案(通用版)
- 居民死亡医学证明书英文翻译模板
- 劳 务 中 标 通 知 书
- 建房界址四邻无争议确认表
- 化工安全工程:第四章 泄漏源及扩散模式
- 流变性以及其调整
- 完整版安全生产培训内容
- 医院关于待岗、停岗的规定
- [四川]”寻仙踪、走诗路“诗歌度假小镇规划概念方案
- 10大气复合污染条件下新粒子生成与二次气溶胶增长机制
- 2022危险化学品企业重点人员安全资质达标导则-应急危化二〔2021〕1号
评论
0/150
提交评论