代码之家  ›  专栏  ›  技术社区  ›  Ritwik Bose

在完成之前,我要重写我的代码大约10次。这是错的吗?

  •  8
  • Ritwik Bose  · 技术社区  · 15 年前

    当我开始写一些复杂的东西时,我发现在我最终得到我想要的东西之前,要重新开始写10次,通常会丢弃数百行代码。

    我是在做错事,还是其他人有这样的工作流程?

    编辑:现在,我正在开发一个模块化编译器。我正在做的最后一个项目是Java中的服务器。在此之前,它是一些并发的东西。

    我做了一点计划,在我得到所有东西的接口之前,我从来没有开始编码。

    考虑到这一点,反复擦拭石板是否正常?

    13 回复  |  直到 14 年前
        1
  •  7
  •   Paul Sasik    15 年前

    丢弃许多行代码通常是重构的一个积极方面。那太好了。但是,从10次开始可能意味着你还没有分析过你的问题和解决方案。可以回溯,有时重新开始,但不是经常这样。您应该以这样的方式安排代码:当您回溯和重构时,您将保留所创建的大部分内容,因为它将以很好的隔离和逻辑块的形式存在。(使用模糊语言,因为没有指定所选语言。)

    作者评论:

    通常我重新启动是因为我 被里面发生的事情弄糊涂了 我的代码。

    学习您的技巧,并充分利用设计模式和其他最好的编程哲学,以便为您的代码提供一个定义良好的结构…这是一个你能识别的东西,在路上的几个月甚至几天。

        2
  •  6
  •   pavium    15 年前

    如果你开始做一些复杂的事情,一点计划 之前 你开始写作似乎是个好主意。

    设计 第一。

        3
  •  4
  •   ZoogieZork    15 年前

    完全正常。不管我有多大的计划,我经常会有一个“啊哈!”当手碰到键盘的时候。

    就像经常说的“我到底在想什么?”时刻。

    一切都很好。您正在生成更好的代码。

        4
  •  2
  •   Kornel Kisielewicz    15 年前

    然而,这里的所有建议都是有效的,请记住,在程序生命周期中有一个“足够好”的时刻。很容易陷入一个永不结束重构的陷阱,因为您看到“是的,这可以做得更好!”好吧,面对现实——除非你的程序只有几行代码,否则总会有更好的方法。

    我相信有一些快乐的程序员不会因此而受苦,但至少我需要不断提醒自己,有一条线被称为“足够好”。

    如果你在为别人编写代码,那就更为正确了——没有人会注意到你做了一些“更好”的事情,但最重要的是“它能很好地工作吗?”.

    另外,一个非常好的实践至少是在重写之前让它工作。然后,您可以返回到以前的有效解决方案。

    (12年来,我一直在重写我正在写的一个游戏,而我离游戏的结局还差得很远…)

        5
  •  1
  •   Luke Schafer    15 年前

    在一个复杂的问题上,这是很常见的。如果你不是完全在暗中捅刀子,那么先勾画出我们的想法真的很有帮助,但是你又把“重试”从代码转移到了纸上。

    如果它能帮助你找到一个好的解决方案,那怎么可能是错误的呢?

        6
  •  1
  •   Jonathan Leffler    15 年前

    这取决于我对问题空间的了解程度。如果这是一个熟悉的领域,那么如果它需要10次迭代,我会很担心。如果这是一个不熟悉的领域,那么它可能需要10次迭代,但至少其中一些迭代会在被丢弃之前被简化为原型——或者尝试原型。

        7
  •  1
  •   GrayWizardx    15 年前

    如果您在每次迭代中都学到了一些东西,那么可能没有问题。最后期限和类似的烦人的事情可能会让你的生活变得更困难。:)

    当我处理一个新问题时,我喜欢在实际函数处理程序的注释中对其进行伪代码,作为为我的TDD生成存根的一部分。然后将代码添加到我在函数体注释中所做的每个步骤中。

    这有助于我集中精力解决我正在解决的问题,而不是过早地迷失在细节中。

        8
  •  1
  •   zombat    15 年前

    你能做的最大的改变就是 规划你的代码 第一。在纸上。

    你的计划不需要非常深入(尽管有时也很好)。只需简单地勾画出一个你想要你的程序做什么的大致想法。记下关键功能点。 “我要它做这个,这个和这个” .

    一旦你有了这个,就画出一个粗略的设计。类、方法、函数、对象。给它一点形式。对设计的各个部分做一个粗略的功能分配。

    根据项目的性质,我可能会采用这样的粗略设计,并将其转化为更详细的设计。如果这是一个小项目,也许不是。但不管计划的复杂性如何, 花在设计上的时间 将用更好的代码和更少的编码时间奖励您。如果有明显的错误需要重构程序的大部分,那么它们在初始设计中应该很明显,您可以对其进行调整。你不会因为一个明显的错误而浪费数百行代码。

        9
  •  1
  •   tgiphil    15 年前

    编译器是非常复杂的应用程序,你不能一次完成一个优化编译器的编写——不管你起初有多考虑。通常,您尝试从一开始就让某个东西正常工作,然后返回模块化,并添加诸如优化之类的新功能。这个过程意味着大量的重构和彻底替换整个部分。这也是学习过程的一部分-因为没有人能了解和记住一切!

    (作为mosa项目的一部分,我还在开发.NET编译器——www.mosa-projet.org。)

        10
  •  1
  •   leora Matt Lacey    15 年前

    在纸上解决你的问题。…别急着打字。

        11
  •  1
  •   Drew Hoskins    15 年前

    有两种情况。(1)我已经能够自信地提前计划并孤立我的抽象。(2)我没有。

    对于(1),一种有效的技术是放入某些类或函数的虚拟版本,以驱动代码的其余部分。(或者相反,编写所说的类和函数,并用测试脚本驱动它们。)这只允许您处理每个过程中复杂性的一部分。

    尽管每个人都说人们应该提前计划,但通常情况下计划并不是这样做的,从而导致情况(2)。在这里,请注意在一次代码迭代中管理您试图完成的工作。一旦你发现你的大脑无法处理你正在做的所有事情,在下一次编译和测试之前,缩小你对你想要实现的目标的野心。允许您的代码有缺陷,但在第一次通过时很容易编写,然后通过重构进行开发。这比反复擦拭石板提高了效率。

    例如,我陷入混乱的一种方法是在我真正了解代码的形状之前,过早地嗅出普通代码并重构为子例程。从那以后,我就开始允许自己在第一次传递时复制代码,然后返回并将其分解为子例程。它起了巨大的作用。

        12
  •  1
  •   Leo Jweda    15 年前

    它被称为重构伙伴,这很好,你只需要限制它,这样你就不会浪费你所有的时间重构你拥有的代码,而不是写新的代码。

    必须重构的一些原因是:

    • 提高性能。
    • 组织代码。
    • 您需要以不同的方式编写代码,以使某些功能正常工作。
    • 以不同的方式做一些事情,因为这样可以节省大量的工作(例如:使用MXML而不是ActionScript)。
    • 变量的名称不正确。
        13
  •  0
  •   Tyler Smith    15 年前

    考虑用你使用的任何语言(或任何语言)学习一些框架。

    我认为学习框架使我的代码提高了一百万倍。通过学习框架(更重要的是它们是如何工作的),我不仅学到了设计模式,还学到了如何实际地实现它们。

    考虑一下Rails、Cakephp或Django(假设您使用的是脚本语言;我不知道任何桌面语言框架)。对不起!)然后看看它们是如何组合在一起的。