Language agnostic 如何保持我的代码简单?
--编辑-- 我相信这是一个有效的问题,可能有多个答案(定义)。这既不是讨论,也不是投票。此外,这个问题显然不是争论性的,因为到目前为止,没有一个被调查者彼此争论 --原文-- 太棒了!我做软件已经15年了,但我仍然不知道我在做什么:) 说真的,我仍在为一些基本问题而挣扎:Language agnostic 如何保持我的代码简单?,language-agnostic,Language Agnostic,--编辑-- 我相信这是一个有效的问题,可能有多个答案(定义)。这既不是讨论,也不是投票。此外,这个问题显然不是争论性的,因为到目前为止,没有一个被调查者彼此争论 --原文-- 太棒了!我做软件已经15年了,但我仍然不知道我在做什么:) 说真的,我仍在为一些基本问题而挣扎: 过度工程vs.雅格尼 为了赶上最后期限而偷工减料,而不是拖延业务 冒险的创新与乏味的老东西 享受独自工作的自由与团队的力量 但最糟糕的是代码复杂性。我的代码往往变得邪恶。几周后它甚至咬了我自己。我花了巨大的努力使它简单、
- 过度工程vs.雅格尼
- 为了赶上最后期限而偷工减料,而不是拖延业务
- 冒险的创新与乏味的老东西
- 享受独自工作的自由与团队的力量
如何使我的代码保持简单?或多或少的单元可测试性意味着它不是单元可测试的。:) 如果你不能很容易地编写一个测试,而不需要做大量的准备工作或设置工作,那么在我看来,这似乎是一个问题,应该需要重构 我尝试遵循三个原则: 让它工作 做对 快点 首先是让它工作,主要是单元可测试的。:) 然后我重构并改进单元测试,完成它们。这是您应该进入的下一步,因为听起来您可能忽略了这个概念。此外,尝试删除任何硬编码的值以使其更灵活。将它们放在xml文件、数据库或一些公共文件中作为常量 然后,我分析并优化瓶颈 您可能希望了解xetreme编程(XP),了解仅实现所需功能的概念,而不是尝试实现您认为所需的功能。它应该简化代码 如何使代码保持简单 使用代码实现正确的算法
不要让您的算法编写代码。我认为这是一个常见问题。我们都试图创建优雅的代码和干净的代码,有时我们最终会做得又快又脏,因为我们承受着压力,时间和预算不是无限的 我试着跟着干和吻。“不要重复你自己”和“保持简单愚蠢”。我也遵循“一件事”规则。一个方法、类、命名空间应该只做一件事 老实说,我试着从测试驱动开发的角度来做一个项目,我发现很难进入那种思维定势,比如红色、绿色、重构,但这确实有助于打破旧习惯 我一直是紧耦合的受害者,不得不把东西撕成自己的组件,这很残酷,破坏了应用程序,但你可能会被追上 我同意,这确实是一个模糊的问题,社区维基
p、 我不相信有什么东西比我想象的要多或少,它要么是
是,要么是不是,我想:在你的计划中安排时间进行重构。将重构作为交付需求的一部分,而不仅仅是事后考虑
这将是基于希望交付一个更易于维护、可重用的产品,这样未来的it开发人员就不会惊慌失措,不得不进行黑客攻击
我真的认为答案是让重构成为你生活中更重要的一部分,并对其进行严格的训练。(我也需要这样做!类似的问题……我想我们大多数人都在这条船上。)经常重构
这是我发现的使代码变得简单的唯一可靠方法。有时候,如果不先开始编写代码,你就无法摆脱复杂性。我通常在编写代码时会记住这句话
奥卡姆剃须刀最简单的(解释|解决方案)通常是最好的
我建议你发布一些代码,征求批评和意见。你可以从别人那里学到很多东西。试试看:)对我来说,测试驱动开发带来了所有的不同。当我在没有测试的情况下编写代码时,我会想到太多的场景,担心代码是否能工作,编写大量额外的东西以确保它能工作,等等
当我做TDD时,代码变得非常简单,因为测试让我编写了正确的代码,我没有那么防御性,但我相信它满足所有要求,因为测试通过了
我发现另一件有帮助的事情是检查开源项目的代码。他们中的许多人都有代码,其他人很容易理解和修改,因此它很好地洞察了如何实现这一点。在这方面,我最喜欢的是JMock。您可以尝试频繁运行复杂性度量,确定复杂性的上限,并在超过该上限时进行重构。复杂性度量是客观的。它们为您提供了一种量化软件复杂程度的方法和一种衡量进度的方法。也许你在为非常好的代码自责。或者,您认为简单的代码在复杂性度量上得分很高
我知道这些指标很粗糙。真正重要的是对复杂性的主观心理体验,而不是
public void DoArray(string[] strArr) {
string s = null;
for(int i = 0; i < strArr.Length; i++)
{
if(strArr[i].Equals("Needle"))
s = strArr[i];
}
if(s != null)
Console.WriteLine("I've found " + s);
}
public void FindNeedle(string[] strArr) { … }
public bool HasNeedle(string[] haystack) {
foreach(string straw in haystack)
{
if(straw.Equals("Needle"))
return true;
}
return false;
}
// Is called by the following:
if ( HasNeedle(strArr) )
{
Console.WriteLine("I've found the needle!");
}
if ( strArr[pos - 1].Equals("do") && strArr[pos + 1].Equals("then") )
if ( CurrentIsSurroundedByDoThen(strArr, pos) )
if ( (platform.toUpperCase().indexOf("MAC") > -1) &&
(browser.toUpperCase().indexOf("IE") > -1) &&
wasInitialized() && resize > 0 )
{
// do something
}
final boolean isMacOs = platform.toUpperCase().indexOf("MAC") > -1;
final boolean isIEBrowser = browser.toUpperCase().indexOf("IE") > -1;
final boolean wasResized = resize > 0;
if (isMacOs && isIEBrowser && wasInitialized() && wasResized)
{
// do something
}