Tag: 重构

函数/过程/方法应该有多less行代码?

可能重复: 什么时候function太长? 我最近被赋予了一个不值得羡慕的任务,那就是审查另一个开发人员编写的糟糕的代码,并logging不好的做法。 (这当然是为了退出开发者的工作而不是为了任何利他的理由!) 审查的代码有几个程序是很多代码行 – 最长的是近600行。 我想到的一些问题是可维护性和可读性。 诀窍是,我需要向一个非专业人士辩解,为什么这是一个不好的做法,如果可能的话,还要备份一本备受好评的现行参考书。 类比也不错。 有任何想法吗? 重复: 什么时候function太长? 重复: 最大规则function的最佳规则?

有一个更现代的OO版本的“让我们build立一个编译器”?

有没有更现代的,也许是面向对象的,相当于Jack Crenshaw的“ Let's Build a Compiler ”系列? 前段时间,我偶然发现了“ 让我们编译一个编译器 ”,并不能拒绝写一些代码。 我在C#中编写了一个输出.NET CIL的recursion下降C编译器。 “写一次,到处漏”是我的口号。 太糟糕了,我一直没有意识到parsingC是一个噩梦。 我现在感兴趣的是用Java编写Java编译器,输出.NET CIL或程序集,目标是自引导。 我希望有一些更新的教程可以踢。 顺便说一句,你会花更多的时间进行前期devise,还是只是写一大堆testing来支持无情重构的能力。 回想起来,我倾向于后者。 编译器工作,但代码真的很糟糕。

Intellij提取内部类

如何使用IntelliJ或Android Studio提取公共静态内部类来创build新的顶级类? 谢谢。

eclipse可以将类文件中的第二个类提取到它自己的文件中

我经常通过在我正在处理的类中创build一个内部类来重构代码 – 当我完成时,我将整个事物移动到一个新的类文件中。 这使得重构代码变得非常容易,因为A)我只处理一个单独的文件,而且B)除非我有一个相当好的名称/名称的概念,否则我不会创build新的文件作为不止一个class级)。 Eclipse有什么办法可以帮我完成最后一步? 我应该能够告诉它我想要什么类的包,它可以从类名和包中的目录中找出文件名。 这似乎是一个微不足道的重构,真的很明显,但我无法弄清楚击键/手势/任何事情发生。 我试过拖动,菜单,上下文菜单,浏览键盘快捷键。 任何人都知道这一个? 这些文件已经是“顶级”类,而不是内部类,而“移动”似乎不想为我创build一个新的类。 这是我平时所做的艰难的工作 – 涉及走出去,创造一个空的class级,回来和搬家。 我想一步到位地完成整个事情。

你应该把你采用的第三方库封装到你的项目中吗?

我今天和一位同事讨论过。 他声称,每当你使用第三方库,你应该总是写一个包装。 所以你可以随时改变事情,并容纳你的具体用途。 我不同意总是这个词,关于log4j的讨论引起了,我声称log4j已经经过了良好的testing和时间validation的API和实现,并且所有可以想象的事情都可以被事后configuration,没有什么东西你应该包装的。 即使你想打包,也有像commons-logging和log5j这样的经过validation的包装。 我们在讨论中碰到的另一个例子是Hibernate。 我声称它有一个非常大的API被包装。 此外,它有一个分层的API,可以让你调整它的内部,如果你需要的话。 我的朋友声称,他仍然认为应该封装,但他没有做到这一点,因为API的大小(在我们目前的项目中,这个同事比我更老)。 我声明这一点 ,并且应该在特定情况下进行包装: 你不确定图书馆将如何满足你的需求 你只会使用一小部分库(在这种情况下,你可能只暴露了一部分API)。 您不确定图书馆API或实施的质量。 我也认为,有时你可以包装你的代码,而不是库。 例如,把你的数据库相关的代码放在一个DAO层,而不是抢先包装所有的hibernate。 那么,最后这不是一个真正的问题,但你的见解,经验和意见是高度赞赏的。

有没有一个重构SQL的工具,有点像SQL的ReSharper

我现在所追求的东西是相当基本的: 自动格式 检测未使用的variables variables命名约定检查 如果有一个工具可以处理更复杂的重构(比如重构数据库中的重构) ,我不会感到惊讶,但是我明白当前数据库结构和数据状态引入的复杂性可能会阻止其中的许多重构 。 我想我是在ReSQLer之后

如何处理错误的代码

作为一名开发人员,在我整天的生活中遇到的最不愉快的事情之一就是我必须修复错误或将特性添加到糟糕的代码中。 现在,作为一名优秀的工匠,我希望将代码保持在比我find的更好的状态。 如果我不重构devise,通常不能实现新function。 那么 – 他们可以,但这会使代码变得更糟。 不幸的是,这正是我所面对的难题。 我觉得如果有一件事很难,那就是重构糟糕的代码,特别是当你有最后期限的时候。 触及不好的和复杂的代码,或多或less的作品是可怕的。 因此,当我在代码中修改一个新function而不修改现有代码时,会引入更多混乱。 现在我的问题是我怎样才能学会处理不好的代码? 我怎样才能学会理解庞大的代码库,然后重构其中的一部分而不破坏那些已经工作并且没有超过最后期限的东西? 有什么文献可以推荐? 你有什么一般的秘诀吗?

你如何重构一个大杂乱的代码库?

我有一大堆的代码。 无可否认,我自己写的 – 一年前。 它没有很好的评论,但它也不是很复杂,所以我可以理解它 – 只是不足以知道从哪里开始重构它。 我违反了过去一年里我读过的每一条规则。 有多种职责,有间接访问(我忘记了这个词 – 就像foo.bar.doSomething() ),就像我说的那样,它没有很好的评论。 最重要的是,这是一个游戏的开始,所以graphics与数据,或者我尝试去耦graphics和数据的地方,我公开的数据,以便graphics能够访问数据它需要… 这是一个巨大的混乱! 我从哪说起呢? 你将如何开始这样的事情? 我目前的做法是采取variables并将其切换为私有,然后重构那些破碎的碎片,但这似乎还不够。 请build议其他策略,通过这混乱趟过,把它变成干净的东西,让我可以继续我离开的地方! 两天后更新:我一直在绘制出类似UML的图表,并一路捕捉到了一些“低悬的果实”。 我甚至发现了一些代码是新function的开始,但是当我试图减less一切,我已经能够删除这些位,并使项目更清洁。 在安装我的testing用例之前,我可能会尽可能地重构(当然,只有100%肯定不会影响function的东西),所以我不必重构testing用例,因为我改变function。 (你认为我是对的还是对的,在你看来,我会更容易把它搞砸,并且先写testing?) 请投票给最好的答案,以便我可以公平地标记! 随意添加你自己的答案,以及还有空间给你! 我会再给它一天左右,然后可能标记最高票数的答案被接受。 感谢到目前为止所有人的回应! 2010年6月25日:我发现了一篇博客文章 ,直接回答这个问题,这个人似乎对编程有很好的把握(或者,如果你阅读他的文章,也许不会):) 为此,当我需要重构代码时,我做了四件事情: 确定代码的目的是什么 绘制所涉及的类的UML和动作图 选购正确的devise模式 确定当前类和方法的更清晰的名称

如何更新旧的C代码?

我这周在工作上一直在做一些10年前的C代码,经过一些修改之后,我去找老板,问他是否需要做其他事情。 那是他放下炸弹的时候 我的下一个任务是通过7000左右的线路,了解更多的代码, 并在一定程度上模块化代码。 我问他如何将源代码模块化,他说开始把旧的C代码放到C ++类中。 作为一名优秀的员工,我点点头,回到桌前,现在坐在那里,想知道如何在世界上采取这些代码,并“模块化”它。 它已经在20个源文件中,每个都有自己的目的和function。 另外还有三个“主要”结构。 这些结构中的每一个都有30个以上的字段,其中许多是其他较小的结构。 这是一个完全混乱的尝试去理解,但是程序中的几乎每一个函数都会传递一个指向其中一个结构体的指针,并大量使用这个结构体。 有什么干净的方法让我把这个问题搞成课? 我决心要做到这一点,我只是不知道如何开始。

将C源代码转换为C ++

你会如何将相当大的(> 300K),相当成熟的C代码转换为C ++? CI所考虑的types被分割成大致对应于模块的文件(即,比典型的基于OO类的分解更小的粒度),使用内部链接来代替私人function和数据,以及用于公共function和数据的外部链接。 全局variables被广泛用于模块之间的通信。 有一个非常广泛的集成testing套件可用,但没有单位(即模块)级别的testing。 我想到一个总的策略: 在C ++的C子集中编译所有东西,并使其工作。 将模块转换为巨大的类,以便所有的交叉引用都以类名称作为范围,但将所有函数和数据作为静态成员,并使其工作。 通过适当的构造函数和初始化的交叉引用将巨大的类转换为实例; 用适当的间接访问replace静态成员访问; 并得到那个工作。 现在,将项目作为一个不适当的OO应用程序来处理,然后编写unit testing,在依赖关系易于处理的地方进行分解,然后将其分解成不同的类。 这里的目标是在每次转换时从一个工作程序转到另一个工作程序。 显然,这将是相当多的工作。 这种翻译有没有案例研究/战争故事? 替代策略? 其他有用的build议? 注1:该程序是一个编译器,可能数以百万计的其他程序依赖于其行为不变,所以批量重写几乎不是一个选项。 注2:来源近20岁,每年可能有30%的代码stream失(线路修改+增加/以前的总线)。 换句话说,它被大量维护和扩展。 因此,其中一个目标是提高可信度。 [为了这个问题,假定C ++的转换是强制性的,而把它留在C中不是一个选项。 增加这个条件的意思就是去掉“把它留在C中”的答案。]