代码之家  ›  专栏  ›  技术社区  ›  Phil H

数据和代码有什么区别?

  •  18
  • Phil H  · 技术社区  · 17 年前

    举个例子,考虑超市购物者可以享受的一组折扣。

    我们可以以某种标准方式将这些规则定义为数据(合格项目列表、适用日期、优惠券代码),并编写通用代码来处理这些规则。或者,我们可以将每个都编写为一段代码,根据客户的购物清单检查适当的东西,并返回任何适用的折扣。

    您可以合理地将规则存储为对象,序列化到Blobs中或存储在代码文件中,这样每个规则都可以在数据和代码之间选择自己的划分,以允许未来不适合上述通用处理器类型的规则。

    通过if语句检查文件或数据库中应包含的6个不同内容,通常很容易批评混合数据的代码,但在边缘情况下是否有规则可以帮助?

    或者这就是面向对象设计的重点,让我们不再担心数据和代码之间的界限?

    (注意:我知道,代码是可以编译的,但在动态语言和JIT编译的世界里,即使是这也是一个模糊的概念。)

    13 回复  |  直到 17 年前
        1
  •  10
  •   Michael Borgwardt    17 年前

    当然,在大多数情况下,糟糕的配置数据可能会像糟糕的代码一样彻底破坏发布,所以整件事在很大程度上是一种幻觉——实际上,无论是代码还是“配置数据”发生了变化,重要的是主系统和发生变化的部分之间的接口是狭窄的,并且定义明确,足以给你一个很好的机会,让做出改变的人理解他所做事情的所有后果。

    当它实际上只是配置了几个字符串和数字时,这已经比大多数人想象的要难了(我亲眼目睹了一个生产大型机系统崩溃,因为它的一个布尔值设置与它正在与之通信的另一个系统不同)。当你的“配置数据”包含复杂的逻辑时,几乎不可能实现。但情况不会因为你使用了设计糟糕的特设“规则配置”语言而不是“真实”代码而有所改善。

        2
  •  9
  •   Rik elirevach    11 年前

    数据是系统中可以更改的部分。代码定义行为;数据转换为新数据的方式。

    描述 数据应该表示什么(例如,一个有名称和类型的变量)和 . 变量的值可以根据代码中定义的规则进行更改。当然,描述不会改变,因为如果改变了,我们就会得到一条全新的信息。

        3
  •  2
  •   leppie    17 年前

    这一切都取决于要求。如果数据像查找数据一样经常变化,你真的不想在代码中这样做,但像一周中的某一天这样的事情在未来200年左右不应该发生变化,所以就这样编码吧。

    你可能会考虑改变你的话题,因为当我看到它时,我首先想到的是LISP关于代码与数据的古老讨论。幸运的是,Scheme中的代码和数据看起来是一样的,但就是这样,你永远不会意外地将代码与数据混合在一起,就像LISP中使用不卫生的宏一样。

        4
  •  2
  •   Lazarus    17 年前

    在选择的问题上,你想让你的代码变得多么灵活。在不重新处理源代码的情况下,包含常量值(如上所述使用if语句所做的事情)是不灵活的,而使用动态源数据则更灵活。这两种方法都错了吗?我想说,这真的取决于具体情况。正如Leppie所说,有些“数据”点是不变的,比如一周中的几天可以硬编码,但即使在那里,在某些情况下动态编码也可能是有利的。

        5
  •  1
  •   Anonymous    17 年前

    Prolog子句中有术语,术语

        6
  •  1
  •   Community Mohan Dere    9 年前

    重要的是,您希望将每次执行相同代码的部分(即应用折扣)与可能更改的代码部分(即要折扣的产品或折扣百分比等)分开

    这只是为了安全。如果折扣发生变化,您不必重写折扣代码,只需进入折扣存储库(DB、应用程序文件、xml文件,或您选择实现的任何文件),对数字进行小幅更改。

    leppie 说,你需要提取不断变化的部分,并将它们放在一个单独的地方。

        7
  •  1
  •   kirmas    7 年前

    巨大的差异。数据是给系统的,而代码是系统的一部分。

    错误的数据是毫无意义的:我们的代码===处理程序是好的,你放的东西不是系统的问题,而是你的意思。但若代码不好,系统也不好。

    举个例子,让我们考虑一些JSON,一些我写的糟糕的代码parser.js,以及一些好的V8。对于我的系统来说,糟糕的parser.js是一段代码,我的系统工作不正常。但对于谷歌系统来说,我糟糕的解析器是无法说明V8质量的数据。

    https://en.wikipedia.org/wiki/Systems_engineering

        8
  •  0
  •   eglasius    17 年前

    数据就是信息。这与你决定把它放在哪里无关,无论是db、配置文件、通过代码配置还是在类中。

        9
  •  0
  •   Joonas Pulakka    17 年前

    术语 -例如,你可以说数据就是一切非代码的东西。但是,正如你所写的,他们 愉快地混合在一起(尽管通常最好把它们分开)。

        10
  •  0
  •   Sandeep Datta    17 年前

    代码是任何可以执行的数据。现在,由于所有数据在某个时间点都被用作某个程序的输入,可以说这些数据是由程序执行的!因此,您的程序充当数据的虚拟机。因此,从理论上讲,数据和代码之间没有区别!

    最后,重要的是软件工程/开发考虑因素,如性能、效率等。例如,数据驱动程序可能不如具有硬编码(因此是脆弱的)条件语句的程序高效。因此,我选择将代码定义为任何可以高效执行的数据,而其他所有数据都是纯数据。

    如果我错了,请纠正我。

        11
  •  0
  •   lakshmanaraj    17 年前

    代码和数据之间的关系如下:

    编译成程序后的代码在执行时处理数据

    此外 程序可以提取代码、转换代码、加载代码、生成代码。..

    因此,没有编译或解释器的代码是无用的,数据总是有价值的。..,但编译后的代码可以完成上述所有活动。...

    源代码控制系统进程源代码

    这里的源代码本身就是一个代码

    备份脚本处理文件

        12
  •  0
  •   slim    17 年前

    例如,对于编译器来说,它使用的源代码和创建的目标代码都是数据,应该与编译器自己的代码分开。

    在你的例子中,你似乎在描述一个特别强大的配置文件的选项,其中可以包含代码。例如,GIMP允许您使用Scheme“配置”插件。作为读取此配置的组件的开发人员,您会将其视为数据。当在另一个级别工作时——编写配置——你会把它看作代码。

    这是一种非常强大的设计方式。

    将此应用于基本问题(“您将如何编写上述示例?”),一种选择可能是采用或设计一种高级领域特定语言(DSL)来指定规则。在启动时或首次需要时,服务器读取规则并执行它。

    提供管理员界面,允许管理员

    …所有这些都会在运行时发生。

    DSL可能像表解析器或XML解析器一样简单,也可能像脚本语言一样复杂。从C开始,很容易嵌入Python或Lua。从Java很容易嵌入Groovy或Clojure。

    您可以在运行时通过巧妙的链接或类加载器技巧切换编译后的代码。在我看来,这似乎比嵌入式DSL选项更困难,价值更低。

        13
  •  0
  •   yotam oron    11 年前

    这就是为什么,例如,Java的HashMap是数据——尽管它有很多代码、API方法和特定的实现(即

    推荐文章