English 中文(简体)
避免硬编码价值的最佳做法
原标题:Best practices for avoiding hardcoded values IRL

从理论上讲,源代码不应包含超过0、1和空洞的硬编码值。 在实践中,我发现很难避免所有硬编码价值,而与此同时,交货时间十分紧凑,因此,我最后使用了其中一些价值,并感到有些有罪。

你们如何调和避免硬编码值与紧接交货时间?

最佳回答

在我看来,问题背后的假设似乎是无效的。

对大多数软件来说,配置文件很难改变这一来源代码。 对于广泛安装的软件来说,这很容易成为100万倍困难的一个因素:在用户设施上,许多文件可以轻而易举地对用户设施进行hang击,而你们对此了解甚少,没有控制。

在该软件中,数字字面与功能或算法字面没有区别:它只是源代码。 任何软件都有责任使这些价值正确。

否则,他们至少可以维持:姓名明确,组织良好。

如果你计划紧凑,那么你可能会被迫达成最后的妥协。

问题回答

避免难以编码

  • use configuration files (put your values in XML or ini-like text files).
  • use database table(s) to store your values.

当然,并非所有价值都有资格被移至集束手。 你们应使用方案拟定语言所提供的建筑,如(客户、论坛等)。

仅仅看到了使用“Constatn Interface”的答案。 充分尊重海报和选民,但不建议这样做。 你们可以更多地了解:

http://en.wikipedia.org/wiki/Constant_interface

这与规划无关,在大多数情况下,与配置档案一样简单,或可能是储存关键组合项目的数据库表。 我并不认为,你“行事”有硬性编码价值的任何理由,它不应再占用更多的时间,把紧凑的时间线卸到一个组合机制,以作为有效的借口。

硬编码价值观的问题是,有时特定法典依赖这些价值观,这并不令人迷惑。 例如,在java,有可能将所有固定装置移入单独的接口,并将特定固定装置分成内部的子接口。 它非常方便和明显。 而且,通过利用民主选举学会的设施(“有限使用”功能)以及改变或改造这些设施,便容易找到经常使用。

例如:

public interface IConstants {

    public interface URL {
        String ALL = "/**";
    }

    public interface REST_URL {
        String DEBUG = "/debug";
        String SYSTEM = "/system";
        String GENERATE = "/generate";
    }
} 

参照是人类可读的:IConstants.REST_URL.SYSTEM

大多数非母企业项目将具有某些核心概念或组合选择,这些概念已经考虑到从档案/数据库中排出选择。 在这些情况下,通常简单地(如工作不到5分钟)扩大这一范围,以支持你们所需要的新的适当机构。

如果你的项目没有,那么要么:

  • It could benefit from one - in which case write it, taking values from a flat .properties file to start with. This shouldn t take more than an hour, tops, and is reusable for any config stuff in future
  • Even that hour would be a waste - in which case, you can still hav a default value but allow this to be overridden by a system property. This require no infrastructure work and minimal time to implement in your class.

硬编码价值实际上没有任何借口——它只节省几分钟时间,如果你的项目期限用几分钟计算,那么你就会发现比如何规范可图性更大的问题。

诚然,在我目前的霍比项目中,我很难说出许多 st。 简编文件are<>/em>非常容易使用,但(至少是用强力和简单 par子座的Adhura),我只用两手来使用这些文件,因为我有99%相信,我永远不会改变这些档案——即使这一假设证明是假的,也很少能够以合理的努力加以重新评价。 然而,对于具有更大/更重要意义的分析,我从来不会打上<条码>if foo=“硬编码条”,而是将<条码>if foo = cfg.bar(例如,用更有意义的名称表示)。 Cfg 是一个全球单一州(即,我知道......),在启动时将文件编成正本,以后,一些信标价值的变化,你改变了配置文件,而不是来源。

有了动态/反面性的语言,你甚至不需要改变装饰面的那部分,如果你给它增加另一个价值的话,那么它就能够用all在档案中(或为此使用一个散列图)的条目,并且要这样做。

2 suggestions here: First, if you are working on embedded system using language like C. Simply work out a coding convention to use a #define for any string or constant. All the #define should be categorized in a .h file. That should be enough - not too complex but enough for maintainability. You don t need to mangle all the constant between the code line.

第二,如果你在申请时能够接触到行文。 数据库中保持所有不变值是简单不过的。 你需要一个非常简单的界面,以便检索。

有了简单的手法,这两种方法都可以推广,以支持多语言特征。





相关问题
XML-RPC Standard and XML Data Type

I was looking at XML-RPC for a project. And correct me if I m wrong, but it seems like XML-RPC has no XML datatype. Are you supposed to pass as a string? or something else? Am I missing something? ...

Is it exists any "rss hosting" with API for creating feeds

I am creating a desktop app that will create some reports. I want to export these reports as RSS or ATOM feeds. I can easily create feeds with Rome lib for Java. But I have no idea how to spread them. ...

Improving Q-Learning

I am currently using Q-Learning to try to teach a bot how to move in a room filled with walls/obstacles. It must start in any place in the room and get to the goal state(this might be, to the tile ...

High-traffic, Highly-secure web API, what language? [closed]

If you were planning on building a high-traffic, very secure site what language would you use? For example, if you were planning on say building an authorize.net-scale site, that had to handle tons ...

Def, Void, Function?

Recently, I ve been learning different programming langages, and come across many different names to initalize a function construct. For instance, ruby and python use the def keyword, and php and ...