`
piao_bo_yi
  • 浏览: 4521 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论
阅读更多
系统背景:1.c++100~150万行源代码。CS体系结构。CAE,CAM类型的桌面程序。
               2.历时4年×20人开发周期。
               3.产品开发,距发布还有1年。

重构背景:
当我负责重构整个系统的几何算法库的时候,发现我们系统里有一个用来表示几何二维点Point2d的类,用来表示Point2d几何相关的逻辑。单纯几何逻辑不应该包括下面代码的name, attributes,2D几何点不应该包括z.
class Point2d
{
public double x;
public double y;
public double z;
public String name;
public Map<String, String> attributes;
}

随着时间的推移,越多的属性被添加进去,很明显点这个类承担了过多的职责。这个类被大量使用。在不同语境下有不同的物理含义,比如"标注点", 三维点,等等。
重构过程我认为是异常复杂的。
方案一:
将Point2d换个名字,用来表示混乱逻辑的2D点。新建一个纯几何意义的2D点。新的代码尽量使用新的数据结构。这样做的好处是隔离了系统继续耦合的趋势。但是,这种做法多了,会对系统的可理解性造成致命伤害。想象一下,你想用一个几何点的时候,你有多个选择是多么恐怖的场景。实际上,我们系统已经有了不同的三套几何算法库了,相当混乱。
方案二:
其实我是没有其他方案了,也许你会说分别修改所有引用点,根据使用,建立新的点类,最终去掉原有Point2d类多余的属性和职责。但是系统是巨大的(100~150万行),引用的地方怎样使用我单独去看,是看不明白的。另外,没有单元测试可以保证我的修改是正确的。先写所有单元测试也不是现实的,当然,我不太期望我重构时系统不会引入我误操作的Bug。

我想这个问题的解决方案应该不仅是技术上的,还应该从时间安排,重构的过程控制,团队的分工来思考。各位大虾,来点头脑风暴,发表自己的高见吧。

P.S.
1.上面代码为伪代码,实际系统是c++组成的。
2.将把您的建议实施,并反馈重构过程和结果。
重构进度
1.2011-01-11
过程:对name, attributes, z添加get,set函数。用时4个小时。
问题:由于系统重构中,原有功能有些不能用,所以部分人没有更新代码,他们新添加的代码有可能出错。
2.2011-01-12
过程:今天大家都提到了提取出纯几何意义的父类。其实这个想法和我的方案一应该是一个意思。弊端上面也描述了。
今天我打算先去掉一两个和三维点有关的函数,将其引用处改为三维点。

附上我们几何库的2D核心类图。
  • 大小: 45.8 KB
分享到:
评论
13 楼 piao_bo_yi 2011-01-11  
truekbcl 写道
piao_bo_yi 写道
truekbcl 写道
这样的代码重构,template是不二的选择。

这个貌似和template没什么关系吧...

我的意思:采用template比oo的弹性大得多,你如果重构,可以考虑用template来做。


弹性大归大,但是修改量是相当恐怖的。其实我的向量类Vector<Real>是用模板做的,但后来发现其实没有必要。
1.我不需要提供不同的精度。double即满足我们的精度需求。
2.我不需要提供不同的坐标系。我们都是以直角坐标系建模,极坐标系等不用考虑。
12 楼 gigix 2011-01-11  
thinkx 写道
把point2d换个名字不是太复杂的事情,因为编译器会替你检测所有的错误,你只要保证换名称后能编译通过即可;麻烦的是这20个人都得负责改这个名称。

Command+Shift+R, problem solved
要学科学用科学
11 楼 thinkx 2011-01-11  
把point2d换个名字不是太复杂的事情,因为编译器会替你检测所有的错误,你只要保证换名称后能编译通过即可;麻烦的是这20个人都得负责改这个名称。
10 楼 truekbcl 2011-01-11  
piao_bo_yi 写道
truekbcl 写道
这样的代码重构,template是不二的选择。

这个貌似和template没什么关系吧...

我的意思:采用template比oo的弹性大得多,你如果重构,可以考虑用template来做。
9 楼 piao_bo_yi 2011-01-11  
truekbcl 写道
这样的代码重构,template是不二的选择。

这个貌似和template没什么关系吧...
8 楼 truekbcl 2011-01-11  
这样的代码重构,template是不二的选择。
7 楼 piao_bo_yi 2011-01-11  
抛出异常的爱 写道
如果你需要一个可以看的懂的类......
可以先构建多个父类
把非一个逻辑的东西移到父类
之后用一个空的基类来实现此bean


我这次重构主要是想将其中的几何逻辑和物理逻辑(名字等)分开。
6 楼 抛出异常的爱 2011-01-11  
如果你需要一个可以看的懂的类......
可以先构建多个父类
把非一个逻辑的东西移到父类
之后用一个空的基类来实现此bean
5 楼 苍山洱海 2011-01-11  
piao_bo_yi 写道
苍山洱海 写道
前提说的太少,没听明白整个环境,需求,以及出现了什么问题需要重构。。

职责太多,导致函数写起来很麻烦,而且也不易理解。


一轮一轮的重构是必须要做的,不然后期的代码没人愿意去看的。
4 楼 piao_bo_yi 2011-01-10  
jyslb 写道
既然是项目,请问你们项目计划里面有这样重构的时间表么?这样的一个重构可能需要QA一轮full regression testing,你们QA的测试计划里面包含了这样一个测试计划么?既然是项目,又不是产品开发,按照你的项目计划来,你的目标就只有项目目标。

我们虽然有测试部,但他们都是做黑盒测试的,别人是指望不上的。
3 楼 jyslb 2011-01-10  
既然是项目,请问你们项目计划里面有这样重构的时间表么?这样的一个重构可能需要QA一轮full regression testing,你们QA的测试计划里面包含了这样一个测试计划么?既然是项目,又不是产品开发,按照你的项目计划来,你的目标就只有项目目标。
2 楼 piao_bo_yi 2011-01-09  
苍山洱海 写道
前提说的太少,没听明白整个环境,需求,以及出现了什么问题需要重构。。

职责太多,导致函数写起来很麻烦,而且也不易理解。
1 楼 苍山洱海 2011-01-08  
前提说的太少,没听明白整个环境,需求,以及出现了什么问题需要重构。。

相关推荐

    大型应用系统架构.pdf

    《大型应用系统架构》不仅为读者提供了坚实的理论基础,更重要的是教会了如何将这些理论应用于实践中,解决真实世界中的挑战。无论是对于刚接触这一领域的新人,还是已经有一定经验的专业人士来说,都是一本不可多得...

    大型网吧网络系统设计方案

    ### 大型网吧网络系统设计方案解析 #### 一、引言 随着互联网技术的迅猛发展,大型网吧作为集娱乐、休闲...随着技术的不断进步,未来的大型网吧网络系统设计还将面临更多挑战与机遇,持续优化与创新将是不变的主题。

    大型购物系统 大型购物系统

    在构建一个大型购物系统时,我们面临的是一个复杂的IT挑战,需要综合运用多种技术和策略来确保系统的高效、稳定和安全。以下是对这个大型购物系统的一些关键知识点的详细说明: 1. **架构设计**:大型购物系统通常...

    大型应用系统设计 系统安全设计 微博平台防御体系介绍 共25页.pdf

    在大型应用系统设计中,尤其是针对像微博这样的高并发、高可靠性、高性能的平台,系统安全设计至关重要。本文档主要围绕以下几个方面展开讨论: 首先,微博平台所面临的挑战包括高并发流量、对高可靠性和高性能的...

    大型系统架构简介

    大型系统的架构通常需要考虑到海量的网络访问和海量数据存储这两个要素。海量的网络访问意味着系统需要能够处理上亿次的页面浏览量(Page Views,简称PV)。而海量数据存储则要求系统能够保存和高效检索大量的数据,...

    大型火电机组系统仿真与建模

    #### 知识点五:火电机组系统仿真的挑战与未来趋势 1. **高保真度建模**:如何构建更加精细的模型以反映真实系统的复杂行为是当前研究的重点之一。 2. **实时仿真**:为了更好地支持现场操作和培训需求,提高仿真的...

    大型网站系统架构分析

    针对上述挑战,大型网站往往采用多层次的系统架构,涵盖操作系统、Web服务器、数据库、服务器集群、负载均衡、缓存等多个层面。以淘宝网为例,其底层采用Linux操作系统搭配Apache Web服务器,确保良好的性能、稳定性...

    大型网站系统 与 JAVA 中间件实践 曾宪杰

    这本书详细介绍了如何利用Java技术栈解决在开发和运维大型网站过程中遇到的各种挑战,旨在帮助读者理解并掌握Java中间件的核心原理与实践技巧。 在大型网站系统的构建中,Java中间件起着至关重要的作用。它们为高...

    C++大型仓库管理系统应用

    《C++大型仓库管理系统应用详解》 在信息技术日益发达的今天,仓库管理系统的应用已经渗透到各行各业,有效地提升了物流效率,降低了库存成本。本篇将深入探讨如何利用C++编程语言构建一个大型仓库管理系统,并结合...

    hadoop大型电商分布式系统实践视频-1

    大型电商平台通常面临以下挑战: - **海量数据处理**:每天产生的交易记录、用户行为数据等数量庞大。 - **高并发访问**:特别是在促销活动期间,需要应对瞬间激增的用户流量。 - **实时性要求**:例如库存管理、...

    大型网站系统与Java中间件实践读书笔记(二)

    【大型网站系统与Java中间件实践读书笔记(二)】 大型网站系统是指处理海量数据、应对高并发访问、以及应对复杂业务逻辑的网络...通过合理选择和设计中间件,可以有效解决大型网站面临的挑战,实现稳定、高效的运行。

    大型互联网广告应用系统架构

    对于大型互联网广告应用系统而言,如何处理海量的数据、实现高性能的服务以及构建稳定的系统架构成为了关键挑战。本文将详细介绍一个典型的大型互联网广告应用系统的架构设计,涵盖高并发应用系统、海量数据存储系统...

    大型水电站电力监控系统网络安全态势感知系统应用与研究.pdf

    大型水电站作为关键基础设施,其电力监控系统的网络安全面临着前所未有的挑战。在这样的背景下,网络安全态势感知系统成为提升大型水电站网络安全防护能力的新选择。 网络安全态势感知系统,顾名思义,是一种具备...

    大型并发系统整理版

    在大型系统中,有效的缓存策略可以显著提高系统的响应速度和整体性能。 ##### 1. Memcached与APC - **Memcached**:这是一种分布式内存对象缓存系统,用于减轻数据库负担,加速动态Web应用程序的响应时间。Facebook...

    大型分布式电商系统架构是如何从0开始演进的?

    大型分布式电商系统架构的构建和演进是一个复杂且系统性的过程,它涉及到多个技术领域和设计原则。在从0开始构建这样一个系统时,我们需要考虑的关键点包括:高可用性(High Availability)、可扩展性(Scalability...

    移动互联网时代下大型支付系统建设方案设计与研究.pdf

    首先,文章提出了大型支付系统设计中的核心挑战,包括如何在互联网环境中确保支付的安全性和稳定性。支付系统不仅要适应快速变化的市场和技术环境,还要有效地应对各种安全威胁,比如钓鱼网站、数据泄露以及恶意营销...

    2020-论大型信息系统项目的整体管理-系统集成项目管理工程师(高级案例高分论文).docx

    通过在项目启动、计划、执行和监控等各个阶段严格把关,系统集成项目管理工程师能够有效应对项目中的各种挑战,确保“数字文档中心系统”等大型项目能够顺利完成,满足组织和用户的需求,最终实现项目目标。

    IBM大型机操作系统学习笔记

    IBM大型机操作系统的学习之路虽充满挑战,但掌握其操作逻辑后,你会发现其中的高效与便捷。数据集管理、编辑器功能以及文件传输和用户间通信构成了IBM大型机日常操作的核心。通过不断实践和总结,初学者能够逐步熟悉...

Global site tag (gtag.js) - Google Analytics