zvo*_*kov 12 language-agnostic
- 编辑 -
我相信这是可能有多种答案(如其中一个有效的问题在这里).这不是讨论也不是民意调查.此外,这个问题显然不具争议性,因为到目前为止,没有一个受访者似乎互相争论.
- 原文 -
惊人!我现在做软件大约15年了,我仍然不知道我在做什么:)
说真的,我还在努力学习基础知识:
但最糟糕的是代码复杂性.我的代码往往变得邪恶.几周后它甚至会咬自己.我付出了巨大的努力来保持它简单,可读,可维护,优雅,美观,有凝聚力,松散耦合,基于非常直接的抽象.但所有这些努力都耗尽了!
不要误解我的意思,根据大多数人的标准,我的代码非常好.我的意思是它灵活,或多或少可单元测试,并做它需要做的事情.然而,它远非简单.
每一次变革都需要大量的重构.如果另一个人打开我的代码是为了添加一个功能,他就必须做一些愚蠢的事情.即使他是GENIUS,即使他是我自己的不熟悉代码库的CLONE,他也无法做到这一点.为什么,为什么上帝的缘故呢?是不是有一些方法论,一些技术,一些冥想技巧,什么都没有?!
如何保持我的代码简单?
Spo*_*ike 12
正如@neodymium以犀利的方式指出,不要让你的算法驱动代码.为了举例说明你在一周前写的C#中的以下悲伤装置:
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);
}
Run Code Online (Sandbox Code Playgroud)
通过查看代码可能需要一段时间才能找到您所编写的内容.但最后你还记得这个方法在字符串数组中查找"Needle".你惊叹于你的算法是多么巧妙,但是对你花了一两分钟才意识到它在做什么的事实感到烦恼.
你的第一直觉可能是写评论来帮助你的工作伙伴,但停止正确!评论只不过是道歉.相反,让我们在代码中清楚自己...... 清晰明了.
为了做到这一点,试着想想你以前从未见过自己的代码.通过对自己说话来强迫它:"这是什么"和"为什么会这样".然后我们将开始重构这个东西.我们可以做的第一个简单的重构是将方法重命名为更合适的方法.怎么样:
public void FindNeedle(string[] strArr) { … }
Run Code Online (Sandbox Code Playgroud)
我们还能做什么?我们可以:
strArr为更合适的东西,比如haystack.bool并更改方法,以便在找到针时返回.Console.WriteLine(…)方法的一部分移出此方法的上下文,以便调用代码可以这样做:if ( FindNeedle(myArray) ) WriteFoundNeedle();foreach而不是for.代码最终可能如下(您的milage可能会有所不同):
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!");
}
Run Code Online (Sandbox Code Playgroud)
为了使您的代码更清晰,易懂和可读,可以做很多事情,这可以通过重构代码来实现.尽可能小的步骤进行重构.就像移动或封装逻辑一样,将它们命名为更符合逻辑和可读性的东西.像一个冗长而复杂的if语句那样简单:
if ( strArr[pos - 1].Equals("do") && strArr[pos + 1].Equals("then") )
Run Code Online (Sandbox Code Playgroud)
...通过将逻辑语句移动到自己的方法中,可以将其重构为更简单的东西:
if ( CurrentIsSurroundedByDoThen(strArr, pos) )
Run Code Online (Sandbox Code Playgroud)
有很多方法可以重构.我建议您阅读其中的一些内容,Martin Fowler已经写了一本关于它的书,但也有一个包含代码示例和/或类图的在线目录.选择你应该做什么或不做什么重构必须在假设它会使你的代码比以前更易于维护的情况下决定.
此外,如果您通过以正确的方式编写单元测试来开始您的项目,那么重构将变得更加自然.重构越多,代码就越清晰.
我感觉到你的痛苦,伙计.复杂系统中简化的斗争是软件工程的斗争.如果你已经钉了它,你可能没有做足够严重的工程问题.而艰难并不总是意味着复杂,它可能是"明天实施x以防止天空掉落".
为简单起见...... TDD彻底提到,完全同意.TDD是一种将代码集中在它需要做的事情上的技巧,而不是更多.经常提到的重新考虑因素.完全同意.
简单性与复杂性和单独工作......不能单独使用运输代码.每次办理登机手续都会获得代码评论,并鼓励代码审核人员为您提供煤炭.这将使您保持正确的妥协和平衡.每天至少与某人谈论您的代码一次.轮流审稿人.我的工作更清晰,对队友来说更好.不关心它们是多么绿.实际上,越绿越好,确保清晰的代码.
单独工作......独自工作在研发方面占有一席之地,而非代码.充其量,单独的牛仔项目会让很酷的东西变得难以维持.单独完成的工作总是需要一个月或两个时间来重新实现并重新考虑由凡人维护的代码并修复一些巨大的疏忽.如果在您运送牛仔代码后的那个月或两个月内,您真的很痛苦.
编辑:在细节方面,我发现有关Domain Drive Design的各种书籍非常有助于提供创建超清代码的方法.DDD不适用于所有问题.
如果你确实找到了简单和过度工程之间平衡的答案......好吧,我甚至不知道该怎么做.我想我会感到无聊并找到另一项工作.