Language agnostic 什么';数据和代码之间的区别是什么? 请举一个例子,考虑一个超市购物者可以得到的折扣。p>

Language agnostic 什么';数据和代码之间的区别是什么? 请举一个例子,考虑一个超市购物者可以得到的折扣。p>,language-agnostic,data-structures,oop,functional-programming,Language Agnostic,Data Structures,Oop,Functional Programming,我们可以以某种标准方式将这些规则定义为数据(合格项目列表、适用日期、优惠券代码),并编写通用代码来处理这些规则。或者,我们可以将每个代码都编写为一段代码,根据客户的购物清单检查适当的东西,并返回任何适用的折扣 您可以合理地将规则存储为对象、序列化为blob或存储在代码文件中,这样每个规则都可以在数据和代码之间选择自己的划分,以允许将来的规则不适合上面考虑的通用处理器类型 通常很容易批评混合数据的代码,通过if语句检查文件或数据库中应包含的6种不同内容,但是否有一条规则在边缘情况下有所帮助 或者这

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

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

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

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

为了澄清,根本的问题是:您将如何编写上述示例?有没有经验法则让你决定什么是数据,什么是代码


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

这一切都取决于需求。如果数据类似于查找数据,并且经常更改,那么您实际上不想在代码中进行更改,但是像星期几这样的事情不应该在未来200年左右进行更改,所以请编写代码


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

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


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

这是灵活性和效率之间的折衷。可执行数据(如XML规则)提供了更大的灵活性(有时),而将相同的数据/规则作为应用程序的一部分进行编码时,可以更高效地运行,但频繁地更改这些数据/规则会变得很麻烦。换句话说,可执行数据易于部署,但效率低下,反之亦然。因此,最终决定权在于你——软件设计师

如果我错了,请纠正我

在Lisp中,代码是数据,而 数据就是代码

在序言中,子句是术语,和术语 是条款


数据和代码(程序)之间的界限模糊。这最终只是一个术语的问题,例如,你可以说数据就是一切不是代码的东西。但是,正如您所写,它们可以愉快地混合在一起(尽管通常最好将它们分开)。

数据是由称为代码的指令处理的信息。我不确定我是否觉得OOD中存在模糊,仍然存在属性(数据)和方法(代码)。OO理论将两者封装为一个称为类的格式塔实体,但它们在类中仍然是离散的


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

这是一个相当哲学的问题(我喜欢),所以我将以哲学的方式回答它:没有什么东西可以支持它。

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

更准确地说:数据可以由两个部分来描述:对数据应该表示的内容的描述(例如,一个带有名称和类型的变量)和一个值。 变量的值可以根据代码中定义的规则进行更改。当然,描述不会改变,因为如果它改变了,我们就会得到一条全新的信息。 代码本身不会改变,除非需求(我们对系统的期望)改变


对于编译器(或VM),代码实际上是它执行操作的数据。但是,要编译的代码没有指定编译器的行为,编译器自己的代码会这样做。

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

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

此外,如果折扣代码被分割成一个XML文件,那么您可以将整个应用程序交给经理,只要有足够的说明,他们就不必在任何时候想要更改折扣率时纠缠您

当您混合使用数据和代码时,您