说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

深度解析:清理烂代码

HTML文档下载 WORD文档下载 PDF文档下载
烂代码不一定是问题,只要它们没有出错,没有人会对它嗤之以鼻。但不幸的是,它们没被发现的概率太小了。错误会被发现。需要新的功能,新系统发布了。现在你不得不面对这堆恐怖的代码,试着去清理它们。

猜猜看怎么了!你正”继承“(接收)了一堆混乱的旧代码。恭喜你!现在都是你的了。混乱的代码可能来自任何地方。中间件,网络,可能来自你自己的公司。

你知道在一个角落里有一个家伙,没有人过去管他在做什么。猜猜看他一直在做什么?辛辛苦苦写出了代码,却是一堆烂代码。

你还记得这个模块是一个家伙几年前写的,在他离开公司之前。这个模块已经有20个不同的人加过补丁,进行过代码修复,而且他们也并不理解代码到底是做了什么。是的,就是这样的代码。

或者你从网上下载下的开源的软件,你知道它非常的可怕,但是它解决了一个非常专的并且对你来说非常棘手的问题,解决这个问题你可能要花上几年。

烂代码不一定是问题,只要它们没有出错,没有人会对它嗤之以鼻。但不幸的是,它们没被发现的概率太小了。错误会被发现。需要新的功能,新系统发布了。现在你不得不面对这堆恐怖的代码,试着去清理它们。这篇文章为这种不幸的情况提供了一些建议。

0. 值得清理么?

第一件你需要问问自己的事情就是代码值得清理么。我不是说当问到是否要清理代码时,你一定要回答是或者一定回答不是。是你对代码负有责任,也是你需要一直面对它们直到最终写出的代码是你乐意维护的,也是你很自豪的放入代码库的。

如果你觉得就算代码看起来很可怕,也不值得浪费你本来就很紧张的时间来修复它们。所以你仅仅做了最最微小的调整解救燃眉之急。

换句话说,你也可以将代码看作自己的,也可以看作是别人的。

两种情况都有优缺点。优秀的程序员看到烂代码时会觉得很难受。他们会拿出火把和叉子并且高呼:“太乱了,太乱了”。这是一种优秀的品质。

但是清理代码是一个繁杂的工作。很容易就低估了时间。甚至有时候和从头开始写代码一样的耗时。并且短期并没有带来任何的短期效应。两个星期的时间清理代码并不会带来任何新的功能,但有可能引入一些新的错误。

另一方面,如果长时间不清理代码可能会带来灾难性的毁灭。混乱是代码的杀手。

所以,这并不是一个容易做出的决定。需要考虑一些事情:

● 你期望对这段代码做多少改变?你是希望仅仅修改这个小错误呢,还是这段代码还要使用多次,所以你希望将它“调教”的好些,并且加上新的功能。如果仅仅是修复一个错误,那么最好是别打草惊蛇。然而,如果这个模块你需要长期折腾的话,那么现在开始花点时间来清理它吧,之后会省掉很多烦恼。

● 你需要或者是你想引入上游的更新吗?它是一个正在开发当中的开源项目吗?如果是的话,并且你想做改变的是上游的代码,那么你不能对代码有大的改动否则当你每次pull代码的时候都会经历一场merge的噩梦。所以你需要做一个友好的团队合作者,接受这个错误,将带有你修正的代码补丁发给代码的维护者。

● 要做多少工作?你一天内实际上能清理多少行代码?我们估计多于100行,少于1000行,好,我们假设是1000行。所以如果一个模块有30,000行代码的话,你可能需要一个月的时间。你有那么多时间吗?值得这么做么?

● 它是你核心的功能吗?如果这个模块只是边缘的模块,譬如字体渲染或者图像渲染,你可能并不在意它是否是乱七八糟的。你可能全盘不要,将来用另外的东西来代替,谁知道呢。如果这段代码关乎核心的性能,你需要慎重对待。

● 这段代码有多糟糕?如果代码仅仅有一点点糟糕,那么可能你还是可以忍受的。如果它是不可理喻的,令人崩溃的话,那么我们就必须对它下手了。

1. 建立测试用例

要认真清理一段代码意味着花一段时间来彻底清理它。你可能会毁坏它们。

如果你有一个比较好的测试用例,有一定的覆盖率,你将会很容易知道什么已经损坏了,并且你能够很快的知道你犯了什么愚蠢的错误。想要节省建立测试用例的时间在整个的清理代码的过程中是可笑的。建立测试用例吧。这是你第一件需要做的事情。

单元测试是最好的,但是所有的代码并不适应单元测试。如果单元测试过于繁琐,就换用集成测试吧。譬如,一个游戏关卡中需要一个人物完成一系列的动作和你清理的代码有关。

这样的测试更加耗时,所以不可能在每一次更改之后都测试一次,虽然这是最理想的情况。因为你将每一次改变都放到了版本控制系统中,所以情况还不是那么糟糕。所以每一段时间(比如,五个更改)就测试一次。当你发现了一个问题时,你可以通过二进制搜寻最近的几次commit中找到什么地方导致了问题的发生。

如果你发现了测试没有发现的问题,确保将这个也加入到测试中,以便将来可以测试它。

2. 使用代码版本控制系统

还有人需要被告知要使用代码版本控制系统吗?我希望没有。

清理工作是很关键的。你可能要做很多很多小的修改。如果什么地方出错了,你想回顾版本历史,你可能找到它错在哪。

如果你和我一样,你可能有时重构(清理愚蠢的类)的时候会出错,并且后来意识到这并不是个好的点子,或者这是个好点子,但是如果先做了什么之后所有的一切会变得更简单。所以你想快速的恢复一切到原状并且重新开始。

你的公司应该已经有代码控制系统了,你可以在不同的分支进行修改,在不打扰别人的情况下随意的commit。

就算情况不是这样的,你也应该使用版本控制。下载Mercurial(或Git),创建新的仓库,将代码从你们公司的愚蠢的系统中签出并放在这里。在库中commit你的更改。当你完成了之后你可以将所有的一切merge到那愚蠢的系统中。

拷贝库到一个代码控制系统中仅仅需要几分钟。很值得这么做。如果你不懂Mercurial,花一个小时学习它。你会为你这么做感到高兴的。如果你愿意的话,花30个小时学习下Git(我是开玩笑的!并不用这么久。现在是“nerd”战斗的时候了!)

3. 每次仅仅做一个小小的改动

有两种方法改进坏的代码:革命和改革。革命是用火把一切都烧掉,从新写一遍。改革是在不破坏的基础上每次只进行一点小小的改变。

这篇文章是关于改革的方法。我不是说革命的方法从来不是必要的。有时代码太糟糕了,需要用革命的方法。但是那些觉得改革的进度太慢的人们往往会鼓励改革,然而经常没有意识到问题的复杂性,并最终并没有比现存的系统更好。

Joel Spolsky写过一篇经典的文章,他没有掉入到这个紧张的争论的陷阱中。

改革的最好的方法就是一次只做一个小的改变,测试它,并且commit它。当一个改变很小时,它更容易理解改动的后果以及确保改动不会影响现有的功能。如果什么地方出错了,你仅仅需要核查很少的一部分代码。

如果你开始做更改并且意识到改得很糟糕,那么你恢复到上一次的commit,不会损失太多的无用功。如果你过了一段时间才发现什么地方有细微的差错,你可以在版本历史中使用二进制搜找到导致问题的更改。

最常见的错误就是一次进行多处更改。譬如,当去除不必要的类层次的势后,你发现API的方法并不是像你喜欢的使用方法,而你打算重新组织它们。不要这么做!先去除层次结构,commit之后再更改API。

聪明的程序员懂得组织,所以他们也不需要太聪明。

试着找一个途径,沿着这个途径你可以把代码变成你想要的模样,每次只有一点点改动。譬如,第一步你重命名方法,使之名字更合理。下一步,你可以将成员变量变成方法的参数。然后将算法变得更清楚些,等等。

如果你开始做更改,并且发现比你原先设想的改变要大,不要害怕又退回去,使用更小的更简单的步骤去完成同样的事情.。

4. 不要同时清理代码和修正代码

这是(3)的结果,但是仍然很重要。

这是一个常见的问题。你开始察看一个模块,是因为你想加入某个新功能。然后你发现这个代码相当的糟糕,所以你开始重新组织它并且加入新的功能。

问题在于清理代码和修正错误是完全不同的目标。当你清理的势后,你想让代码看起来更好,而没有改变它的功能。当你修正错误时, 你想改变功能。如果你同时清理代码和改正错误,很难保证清理不会改变什么。

先清理代码,然后再在一个干净的基础上,加入新的功能。

5. 删除你没有使用的功能

清理的时间正比于代码的数量,复杂性和糟糕的程度。

如果代码的功能你目前没有使用,而且在可预见的将来也不会使用,那么就删除它,这会减少你浏览的代码数,降低复杂度(删除不必要的概念和依赖)。你会清理的更快的,而且最后的结果会更简单。

不要留着代码仅仅因为“谁知道呢,你可能某一天需要它”。代码是有代价的 – 它需要被移植,修正错误,被阅读以及被理解。你有更少的代码,就更好。就算在最不可能的情况下,你需要这个旧代码,你也能从代码库中找到它。

6. 删除大部分的注释

烂代码很少会有好的注释。它们通常是这样的:

// Pointless:    // Set x to 3    x = 3;// Incomprehensible:    // Fix for CB (aug)    pos += vector3(0, -0.007, 0);// Sowing fear and doubt:    // Really we shouldn't be doing this    t = get_latest_time();// Downright lying:    // p cannot be NULL here    p->set_speed(0.7);

看看整个代码。如果一个注释对你来说不再有意义,也对你理解代码没什么帮助,那么就删除它。否则你只会浪费你的脑力去理解一堆对你理解代码没帮助的注释。

同样的删除那些已经被注释掉的代码。如果你还需要它的时候,它还在你的代码仓库中。

甚至如果注释是正确而且有用的,记住你还可以重构你的代码。可能当你完成重构后,这些注释不再正确了。这个世界上还没有一个单元测试能够告诉你注释是否已经损坏了。

好代码需要很少的注释因为代码自己已经自说明了而且很容易理解。拥有好名字的变量不需要注释去解释它们的用途。函数如果有好的输入输出,没有特殊情况时是不需要说明的。简单的写得很好的算法在没有注释的情况下也是容易理解的。而断言记录了条件和预测。

大部分情况下,最好的做法是删除所有旧的注释,专注于让代码变得干净和具有可读性,然后再在需要的地方添加代码 – 这些注释反应新的API的用途以及你对代码的理解。

7. 避免共享的可更改的状态

共享的可更改的状态是理解代码的最大阻碍,因为它允许隔一段距离的行动,一段代码可以改变另一段完全不同的代码的行为。人们常说多线程是困难的。事实上,是由于线程共享了可更改的状态,才导致了问题。如果你能避免它们的话,多线程并不复杂。

如果你的目标是写高性能的软件,你应该不能避免一切可更改的状态,但是你的代码仍然可以从减少它而获益。为了“大部分功能完善”而努力吧,确保你确切的知道什么状态在什么地方改变了,并且知道原因。

共享的可更改的状态来自不同的地方:

● 全局变量。最经典的例子。现在每个人都知道全局变量的坏处。但是要注意(有时人们会忘记),全局变量是唯一的会造成问题的共享的可更改状态。全局常量并不糟糕,Sprintf也不糟糕。

● 对象 – 装有乐趣的大袋子。对象能够集合很多方法,无疑可以共享很多可变的状态(成员)。如果一个懒惰的程序员需要将一些信息在方法之间传递的话,她可以建立一个新成员,所以可以依照需要来读它和写它。这非常像全局变量。多么有意思!当一个对象有越来越多的成员时,问题就越来越严重。

● 巨大的函数。你可能已经听说它们了。这种神秘的产物栖息在最黑暗的代码洞穴的最底层。心眼坏的程序员在阴暗的酒吧里谈论它们,他们的理智被他们遇见的代码摧毁了:“我不停地向下翻向下翻,我不能相信自己的眼睛。居然有12,000行。”当函数足够长的时候,它们本地变量将和全局变量一样糟糕。我们不可能知道改变2000行之后的一个局部变量会有什么效果。

● 引用和指针参数。引用和指针参数没有被声明为const被传进函数时,可以在被调用者,调用者以及任何能被传递相同的指针的对象之间充当共享的可变的状态。

这里有一些避免共享的可更改的状态的建议:

  • 将较大的函数切分成较小的函数。
  • 将较大的对象切分成较小的变量,将相关的成员放在一起。
  • 将成员变成private。
  • 将函数声明const,返回结果,而不是可更改的状态。
  • 将函数声明static,从参数获得值,而不是从共享状态那里取值。
  • 避免完全使用对象,实现纯净的功能,不要引入副作用。
  • 将本地变量声明const。
  • 将指针和引用声明const。

8. 避免不必要的复杂性

不必要的复杂性通常是过度工程化的结果 – 支持的结构(如序列化,引用计数器,虚拟接口,抽象工厂,访问者等等)会拖慢真正有实际功能的代码。

有时候过工程化是因为一些项目开始的时候有一些更大的野心,多于实际完成的。更多的情况,我想是因为程序员读了关于设计模式的书之后和瀑布模型之后的想法,他认为过工程化会形成更“坚固”和“高质量”的产品。

通常,这个笨重的,僵化的,过度复杂的模型不能适应功能需求,而这是设计师不期望的。那些功能可能之后用hack的方式来实现,成了在象牙塔最顶上的螺栓和后门,变成了神经错乱的混合结构。

治愈过度工程化的方法就是YAGNI(you are not gonna need it)-你不需要它!只有当需要一个东西的时候才建造它。当你需要它的时候才建立更复杂的东西,而不是在你需要之前。

避免不必要的复杂性的一些实际的方法:

  • 移除你没有用到的东西(就像上面建议的一样)。
  • 简化必要的概念,避免不必要的概念。
  • 移除不必要的抽象,用实际的实现来替代。
  • 移除不必要的虚拟化,并且简化对象的结构。
  • 如果一个设置曾经使用过,那么就避免在用另外的配置来运行这个模块。

9. 就这么多了

现在开始清理你的“房间”吧!

来自:伯乐在线

专访豌豆荚:融资,会给技术团队带来哪些影响? 前端开发必备 40款优秀CSS代码编写工具推荐 新环境下的新体验是互联网硬件火热的根本原因 信息安全救星 ——变形代码产品ShapeShifter AWS启动大规模降价,引领行业降价潮流 Windows 8.1 Update 1最新版的截图再遭曝光 2013年软件领域因缺陷导致的五大事件 专访AMD技术高管 详解Kaveri技术性能及新开发特性 网络的东西南北:从SDN到网络虚拟化 Bug让Chrome浏览器成了窃听器 联想23亿美元收购IBM X86服务器硬件及服务 Mozilla联手富士康推出Firefox OS平板 基于Web提供服务 GitHub中国游记最终回——开源与车库的碰撞 学以致用,光棍极客通过大数据搞定女朋友 1月24日:Mac步入了而立之年,生日快乐! 微软2014财年Q2财报:Surface营收翻倍 趣文:假如编程语言在一起聚餐 AOL收购个性化服务公司Gravit,耗资9070万美元 谷歌三月将办Pwnium 4黑客大赛 奖金高达271.828万美元 研发周报:精简代码,为网站减负的十大建议 教育自由日:让教育资源更开放 Win8.1下解决IE11浏览器不兼容的方法 移动周报:找你妹版权战、访俄民手游、GitHub游记终回 一周消息树:1月23日全国顶级域名根服务器疑遭黑客攻击 影响巨大 下一代互联网搭建技术:高空气球,无人机,又或是卫星? 红帽认证总监:10个架构师里有4个在中国 数据中心优化的5个途径:软件定义、云计算等 收购诺基亚,微软能否再度崛起? 一周热点:阿里专家深度解析分布式系统,美团数据挖掘工程师分析企业大数据 独立游戏节:学生展示优胜者奖项得主揭晓 专访Meetup Andres Glusman:解析UX、精益创业方法论背后的强大力量 CITIZEN 的打印机 GSX-540S的驱动哪里有??急啊!! 我该如何处理这感情 #图书醒目#《vc++和uml》#图书醒目# 斑竹:请给matlab一个专区! 如何调用API使得子窗体全屏显示,且要屏蔽掉所有菜单及工具条? 每次用.net帮助的索引就会出错退出 奇怪的linux安装问题 用PB6.5开发单机版程序用什么数据库比较合适? 为什么我每次用UpdateUI刷新JTree时都有错? 本菜鸟想问一个怎么定义公用函数的问题!请各位大虾不吝赐教!不胜感激。 我这个人啊!!大家可能还不了解!! 网友六一见面,找个网友男朋友看海,找个网友男朋友看星星! 请教!! 求教SQL语句 神洲数码怎样? 请大家帮帮忙:如何将一个字符转换为unicode码形式(得到的是数字,而不是字符串)! msn怎么通不过http代理 求助:J2EE Container中deployed的servlet是否可以调用EJB local home? 有关时间限制 ie问题有没有碰到过 TADOTable+TDBGridEH+TDataSource中编辑一有关键字的表时,怎样做到避免在输入相同的关键字时的出错? IE经常自动关闭是什么原因 菜鸟请教 UlraEdit? 四舍五入的函数是什么?? 帮帮忙!!!我编译出这问题?? 请问:发现病毒:生成folder.htt,还有后缀都是htt的其他文件,用kv3000杀,提示kbs\kj,请问是什么病毒,怎么杀毒(急)? ie问题有没有碰到过 打开adsl的猫机器能自己启动为什么? 神洲数码怎样? linux中如何得到某个网络设备的ip地址? 请教ADO的Recordset对象的Delete的问题 请问jbuilder的参考书,哪本比较好?市面好像种类比较少 请问怎样获得临时表的记录? @@@@@@@@@@如何使我的折线图随着时间移动@@@@@@@@@@ 菜鸟问:各位大哥看c++ primer的时候是用什么编译器? 神洲数码怎样? jsp如何将web页面的String型转换为long型? 极容易的问题 ,先来先得! 大虾,救命啊!!!!!! jsp如何将web页面的String型转换为long型? ★★★帮忙翻译一句话!谢谢★★★ **冗余醒目**《如何在输入的时候减小冗余》**冗余醒目** 倡议书:维护您的网络权益 [100分,两日内结]怎样在jsp中得到我的数据 两个菜鸟问题,送分拉 线程与消息??? c、odbc、嵌入式sql的关系? 简单的重载问题! 用<input type="fiel" name="test">时,怎样判断输进去的文件是硬盘上实际存在的? 请问哪里有eclipse 下载? 求一篇500字的作文 《校园生活之跑操》要跑操!跑操! 知道了液位和比重,如何计算他的体积啊?同题只知道液位和比重 照样子,再写几个表示颜色的词.1、百合色(咖啡色)(橘色)(藕荷色)2、红彤彤(黄澄澄)(绿油油)(白花花)3、葡萄灰(象牙白)(玫瑰红)(茄子紫)4、半紫半黄(半灰半白)(半 宇宙景象被我们观测到景象,同步时间是否已过万亿年?经常看到一些科学家称,观察到新的黑洞或超新星的,都知道要到达那裏按光的速度要走上数万或亿年,所以我们现在观察到的景象是否已 美国将开启太空旅游 每天发一班太空飞船上多少高空呢? 举四种淡水鱼类,海洋鱼类 为使氦氖激光器的相干长度达到1km,它的单色性应为多少?单色性用波长的变动范围对波长的比值来表示 什么褐色粉末加透明液体会爆炸?先冒烟 发出噼里啪啦的身音 pH=4的醋酸水溶液中含哪些粒子,这些粒子之间有什么关系,分别为多少 能否用马赫-曾得干涉仪测量激光器的相干长度 A深色液体 + 水 + C无色粉末 = 无色液体,求A,C两物质名.rt.A深色液体 + 水 + C无色或白色粉末 = 无色或白色液体 氧气对人类有利和不利的实例 为了使氦氖激光器(632.8nm)的相干长度达到1km,它的单色性△λ/λ0应是多少?激光科学 为了测量半圆形玻璃砖的折射率、某同学在半径R=5cm 人类每天需要多少氧气 西城的四页第三节三题和九题(ME没答案)对牛叫声和蚊子飞行时发出的声音,正确的描述是:牛叫声( )大,蚊子飞行时发出的声( )高不同的物体发出相同的音调的声音,人们依然可以分辨的出来,是 粒子的能量涨落来源于真空能吗? 氧气不利的一面是什么啊? 跑操时发生的事 作文 急 要有趣! 地球东西南北的划分是怎样的?划分的经线、纬线的位置是怎样的? 为什么人类需要吸收氧气?人类会不会进化成不用吸氧的状态为什么人类必须吸氧在人类体内发生什么变化还有不吸氧的话人类为什么会死难道其他东西代替不了氧气 八年级下学探诊物理46页3\4\5题 为什么地球会有东西南北为什么中国就是东方 欧洲就是西方?地球不是圆的吗,东方的临界也可能就是西方 到底谁定义的~ 我国有淡水鱼类约800种,比海洋鱼类少百分之六十,我国约有海洋鱼类多少种? 跑操比赛 作文高中生作文,要有感情的,复制的也行. 地球的 东西南北球连线题1、东半球 A、20 °N、116 °E2、西半球 B、70 °N、21 °W3、南半球 C、20 °S、10 °E4、北半球 D、30 °S、159 °E 关于嫦娥1号的资料 月亮是东升西落么? 划分地球东西南北的线 某水库水位原为a米,又上升了3米,现在的水位是多少米? 物理选修3-1该怎么学更好? ,东西南北只是在地球上吗,或者说相对地面而言吗,如果到了太空,或者火星之类的,还有东西南北吗 水溶性破乳剂为什么要稀释?水溶性破乳剂为什么要稀释了以后才能用?一般稀释水溶性破乳剂除了用水还能用什么稀释?做含水检测用,用水稀释破乳剂会增加检测样的含水么?如果用水稀释的 -4物体A的质量为m1,物体B质量m2,弹簧劲度系数为k,用外力F作用在物体A上,把弹簧压缩到一定程度,突然撤去外力F,物体B能离开地面,求要撤去F后物体B能离开地面,F至少为多大?图我没办法发.就是A 三氧化二铝是电解质吗. 物理什么上磁场力啊,还有什么磁畴我在加拿大上高中,上星期到了美国听了节麻省理工公开课,我日让我听的好糊涂啊!他们有时还用右手来判定磁场力~什么是有用右手,什么时候用左手~磁场力 求北京西城区高二物理选修3-2的学探诊答案!所有章节的答案,注意是物理选修3-2的学探诊答案.急求!在线等! “我叫MT”中的“MT”是什么意思?是部动漫 固体悬浮物怎么测试污水处理方面的,好像不太清楚,大侠指教 如何使用天平称粉末状物和有腐蚀性液体 常染色体隐性基因遗传病怎么遗传?我婆婆的亲生父母身体健康,继父身体也健康,婆婆本人身体也健康,但同母异父的一个妹妹和一个弟弟却得上了常染色体遗传病(不知是显性还是隐性基因) 可以用浊度计测固体悬浮物的浓度吗? 元素的化合价为什么会随原子的核电核数递增呈现周期性的变化 正常水位、设计水位、校核水位的区别请通俗说出三者区别 正三角形有几条对称轴?一个直角和两个锐角.我觉得是一条吧! (六年级品德与社会作业)1.中国有很多企业到国外创业,享有很高的声誉,你能列举出一些企业吗?1.中国有很多企业到国外创业,享有很高的声誉,你能列举出一些企业吗?2世界各种联合科学组织为 极端高水位、极端低水位,校核高水位、校核低水位,设计高水位和设计低水位的定义是什么,怎么区别使用 【求助】关于溶液中微粒浓度问题等体积0.1mol/L的醋酸钠和醋酸混合后,醋酸根离子的浓度与醋酸分子的浓度哪个大?为什么? 有一个已知序列的新基因,如何知道其生物学作用 等物质的量的氯气与乙烷在光照条件下反应,能否制得 氯乙烷 纯净物? 漫游怎么造句 如图所示,在圆柱的下底面圆周A点处有一只蚂蚁,它要从圆柱体的侧面绕一圈爬到点A的正上方上底面圆周长的B点,你能帮助它找到一条最短的路线吗?画得很难看 ,不要建议 等物质的量的氯气与乙烷在光照条件下反应,能制取纯净的氯乙烷吗? 用遨游造句(在书海中) 如图,圆柱下底面圆周上的点A到上底面圆周上的B的最短路线为15cm,又底面圆半径为3cm,求BC的长.(π取3) 如图,B,c两点把线段AD分成2:3:4的三部分,点E是线段AD的中点,EC=2cm,求:(1)AD的长;(2)AB:BE 求推荐几个大电流运放(100mA以上),以及单个的运放(就是单个芯片中只有一个运放) 如图,圆柱底面直径为6/π分米,高为4分米.如果一只蚂蚁从A点沿圆柱侧面爬到B点,它爬的最短距离是多少分米解释也要是一个圆柱,A在左下角,B在右上角 为什么等物质的量的氯气与乙烷在光照条件下反应不能制的纯净的氯乙烷 常见的常染色体单基因遗传病有哪些? 猫鼬欲擒毒蛇当美食 毒蛇凌厉反击赢得世界新闻报窃听丑闻开审 卡梅伦政府威浙江释疑吴英资产处置:困难重重 已追清华公布领军计划推荐学校 浙江三中学疑似Nexus5第一张照片流出 摄像浙江19所高中入围清华大学领军计划名移动设备进入美国儿童生活 使用人数两国务院同意杭州再启城市总体规划修编女星着透视装惊现内裤 强搂导演遭拒绝11年来最强风暴袭英国 海陆空交通大美国在欧反导基地开建 防范伊朗导弹引中央巡视组:把发现问题、形成震慑作为专家析中央巡视组组长一次一授权:改变网络红人板车哥来到余杭 行万里路为穷16岁伴娘婚礼上遭多人扒光摸遍全身(温州公交车刮擦劳斯莱斯幻影加长版轿车11年来最强风暴袭英国 海陆空交通大英国“小报女王”将接受刑事审判 令世美国在欧反导基地开建 防范伊朗导弹引安倍突访土耳其 传为劝阻土放弃购中国杰克逊私人医生刑满出狱 欲再获行医执就是让你“高”人一等赢男生要出布 赢女生出石头天气女郎你是我们在寻找的“职业小达人”吗?60家庭三年来凌晨3时才有水章子怡甩链接止废话成功是付出正当的努力追求所期待的生活高端海珍打起“平民”牌桐庐5日青少年拓展营齐秦爱套近乎:你什么星座的?沙田虎门港 打造港镇融合新城爱玛整合五大电视平台 娱乐营销独领风付费通、支付宝“好聚好散”端掉4个“毒豆芽”窝点提供涉恐涉暴线索 北京市民获警方重奖对一切不正之风敢于亮剑药王庙:百姓敬奉孙思邈暑假欣赏“古典音乐怪咖魔幻秀”信用卡逾期 广州人最多?用助叙的方式援伊 伊朗愿帮“更大忙”瑞士难挡阿根廷晋级
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘