gpt4 book ai didi

objective-c - 在 REST Api 中建模对象继承

转载 作者:太空狗 更新时间:2023-10-30 03:54:07 25 4
gpt4 key购买 nike

问题

我有一个应用程序,它有一个 User 对象和一个 Student 对象。 一些用户是学生。所有学生都是用户。在数据库(基于 django-ORM)中,这表示为一个 Student 表,其中有一个指向 User 表的外键。

我正在尝试创建一个 REST API,并在 iOS 应用程序中创建一个对象层次结构来模拟此 API。我无法决定如何对此建模。

当前的解决方案

我想出的最好的办法是:在 iOS 中有一个 User 模型,在 iOS 中有一个 Student 模型继承自 User 并用更多属性扩展它。然后,有一个方法从服务器接收 JSON 响应,并根据词典创建 UserStudent 模型。

最后,服务器需要始终给我最具体的类型。也就是说,当我登录到服务器时,它会判断我是学生还是普通用户,然后返回给我正确的词典。

这是最好的方法吗?

这听起来有点复杂。但是我想到的任何其他方式对其进行建模,例如改变数据库的布局方式,给了我一个数据库不知道所有约束的设计。例如,Student 对象可以拥有其他对象(例如,homework_paper)。我可以使用指向 User 对象而不是 Student 对象的外键对其进行建模,并说 Student 只是用户。但随后数据库不会强制执行 homework_paper 必须由学生拥有的事实。

有没有更好的方法来解决我所缺少的这个问题?

最佳答案

没有任何内容表明您的 UI 层中的类需要与您的域类进行一对一匹配。就像您的域类不必完全遵循您的数据库表一样。

您可以将 UI 层的类(您的 UI 表示)视为一组不同的类。使 UI 工作所需的类,或者需要使用框架来发挥你的优势,而不损害域模型和/或数据库设计中的业务规则。

您的用户 UI 类很可能是一个包含用户域类和学生域类的类。它将了解用户和学生域类。然后由这个包装类来实例化用户或学生。

另一种方法是将用户-学生关系建模为“有一个”关系而不是“是一个”。毕竟,当用户不仅可以是学生,还可以是教师时,您要做什么。例如,当一位老师注册了他教授的类(class)以外的其他类(class)时。通常,这些类型的关系最好使用角色建模,而不是"is"关系。有关 Dealing with Roles 的更多信息,请参阅 Martin Fowler。

在任何情况下,User UI 类将是您在 REST 实现中表示的基础,并根据它是处理用户还是学生,或者 - 在基于角色的方法中 - 填充该表示中的额外部分与学生相关的用户:

{
"user": "/users/1234",
"name": "Some non student's name",
"stats": {
...
}
},
{
"user": "/users/4567",
"name": "Some Student's name",
"stats": {
...
}
"papers": [
{ "paperid": "/users/papers/111"
...
},
{ "paperid": "/users/papers/222"
...
},
{ "paperid": "/users/papers/333"
...
}
]
}

根据评论进行编辑

无论如何,服务器必须在某个级别做出决定,除非您想让您的 UI 在 URI 级别区分用户和学生。我建议反对。它导致无法使用的用户界面。用户对实现细节不感兴趣,不想面对它们。

但不,如果不需要

充分利用多态性。

服务器可以很好地利用多态性,从它的数据访问框架为它通过 id 检索的任何用户接收一个学生实例。毕竟学生总是可以被称为用户。因此服务器可以简单地忽略它从数据访问框架获得的用户引用可能是学生这一事实。当服务器实际需要做/添加特定学生的东西时,它应该在派生类中这样做。

无需为此在任何地方使用 if 语句。甚至在 UI 类中也不行。 UI 只需要知道它收到的 User 引用也可以是 Student 并采取相应的行动。最好不是通过 if User is Student(这会将 UI 方式与类层次结构深度联系起来),而是通过 if IUser implements IStudent:询问用户引用是否还实现了 Student 接口(interface),然后获取并使用该 IStudent 接口(interface)引用。

关于objective-c - 在 REST Api 中建模对象继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13190797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com