【问题标题】:Hard coding vs Generic coding : Where to draw the line?硬编码与通用编码:在哪里划清界限?
【发布时间】:2009-03-15 22:22:08
【问题描述】:

我不完全确定如何措辞,但我会尝试。

假设您在程序的某些部分中有一些设置,您 80% 确信您将永远不必再次修改。你怎么知道在可变代码上画线?您知道将设置一直保存到用户定义的 XML 文件是多余的。但是,您也知道,稍后可能需要更改这些设置的可能性为 20%,因此在橡胶与道路相遇的地方对其进行编码也不是最佳选择。

我想我想问的是,你应该让你的程序容易改变抽象树多远?

其中一个例子是手动为网站编写 HTML 代码与让程序自动生成它。直接编写 HTML 代码不会花费太多时间。编写一个程序来自动生成 HTML 代码需要更长的时间。

【问题讨论】:

    标签: generics abstraction


    【解决方案1】:

    这是一个很好的问题,但没有绝对的答案:

    正如爱因斯坦所说:

    让事情尽可能简单,但不要简单。

    简单是相对的。对设计中抽象层的数量做出最佳决策是伟大架构师的伟大之处。一个好的架构师应该总是评估特定的情况并做出最好的权衡。没有灵丹妙药。

    【讨论】:

      【解决方案2】:

      我会试一试,我的理念如下:

      1 - 保留一个配置文件和解析器类/函数,这些配置文件和解析器类/函数尽可能简单,让您高枕无忧,无论何时需要它,您都可以得到它,而无需实例化一个可笑的过度膨胀的 XML处理配置文件解析器。我的配置文件如下所示:

      DBHostname -> XX.XX.XXX.XX
      DBUsername -> foomonger
      DBName -> fooDb
      DBPassword -> xxxxx
      ImageUploadsDir -> /uploads/images/
      ...
      

      我使用我的白痴朋友 ConfigHelper 生成的静态辅助方法(小型应用程序)或单例实例(大型 MVC 驱动的应用程序)从中提取我需要的东西,他太笨了,他不知道如何生成开销。

      在我的平均工作日中,我遇到过几次这样的困境:我应该把它放在 config.txt 中还是应该让它成为一个类常量?我的回答是我只是不知道——直到很久以后。如果事实证明需要将其放入配置文件中,那么没有什么能比一个像样的 IDE 更好的了,它具有稳定的“在项目中查找和替换”实现以更改引用。

      3 - 当开发涉及测试服务器然后部署到生产时,配置文件消除了应用程序部署的噩梦 - 没有真正实用的替代方案。在我理解的世界中,不同机器上的不同数据库实例具有不同的 IP。

      其中一个例子是手动为网站编写 HTML 代码与让程序自动生成它

      这是真的。虽然我们作为开发人员喜欢构建机器,但我们往往会浪费大量时间来构建机器来构建我们最初打算构建的机器。虽然这可能非常令人满意,但根据经验,我可以大胆地说,在大多数情况下,您拥有的机器越多,您必须支持的系统就越多,故障点越多,您的手就越多从企业主那里得到 - 这并不好玩。此外,您往往会遇到中间 HTML 生成器无法生成所需输出的情况。那么你会做什么,浪费时间修复生成器中的错误,浪费时间设计一个巫毒解决方法,或者只是手写 HTML?这确实取决于具体情况,但我更喜欢后者。

      有点啰嗦,但希望它能帮助回答你的问题,至少是一点点。

      【讨论】:

      • .NET 的众多优势之一是一致且干净的配置方法。一种定义具有强类型属性的强类型配置类。这些直接映射到 XML 配置文件,因此不涉及解析并且验证是固有的。
      • 你的最后一段非常非常真实。我的职业不是程序员,更多的是爱好。但是,我已经为我的工作场所编写了一个非常动态的 HTML 页面/应用程序,它可以根据用户的选择实时构建大量的 DOM 内容。维护它是一场巨大的噩梦,由于我仅限于 IE6 而变得更糟。你好调试,当我打破工具包时。当有人发明了我一开始没有想到的功能时,我曾多少次努力让工具包产生所需的输出。上帝帮助我。
      【解决方案3】:

      在过去的四年里,这只老狗学会了 TDD 的新把戏。即使我没有时间做“真正的”TDD,我也会假装我做。

      所以我总是编写重复的代码。没关系,因为我之后总是重构它。这是编写代码过程的一部分,而不是稍后再做的事情。由于我遵循了 TDD 并且只编写了必要的最少代码,并且由于我有自动化测试证明该代码有效,因此如果我发现重复,我可以放心地重构它,因为我知道我会再次运行我的测试在重构期间和之后。这将再次证明我没有破坏任何东西。

      这样,我不会推测代码是否会被重用——我从不重构,直到它被重用。由于它是根据实例的需要在每个实例中创建的,因此我知道代码的调用者并没有因为使代码通用的愿望而扭曲。调用者,包括单元测试,都是为了满足他们的直接需求而编写的。单独的重构过程可以处理更广泛的不重复代码的需求。

      【讨论】:

      • 如果您编写了重复的代码,但在重构之前不签入,您是否重复了代码? (哲学的)
      【解决方案4】:

      两点:

      • 所有常量都应该是通用的,也就是说,永远不要在未将幻数放入描述性常量的情况下硬编码幻数。
      • 实现您实际需要的最低要求 - 对其进行硬编码,直到您将要多次复制硬编码代码 - 在这种情况下,您应该开始使代码通用化。 (测试驱动开发在这里很棒)。

      【讨论】:

        【解决方案5】:

        您的问题是针对实际代码设计的,而不是将变量放在配置文件中还是常量中。我同意关于这些方面的其他答案。

        但是关于是否写通用代码……

        根据我的经验,如果您专门编写代码来处理手头的任务,您只会发现自己在将来的某个时候编写类似的代码。好吧,如果你真的只做一次任务,没关系。但我发现大多数时候情况并非如此。

        如果您发现自己重复了一项任务,那么您应该退后一步,考虑如何以一般方式将其自动化。

        还要检查是否有人尚未这样做。如果他们没有,请考虑发布您的代码,无论它多么小或多么粗糙。有人可能会免费为您改进它。

        【讨论】:

          【解决方案6】:

          80% ?硬编码还不够好,把它放到配置文件中。

          100% ?一个常数就可以了。

          【讨论】:

            猜你喜欢
            • 2010-09-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-09-29
            • 2015-10-03
            相关资源
            最近更新 更多