- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前在使用REST API的Python应用程序(使用Twisted)中遇到一个“体系结构”问题,我正在寻找反馈。
警告 !长篇文章!
让我们假设以下对象层次结构:
class Device(object):
def __init__():
self._driver=Driver()
self._status=Status()
self._tasks=TaskManager()
def __getattr__(self, attr_name):
if hasattr(self._tasks, attr_name):
return getattr(self._tasks, attr_name)
else:
raise AttributeError(attr_name)
class Driver(object):
def __init__(self):
self._status=DriverStatus()
def connect(self):
"""some code here"""
def disconnect(self):
"""some code here"""
class DriverStatus(object):
def __init__(self):
self._isConnected=False
self._isPluggedIn=False
最佳答案
规则1. REST与对象有关。不是方法。
REST“资源”变得过于分散
假。总是错误的。 REST资源是独立的。它们不能太“分散”。
我现在不仅拥有设备资源,还拥有所有这些资源:
设备DeviceStatus驱动程序DriverStatus
虽然这些都说得通
从[RESTful]的角度来看,有很多子对象是正常的
每个映射到单独的python类的资源?
实际上,它们没有任何意义。因此,您的问题。
设备是一回事。 / rest / environments / {id} / devices / {deviceId}
它具有状态。您应该考虑将状态和设备信息一起提供为描述设备的单个复合文档。
仅仅因为您的关系数据库已被规范化并不意味着您的RESTful对象就需要与数据库一样精确地进行规范化。尽管它更简单(许多框架使它非常非常简单),但它可能没有意义。
认为连接始终存在,因此使用“ PUT”
,但是考虑到“ PUT”应该是幂等的,这会不好吗?
连接并不总是存在。他们可能来来去去。
虽然关系数据库可能具有可以更新的多对多关联表,但这是一种特殊的情况,在DBA的世界之外并没有多大意义。
两个RESTful事物之间的联系很少是单独的事物。这是每个RESTful事物的属性。
完全不清楚这个“连接”是什么。您对此含糊其词,但未提供任何细节。
缺少任何可用的事实,我想您是将设备连接到驱动程序,并且存在某种[Device]<-[Driver Status]->[Driver
]关系。从设备到驱动程序的连接可以是单独的RESTful资源。
它可以很容易地成为设备或驱动程序的属性,而该属性实际上没有单独的可见的RESTful资源。
[再次。诸如Django-Piston之类的某些框架使简单地暴露基础类变得微不足道。但是,这可能并不总是合适的。]
有好的规则/技巧可以从一组方法中巧妙地定义一组资源吗?
是。不要这样资源不是方法。就是这样。
如果您有很多方法(在CRUD之外),那么您可能会遇到数据模型问题。您在关系模型中表达的事物类别可能太少,而事物的状态更新也太多。
有状态的对象并不是天生就邪恶的,但是需要对其进行严格的检查。在某些情况下,用于更改对象状态的PUT可能应该是POST,以添加到对象的历史记录中。 “当前”状态是最后发布的内容。
也。
您不必将每种资源都视为一类事物。您可以拥有作为集合的资源。您可以将相当复杂的文档发布到复合(适当地是Facade)的“资源”中。该复杂的文档可能意味着数据库中会进行多个CRUD操作。
您正在远离简单的RESTful。您的问题仍然是故意含糊的。 “方法丰富的应用程序核心”意义不大。没有具体的例子,就无法想象。
api逻辑会影响应用程序结构
如果这些有所不同,那么您可能正在创建不必要的,无价值的复杂性。
分离关注点是一种好习惯吗?
总是。为什么这么问?
这很多似乎来自于我的困惑,即我如何将一个方法丰富的api映射到Rest-Full API,其中资源应该是名词,而不是动词:那么什么时候将一个元素视为rest“资源”是明智的?
资源由您的问题域定义。通常这是有形的。这些方法(例如“富含方法的API”中的方法通常是无关紧要的。它们是CRUD(创建,检索,更新,删除)操作。如果您的内容本质上不是CRUD,则必须停止编码。停止编写代码,以及重新考虑API以使其类似于CRUD。
CRUD-创建,检索,更新,删除映射到REST的POST-PUT-DELETE。如果您不能将问题域改写为这些术语,请停止编码。停止编码,直到获得CRUD规则为止。
我需要能够在客户端中显示可用驱动程序类型的列表(即类名,而不是Driver实例):这是否意味着创建另一个资源,例如“ DriverTypes”?
正确。它们已经属于您的问题领域。您已经定义了此类。您只是通过REST使它可用。
这就是重点。问题域具有实际对象。您有类定义。他们是有形的东西。 REST转移那些有形事物的状态。
您的软件可能包含无形的东西,例如“关联”或“链接”或“连接”,这是软件解决方案的一部分。这个垃圾并不重要。它是实现细节。不是现实世界的东西。
从两个真实世界的RESTful资源中总是可以看到“关联”。一个资源可能具有类似外键的引用,该引用允许客户端对另一个相关对象进行RESTful提取。或者资源可能具有其他相关对象的集合,并且单个GET检索对象和相关对象的集合。
无论哪种方式,都可以使用真实的RESTful资源。该关系只是暗含的。即使它是一个物理上的多对多数据库表,也并不意味着它必须公开。 [再次。一些框架使公开所有内容变得轻而易举。这并不总是很好。]
关于python - Python对象层次结构和REST资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7614869/
我的一位教授给了我们一些考试练习题,其中一个问题类似于下面(伪代码): a.setColor(blue); b.setColor(red); a = b; b.setColor(purple); b
我似乎经常使用这个测试 if( object && object !== "null" && object !== "undefined" ){ doSomething(); } 在对象上,我
C# Object/object 是值类型还是引用类型? 我检查过它们可以保留引用,但是这个引用不能用于更改对象。 using System; class MyClass { public s
我在通过 AJAX 发送 json 时遇到问题。 var data = [{"name": "Will", "surname": "Smith", "age": "40"},{"name": "Wil
当我尝试访问我的 View 中的对象 {{result}} 时(我从 Express js 服务器发送该对象),它只显示 [object][object]有谁知道如何获取 JSON 格式的值吗? 这是
我有不同类型的数据(可能是字符串、整数......)。这是一个简单的例子: public static void main(String[] args) { before("one"); }
嗨,我是 json 和 javascript 的新手。 我在这个网站找到了使用json数据作为表格的方法。 我很好奇为什么当我尝试使用 json 数据作为表时,我得到 [Object,Object]
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我听别人说 null == object 比 object == null check 例如: void m1(Object obj ) { if(null == obj) // Is thi
Match 对象 提供了对正则表达式匹配的只读属性的访问。 说明 Match 对象只能通过 RegExp 对象的 Execute 方法来创建,该方法实际上返回了 Match 对象的集合。所有的
Class 对象 使用 Class 语句创建的对象。提供了对类的各种事件的访问。 说明 不允许显式地将一个变量声明为 Class 类型。在 VBScript 的上下文中,“类对象”一词指的是用
Folder 对象 提供对文件夹所有属性的访问。 说明 以下代码举例说明如何获得 Folder 对象并查看它的属性: Function ShowDateCreated(f
File 对象 提供对文件的所有属性的访问。 说明 以下代码举例说明如何获得一个 File 对象并查看它的属性: Function ShowDateCreated(fil
Drive 对象 提供对磁盘驱动器或网络共享的属性的访问。 说明 以下代码举例说明如何使用 Drive 对象访问驱动器的属性: Function ShowFreeSpac
FileSystemObject 对象 提供对计算机文件系统的访问。 说明 以下代码举例说明如何使用 FileSystemObject 对象返回一个 TextStream 对象,此对象可以被读
我是 javascript OOP 的新手,我认为这是一个相对基本的问题,但我无法通过搜索网络找到任何帮助。我是否遗漏了什么,或者我只是以错误的方式解决了这个问题? 这是我的示例代码: functio
我可以很容易地创造出很多不同的对象。例如像这样: var myObject = { myFunction: function () { return ""; } };
function Person(fname, lname) { this.fname = fname, this.lname = lname, this.getName = function()
任何人都可以向我解释为什么下面的代码给出 (object, Object) 吗? (console.log(dope) 给出了它应该的内容,但在 JSON.stringify 和 JSON.parse
我正在尝试完成散点图 exercise来自免费代码营。然而,我现在只自己学习了 d3 几个小时,在遵循 lynda.com 的教程后,我一直在尝试确定如何在工具提示中显示特定数据。 This code
我是一名优秀的程序员,十分优秀!