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

深度解析:清理烂代码

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. 就这么多了

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

来自:伯乐在线

高访问量Web应用跨云端迁移的原因:权限和易用性 Web应用开发者福音 Chrome 28新增丰富通知中心功能 帷千兰旭:推广渠道鱼龙混杂,开发者请小心 关于IE 10 你应该知道的6件事 Spring Framework 4.0M1发布,支持JDK 8、Java EE 7 “渣打科营编程马拉松赛”正式启动 官网同时上线 Android应该支持OpenCL的十大理由 传谷歌考虑和Facebook竞购众包地图Waze 谷歌工程师再次公布Windows漏洞 并称微软很难合作 Glassdoor评前景最令员工乐观的十大科技公司 华为上榜 下一代Android深度前瞻 第18级API功能揭秘 Web开发者不容错过的20段CSS代码 8大核心要点:我们能用HTML5 Canvas做什么? 移动周报:直接拿来用!最火的Android开源项目 前MySQL CEO:云将重新定义开发者的每一件事 CIO必知六件事,至少必须想到的! PPT集萃(四):来自五位中外专家分享的虚拟化和云存储实践 Jolla和Sailfish OS,那些你应该知道的事儿 不仅保值还能升值:过时的苹果电脑创下67.1万美元售价 三十天完成跨平台办公套件Joeffice的开发 jQuery 1.10.0和2.0.1同时发布 软件初创公司招投的九个必备技巧 BYOD浪潮即将来袭 六大年轻杀手重塑企业软件 灵活运用AppFlood:提高APP eCPM的10个技巧 事半功倍:你应该知道的HTML5五大特性 创建API监视器的五大技巧 流量激增15倍+ 乐蜂网桃花节大促背后的技术事 Windows 8和IE 10:如何保障视频播放? 云计算大会讲师秀之13:梁家恩,12年积累,构建永久免费的语音云平台 众望所归:智能手机芯片将为服务器所用 没有学位,他通过以下四步进入Google 各位来看一下我写的这点东西,能不能找到个工作呀 比较一下:C++primer The C++ programming language 和 thinking in C++。不要只说那本好,只看过一本也近来说说看法!! 高手来帮助我阿 浏览器隐藏问题! 那位给我一个用 C# 操控注册表的详细例子或说明…… 已经辞掉了版主职务了,一个星期没有上网,这回散点分给大家. 有没有变量可以存储任何类型的图片对象? Exchange 2000 Lotus connector 大侠帮帮我! XP内存消耗问题 为什么SQL存储过程在SQL QUERY ANALYZY可以顺利执行完一个从1到1500的循环,而在PB7.0中调用时却... 如何设置按钮控制程序运行,具体看贴 网页图片显示问题(急,帮帮忙哦,在线等!) 请问一个关于visual studio.net的问题 在线求解,很急,谢谢 程序是SQL Server2000+Delphi6的三层结构,打包问题,大侠请帮忙!(200) ¥¥火星人都不会的问题!巨难!欢迎各位! 这里有没有兄弟写过“万邦“图形采集(winbond)的应用程序没有 关于输入法 为什么ASP页面关闭后,session中的值还存在呢? 到底有没有官方出的VS6.0中文版?? 请问怎样给一个buffer中所有数据清0 test 数据采集问题,高手指教!!!急 为何我修改了打印纸尺寸但不起作用? 请问大家现在MCSE的题目变了没有啊? 共同学习 高人指点一下 DataGrid如何实现如下功能? 如何在图片框中按鼠标时知道当前鼠标在图片框中的坐标?谢谢! 【骂人】destroy(只想灌的爽)进来 散分~~~~前5名!谢~ 请教两个问题,专家请进! 请问在什么地方可以找的计算机方面的中英文对照翻译? Dll向主窗口发送自定义消息? 如何用MoveWindow()和SetWindowPos()来改变窗口大小(最好有个例子)! script参数怎样传输到applet中 怎样把jpg转换位BMP,在线急等 我要开放mssql的访问,在防火墙中是不是只要开放1433端口就可以了? 外面买的2000安装盘有的里面只有一个程序,叫什么ghost,好象运行它后就可以非常快的安装2000,请问这个ghost是用哪个软件做的? 系统初始化把所有数据库里面的内容删除,保留表的结构,这是怎么实现的? 如何将AnsiString转换成LPCWSTR? 我想请问一下,当panel显示时如果下面有<select >控件是,这个控件不被盖住,结果好象panel破了下一样,请问题怎么办!谢谢 如何把这个程序转换成java程序,我够菜的:( 高分请教如何实现本地网址过滤?就好像反黄软件,或公安的监控软件一样。 又有问题了 谁能贴一个关于TQUERY,TTABLE等控件的数据库应用的详细使用 我会jsp+servlet sql server完成小项目 找相关工作还咬什么? vs.net的问题,看看你遇到过没有? 答者有分!怎样用超链接调outlook发邮件? 怎样把不同机子上的vc++模块连到一块 二次函数y=2x^2的图像的对称轴是? 已知向量a=(cos1.5x,sin1.5x),b=(cos0.5x,-sin0.5x)且x在0—90度之间 求a+b向量的模 为什么一物体离凸透镜越近,它所形成的虚像离凸透镜越远? 函数y=cos(2x+π/3)图像的对称轴可能是?A.x=-π/6 B.x=-π/12 C.x=π/6 D.x=π/12 已知向量a=(cos1.5x,sin1.5x),b=(cos0.5x,-sin0.5x),x∈【-π/2,π/2】,若|a+b|=1已知向量a=(cos1.5x,sin1.5x),b=(cos0.5x,-sin0.5x),x∈【-π/2,π/2】,若|a+b|=1 /3,求cosx的值。 The language of words is much more exact. 不同组织中的氢原子在1.5T的磁共振机中进动频率是否相同?人体不同组织中的氢原子在1.5T磁共振机器中静止场强下进动频率是否相同?我的意思是说:我们磁共振检查时是研究氢原子,那么 已译,请判断对错:A problem with the language of signs is that it is not clear and exact问题是手语并不是那么清洗和准确清晰和准确.请判断句子的对错和翻译的对错 Dimensional resonance什么意思 请问司马迁跟司马光是什么关系 求推荐含有描述Nuclear quadrupole resonance spectroscopy(NQR)章节的英文著作.除介绍1D以外,还有简要介绍2D的更佳 将一对反义词分别放在一个相同的句子里,使两个句子意思相同. USB数据线上的小圆柱体的工作原理? 凸透镜:“呈虚像时,物体离凸透镜越近像越大”这句话是错的.为什么错? 自行车以6m/s的速度冲上10m长的斜坡,得到大小为1m/s²的加速度,求自行车到坡顶的时间.求解决 USB连接线上的圆柱体是用来干吗的?貌似很有用的样子 成虚像时物体离凸透镜越近像越大是否正确 太阳能电池板硅片出现的白色物质是什么原来硅片没有白色的物质,我也不知道是怎么来的.白色物质覆盖的大小相当于一个小纽扣电池大小,我的是成品12v10w单硅太阳能电池板谁知道这个出现 怎么有些键盘连接线上有一圆柱体的东西? 请大家给我讲讲这个物理概念.第1个是 l1 并联(上到下)l2 l3 最右的l4 慕尼黑啤酒节 德语版介绍就是要全德语版的Oktorberfest的介绍 数据线上的那个圆柱体的是什么 co32-化学中文是什么意思 慕尼黑啤酒节的来源谁知道 麻烦告诉下 急用 有没有人叫我一下怎么乳交啊?我胸部比较小 我想问下这个英文Diethylhexylterephlhalat在化学当中是什么意思,中文是什么? 慕尼黑啤酒节啥时开始啊 已知圆X²+y²=8内有一点M(-1,2),AB为经过点M且倾斜角为α的弦(1)当α=3/4π 时,求弦AB的长(2)当弦AB被点M平分时,求直线AB的方程 3200kJ是什么意思 ,那个英文写成中文是什么? mathtype问题!输入的公式为什么和文字不一样高啊,急求解决怎么解决啊 mathematica如何在一个随机的球体上随机生成三个点? 长期接触硅片会有什么后果有什么解决的方法或是减轻的方法 慕尼黑啤酒节用的什么歌 鸡胚蛋能吃吗? 0〜100公里/小时只要3. 5x^2+8x=0 求y=cos2x的对称轴与对称中心、、 x∈(0,+∞) x∈[0,1] 单个光子具有波动性吗?让单个光子进行双缝实验,会出现衍射现象吗?如果不出现,那光子能否用宏观的形象的描绘出来是干涉,如何理解光子通过两个夹缝 -cos2x=y 如何求对称轴 我的网速是0.06兆比特/秒是什么意思? 光的波动性是由于光子见相互作用而形成的?为什么不对? cos2x如何求对称轴?y=cos2x 什么叫基态的两个超精细能(见秒的定义)基态不就是最低的能级吗? 介绍品牌的ppt应该包括哪些内容?大学市场营销课布置的作业,ppt4-5张即可,所以内容尽量简洁,不是帮我做,我只是问一下应该做哪些内容而已啊~ 求“浅谈沃尔玛对中国零售业的启示”的论文提纲 0.025秒意味着什么求大神帮助 神经元细胞膜的特性? 如果两个小圆柱体可以拼成一个大圆柱体,那么这两个小圆柱体的底面积一定相等,高也一定相等这句话对吗? 索尼Z1这手机咋样?以前用过索尼的1300万的像素感觉好差连我的诺基亚500万像素都不如,还有就是屏幕也怪怪的.那Z1会不会有这些情况?会不会屎黄屏幕.港版和国行的Z1有啥区别?听说哪个版本的 magnetic resonance imaging是什么意思 某物质的化学式为HnMO2n,其式量是A,则M的相对原子质量是(),M的化合价(),当M的化合价不变时,其氧化其氧化物的化学式为什么 在1一36个小球中,每个小球表上1到36的数字,随机抽取,1--12为第一组,13--24为第二组,25--36为第三组,那么随机抽取一个数字为9,他为第一组,试问下一次随机抽取为第一组数字的概率是多少呢? moonlight resonance怎么翻译?resonance应该是要什么意思? 一道物理竞赛题答对追加分匀质杆AB直立于光滑水平面上,稍受扰动杆将倾倒,A断在水平面滑动,求B点的轨迹,设杆长为2l.如图 什么是狗头镜? 求书“Encyclopedia of Nuclear Magnetic Resonance”电子版本,1-8卷Encyclopedia of Nuclear Magnetic Resonance,David M.GrantAuthorRobin K.HarrisEditorsDavid M.Grant 第五题3,最好陪图和对称轴 刚化蛋有什么好处,都有什么营养? 聚缩醛板在中国大陆是否也叫聚甲醛板,及所谓的POM板啊? 中俄驳斥日媒“俄罗斯联日本牵制中国”义乌乡村红糖飘香 百姓迎来“甜蜜”致外媒:中国不缺改革突破口 缺推进改革联合国称叙利亚完成对化武生产设施功能叙利亚当局表明愿无条件参加叙问题国际以色列攻击叙利亚军事基地 目标是俄制奥巴马豪华座驾细节曝光 可抵御化武攻普京与中国中央军委副主席许其亮举行会美国六大互联网巨头致信国会要求改革监美国被指反咬欧洲国家是监控活动合作方联合国敦促美方遵守国际法准则美大使称马来西亚民众隐私将不受监听影美财政部制裁俄流行歌手 称其涉嫌跨国格鲁吉亚称俄未被列入总统就职典礼受邀澳大利亚使馆被曝替美监听亚洲 澳总理斯诺登最新照:在莫斯科乘游览船 未戴以色列攻击叙利亚军事基地 目标是俄制默克尔遭美国监听 德议员称斯诺登愿协国际新闻早报:美国务卿将访沙特修补关美媒:日本大幅升级预警机应对中俄海南乐东退休局长房屋夜半遭强拆 警方见义勇为遭辞退不可姑息王健林:不会说和马云赌约谁赢 说我赢体坛性丑闻大盘点女子靠炫富诈骗1100万:1顿饭30淘宝的黄金时代要结束了JR无人要陷尴尬境地 无人问津想重回林书豪:骄傲自己是名亚裔美国人高考25省统一命题 是促进教育公平的裁人裁上瘾 掘金又将裁前火箭旧将多西坎特奥古斯丁将休战对阵爵士比赛90%的人看完后都辞职了,你敢看吗?韩国进球国足球迷看台心脏病发 若安好只知开头~却没猜到结果!关于信用卡背面签名,你不得不知这7件这是我的战争蔬菜种植攻略 蔬菜可不可情怀加持,信任网络下自动解除锁屏密码留尼汪岛再现2个马来西亚矿泉水瓶 一科比中国行第二日记实 告别广州突袭上17个初老现象,你中了几条?海岛奇兵8月4日恐怖博士图文攻略血型排行榜,哇哦!太准!!!
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘