Oop 什么是“场”?“字段”与“字段值”

Oop 什么是“场”?“字段”与“字段值”,oop,Oop,在passport中有一个字段:First Name,该字段有一个值John 我断言,以下描述这种关系是正确的: 字段名: 他有一个名字。 具有一组有效值,例如由正则表达式[a-Za-z.]{1,30}定义 具有一个描述名称,该名称位于此人全名的第一位 Passport是一组成对的字段:字段值,这样: passport有一个字段名 passport具有字段名的值 这里的要点是,这样说是不正确的: 名字值是约翰 从概念上/学术上来说,正确的方法是: passport字段“First Name”的值

在passport中有一个字段:First Name,该字段有一个值John

我断言,以下描述这种关系是正确的:

字段名:

他有一个名字。 具有一组有效值,例如由正则表达式[a-Za-z.]{1,30}定义 具有一个描述名称,该名称位于此人全名的第一位 Passport是一组成对的字段:字段值,这样:

passport有一个字段名 passport具有字段名的值 这里的要点是,这样说是不正确的: 名字值是约翰

从概念上/学术上来说,正确的方法是: passport字段“First Name”的值为“John”

实际上,它意味着伪C:

struct Passport {
    Map<Field, object> fieldValues;
}

struct Field {
    string Name;
    string Description; 
    bool IsValidValue(object value);
}

问:这有意义吗?有什么想法吗?

这是非常主观的,完全是上下文敏感的,而且似乎是一件愚蠢的事情,需要挑剔


不管正确与否,如果我和同事讨论passport,如果每次我说名字是“john”,并告诉我说它是passport的名字字段是“john”,他们都会纠正我,我会向他们扔东西。你会觉得很烦人。

不。至少在OOP中,字段有责任保留值。尽管对象负责确保值与其他字段或对象的约束一致,但实际包含的值是字段的工作

以您的例子:

字段名:

他有一个名字。 具有int、string和object类型 具有可选的描述 有价值 Passport是一组字段:

可以在模型定义的字段上定义约束,以确保值和对象的整体状态有效
如果您要对这样的事情建模,那么您可以看看java或c的反射API。这和你描述的很相似。类有一组字段,字段有名称、类型和其他属性,而不是值。对象是类的实例,您可以向对象请求指定字段的值。同一类的不同对象具有相同字段的值,因此可以说它们共享字段。所以,如果您试图对基于类的OOP进行建模,那么您可能是对的

然而,这并不是执行OOP的唯一方法。有一种基于原型的OOP,它看起来不同,因为没有类,只有对象,所以对象包含带有值的字段,所以如果您说对象包含字段,而字段有值,则没有太大区别

那么这个问题的答案有意义吗?我认为是的,因为类似的东西在反射中被广泛使用。如果它是对的或错的-取决于你的需要

UPD:关于value=Passport[Field]与value=Passport.Field.value 我想再介绍一本护照来说明这一点/

firstNameField = PassportClass.Fields["FirstName"]
myName   =   myPassport[firstNameField]
yourName = yourPassport[firstNameField]
假设两个passport都有相同的字段,这是有意义的。拥有不同领域的不同护照可能会有一种感觉,只是感觉不同而已。

嗯..在c语言中不是这样

在C语言中,passport是一个类,所以说

Passport有一个字段名 对于特定实例,FirstName值为John。 这里第一个子句描述类,下一个子句描述对象。在ruby这样的面向对象语言中,我认为说passport在字段“First Name”中有一个值“John”是等价的,你只是描述了两个对象——passport原型和它在同一句话中的实例


不过我自己也很困惑。这个问题的措辞很奇怪,因为毫无疑问,passport不仅仅是它的字段,例如一个长期存在的持久身份。

passport由多个字段组成?这不完全是一个革命性的概念。为什么要用不同的词重新命名实体属性值模型。改变术语有什么原因吗?我不知道EAV,这回答了我的问题。我看到这个系统,它是一个字段本身,有一个值。这不合理,这也不合理。它确实如此,只是与众所周知的基于类的OOP不同。想想你们的实体定义很弱的系统,比如我的护照可能有名字,你们的护照可能有NumberOfChildren,其他人的护照可能有地址。并没有一个统一的地方像类一样存储所有字段。因此,您可以将Passport建模为列表对;并像对[0]一样使用它。名称,对[0]。描述,对[0]。值仍然有意义,只是不同的一个字段具有值意味着每个passport都有不同的字段。你可能出于某些原因想要它,比如你想在你的护照中将名字改为名字,这不应该影响我的名字。所以我想说,一般来说,没有对与错的决定,有基于你目标的对与错的决定。如果你想打网球,足球是没有意义的。关键不是说要正确,问题是它应该如何建模;我
Evalue=Passport[Field]vs value=Passport.Field.value你可以这么问。你们的问题似乎是语义学的问题。我想说,在基于类的OOP中,字段属于类,并没有值。当您查看c或java中的反射时,情况就是这样——类具有字段,字段具有类型、名称等,并且您可以从对象获取字段的值。在课堂上声明一次字段。您有许多具有相同字段但不同值的对象。在您的情况下,您的passport和我的passport中的字段是不同的,因为它们保留不同的值,对吗?所以,当政府决定将名字重命名为名字时,有一百万个对象需要重命名。在你的情况下,两个不同的护照是完全不同的,不是吗?因为它们只有一组字段,没有任何共同点。在最初的问题中,至少它们共享相同的字段,并且有不同的值。也许我应该编写一个对象,它有一组固定的值。或者我可能把对象和类搞糊涂了。我会仔细考虑..对象可能有保留值的字段,但它不是众所周知的基于类的OOP。这更像我们在javascript中所做的,在javascript中根本没有类,只有对象。