107

我对有一些关于编程中的无状态和有状态设计的具体信息的文章感兴趣。我很感兴趣,因为我想了解更多关于它的信息,但我真的找不到任何关于它的好文章。我在网上阅读了几十篇模糊讨论该主题的文章,或者他们在谈论 Web 服务器和会话——它们也是“有状态与无状态”的,但我对编码中的属性的无状态与有状态设计感兴趣. 示例:我听说 BL 类在设计上是无状态的,实体类(或者至少我是这么称呼它们的——比如 Person(id, name, ..))是有状态的,等等。

我认为了解它很重要,因为我相信如果我能理解它,我可以编写更好的代码(例如考虑粒度)。

无论如何,真的很短,这就是我所知道的关于有状态与无状态的:

有状态(如 WinForms):存储数据以供进一步使用,但限制了应用程序的可扩展性,因为它受 CPU 或内存限制

无状态(像 ASP.NET - 尽管 ASP 尝试使用 ViewStates 来保持状态):操作完成后,数据被传输,实例被交回线程池(非晶态)。

正如您所看到的,它的信息非常模糊和有限(并且非常关注服务器交互),所以如果您能给我提供一些更美味的信息,我将非常感激 :)

4

8 回答 8

96

无状态意味着没有过去的记忆。每笔交易都像第一次完成一样执行。

有状态意味着有过去的记忆。以前的交易会被记住,并且可能会影响当前的交易。

无状态:

// The state is derived by what is passed into the function

function int addOne(int number)
{
    return number + 1;
}

有状态的:

// The state is maintained by the function

private int _number = 0; //initially zero

function int addOne()
{
   _number++;
   return _number;
}

参考自: https ://softwareengineering.stackexchange.com/questions/101337/whats-the-difference-between-stateful-and-stateless

于 2014-08-30T12:35:19.263 回答
75

状态的应用程序是一种存储有关自开始运行以来发生或更改的信息的应用程序。任何关于它处于什么“模式”的公共信息,或者已经处理了多少条记录,或者其他任何信息,都使它成为有状态的。

无状态应用程序不会公开任何此类信息。它们每次都对相同的请求、函数或方法调用给出相同的响应。HTTP 在其原始形式中是无状态的 - 如果您对特定 URL 执行 GET,则每次(理论上)都会得到相同的响应。当然,例外情况是当我们开始在顶部添加状态性时,例如使用 ASP.NET Web 应用程序 :) 但是如果您想到一个只有 HTML 文件和图像的静态网站,您就会明白我的意思。

于 2011-03-29T06:41:42.577 回答
61

我建议您从StackOverflow 中讨论无状态编程优势的问题开始。这更多是在函数式编程的上下文中,但您将阅读的内容也适用于其他编程范式。

无状态编程与函数的数学概念有关,当使用相同的参数调用该函数时,总是返回相同的结果。这是函数式编程范式的一个关键概念,我希望您能够找到该领域的许多相关文章。

您可以研究以获得更多理解的另一个领域是 RESTful Web 服务。与其他试图以某种方式保持状态的 Web 技术相比,这些设计是“无状态的”。(实际上,您所说的 ASP.NET 是无状态的并不正确 - ASP.NET 努力使用 ViewState 来保持状态,并且肯定会被描述为有状态的。另一方面,ASP.NET MVC 是一种无状态技术)。有很多地方都在讨论 RESTful Web 服务的“无状态”(例如这个博客),但您可以再次从 SO question开始。

于 2011-03-22T09:34:24.563 回答
18

形容词有状态或无状态仅指会话的状态,它与为相同输入提供相同输出的功能概念无关。如果是这样,任何动态 Web 应用程序(其背后有数据库)都将是有状态服务,这显然是错误的。考虑到这一点,如果我委托任务在底层技术(例如 coockie 或 http 会话)中保持对话状态,我正在实现有状态服务,但如果所有必要的信息(上下文)都作为参数传递,我' m 实现无状态服务。需要注意的是,即使传递的参数是会话状态的“标识符”(例如票证或 sessionId)我们仍然在无状态服务下操作,

于 2012-06-29T10:22:40.720 回答
5

从一个帐户在线转移到另一个帐户的资金是有状态的,因为接收帐户具有有关发件人的信息。将现金从一个人移交给另一个人,这种交易是无状态的,因为在收到现金后,送出者的身份与现金不存在。

于 2013-11-26T11:45:53.797 回答
1

只是为了添加其他人的贡献......另一种方式是从 Web 服务器和并发的角度来看它......

HTTP 在本质上是无状态的,原因是……对于 Web 服务器,有状态意味着它必须记住用户上次连接的“状态”,和/或保持与请求者的打开连接。在具有数千个并发连接的应用程序中,这将是非常昂贵和“压力”的......

在这种情况下,无状态可以明显有效地使用资源......即支持在单个请求和响应实例中的连接......没有保持连接打开和/或记住上次请求中的任何内容的开销......

于 2018-09-21T12:12:38.457 回答
-3

我们通过使用会话对象覆盖 HTTP 无状态行为来使 Web 应用程序有状态。当我们使用会话对象时,状态被携带,但我们仍然只使用 HTTP。

于 2014-01-15T13:01:24.427 回答
-3

我对有状态与无状态的类设计有同样的疑问,并做了一些研究。刚刚完成,我的发现已发布在我的博客中

  • 实体类需要是有状态的
  • 助手/工人类不应该是有状态的。
于 2014-10-28T14:18:17.677 回答