编程中的术语"上下文"?

use*_*058 152 language-agnostic programming-languages terminology

我已经编程了几个月了,一个经常使用的词是类中的"上下文".喜欢ServletContext(Java),Activity(Android),Service(Java,Android),NSManagedContext(Objective-C,iOS).

通过查看词典,我看到这个词意味着:情境,环境,环境等等.但是,因为我不是母语为英语的人,所以我不明白我应该直接将其翻译成什么.例如,如果我要编写一个已命名的类SomeClassContext,或者一个具有上下文参数的方法,我不明白何时应该将其命名为context,因为我不理解它.

我一直在寻找Stack Overflow的上下文,但没有问题/答案能够帮助我.

如果有人可以向我提供解释,我会很高兴.

Bri*_*lly 177

假设你去看牙医拔牙.

当接待员询问您的姓名时,他们需要这些信息才能开始预约.在此示例中,您的名称是上下文信息.因此,在访问牙医的情况下,您需要提供您的名字以拉动您的牙齿.

现在让我们说你走到银行.

在银行,你要求提取100美元.出纳员需要在给您钱之前建立您的身份,因此您可能需要向他们出示驾驶执照或刷卡您的ATM卡并输入您的密码.无论哪种方式,您提供的是上下文.出纳员使用此信息来推进交易.然后,他们可能会询问您要退出的帐户.当你回答"我的储蓄账户"时,这就是更多的背景.

您提供的背景越多,另一方有助于处理您的请求的知识就越多.有时上下文是可选的(比如在Google搜索中输入越来越多的单词以获得更好的结果),有时需要(例如在ATM上提供您的PIN码).无论哪种方式,它的信息通常有助于完成工作.

现在让我们假设您花100美元购买机票,在您的嘴痊愈时飞到温暖的地方.

你来到一个阳光明媚的目的地,但你的包不能成功.它在机场系统的某个地方丢失了.因此,您将"行李认领券"(带有条形码的贴纸)带到"行李丢失办公室".桌子后面的人要求的第一件事就是带有行李号码的车票.这是一些必要背景的例子.

但随后行李人会要求您提供有关行李的更多信息,以便他们能够更轻松地找到行李.他们问:" 它的颜色是什么颜色?尺寸是多少?是否有轮子?它是硬还是软?虽然它们不一定需要这些信息,但如果你提供这些信息,它会缩小范围.问题区域.它使搜索更快.这是可选的上下文.

这是有趣的部分:对于许多软件和API,所需的上下文通常最终作为方法签名中的实际参数,可选上下文在其他地方,例如可以包含任何内容的灵活键值映射(可能为空或者进入线程本地存储,如果需要可以访问它.

上面的例子来自现实生活,但您可以轻松地将它们映射到计算机科学领域.例如,HTTP标头包含上下文信息.每个标题涉及有关正在进行的请求的信息.或者,当您作为两阶段提交过程的一部分发送全局事务ID时,该事务ID是上下文.它有助于事务管理器协调工作,因为它是有关手头总体任务的信息.

希望有所帮助.

  • @Brian:从你的帖子和这里给出的其他答案我想我可能会开始理解它.携带有关事件的状态信息的对象是"上下文"对象吗?这是对的吗?所以RequestContext对象将携带有关特定请求的信息,对吗?当另一个请求到来时,附加到RequestContext对象的信息将会改变.说上下文对象有点像DTO(数据传输对象)是不对的?然而,上下文携带有关不同相关"事物"的信息,而DTO携带诸如人之类的对象的信息?谢谢 (21认同)
  • 好问题."上下文菜单"中"上下文"的含义是,"您在菜单上看到的内容取决于您单击的位置,单击时以及应用程序中发生的其他情况".**这些信息(在何时/何时/您点击的内容)代表上下文**并将被发送到GUI代码,以便它可以决定菜单上提供的内容. (9认同)
  • 你已经钉了它,这是完全正确的.RequestContext确实会携带有关正在进行的请求的信息(例如,客户端的语言环境).上下文类似于DTO/VO,但通常不是强类型的.但是你的概念很好. (8认同)
  • @Brian:还有一个问题浮现在脑海中,在谈到上下文菜单时,我从这个答案中学到的语境的含义在我脑海中没有意义.据我所知,现在上下文(简称)是关于某事的携带状态.那么,以这种方式使用"上下文"一词意味着什么呢? (5认同)
  • 因此,该方法的参数是上下文.我错了吗? (2认同)

Tay*_*lor 14

上下文可以看作是传递信息的桶.它通常用于传递不一定直接绑定到方法调用的东西,但仍然可能是相关的.描述它的非专业方式可能是"你可能关心的东西".

例如,如果您正在编写服务以更新数据库中的值,则可能会传入记录ID和新值.

如果需要通用接口,还可以定义要传递的上下文,以便服务可以执行任意业务逻辑.因此,您可以在上下文中包括用户身份验证,用户的会话状态等,因为服务可以执行依赖于这些值的附加逻辑.

  • 另一个有用的思考方式是"有关正在发生的事情的信息".或者在学术上,它是"元信息".这是一个非常学术的短语,但它是准确的.在这种背景下. (7认同)
  • 它基本上是一个时间点的状态,并不比那更复杂 (4认同)

小智 12

这是2015年 - 可能在这个线程开始后的几年.

尽管如此,我发布这条消息是为了帮助那些像我一样努力理解"上下文"的人

我没有声称在Java程序中使用了Context - 所以完全取决于你在硬编码中编写Context所以这里是: -

"概念上下文"是相同的"告诉我更多"当客户端向服务器发出请求时 - 为了执行请求,服务器说"给我一些更多的信息以便我可以帮助你".因此,与请求一起,客户端提供一组细节.服务器从捆绑中挑选并选择提供请求​​所需的所有信息.这个包就是所谓的"上下文"

例如

病人去医生并说treat_me("我头疼")Doc办公室给病人填写一份表格.患者填写表格.医生使用该表格来执行"treat_me"请求.

以下是请求现在的样子:

treat_me ( "i have a headache", filled_form_num_23321 ) 
Run Code Online (Sandbox Code Playgroud)

这是filled_form_num_23321 看起来如何:

问:导致这种情况的原因是什么?A. 10个整齐的苏格兰最后一个
Q.Patient名称?A. Joe Bigdrinker
Q.Age?98

在这个交易中filled_form_num_23321是"背景".

希望这有助于澄清"语境"的概念.


Mat*_*att 7

我总是将上下文视为与我正在使用的对象或构造相关的特定状态.

例如,当您在视图中使用drawRect时(必须为视图完成所有绘图),您必须始终获取currentGraphicsContext,您将在其中发出核心图形语句.此上下文包含视图边界,笔触颜色,绘制线条的笔触粗细,填充封闭路径的填充颜色等内容.此上下文(与大多数其他内容一样)只是此时的当前状态.因此,在这种情况下,将图形上下文视为一组状态,例如

笔画粗细是1.5像素填充颜色是黑色边界的视图是(155,200)笔画颜色是红色

它基本上是当前时间的状态......


luk*_*kin 5

举一个实际的例子。假设您有某个网页可以根据用户(已登录)和浏览器的语言来获取/呈现一些信息。提取信息的逻辑与用户和语言无关。您的页面将接收用户和一种语言...对于逻辑而言,无论是我还是您,还是英语还是西班牙语,都没有关系。

一些伪代码:

class FooPage
{
    void handleRequest(RequestContext context)
    {
        User user = context.getUser();
        Locale locale = context.getLocale();

        … do some logic based on the context
    }
}
Run Code Online (Sandbox Code Playgroud)

它不是那么困难,但是要花一些时间来理解这个概念


Apa*_*ala 5

Context指的是执行上下文,它是从代码中给定点可到达的符号,以及该特定执行中那些符号的值.

上下文是一个重要的概念因为:

  1. 可执行单元(函数,过程,指令)可能产生不同的结果或在不同的上下文中表现不同.
  2. 上下文越大或越复杂,就越难理解一段代码的作用(这就是全局变量被避开的原因).

您不必编写上下文类或传递上下文参数.传递给函数/方法的任何参数在调用时都会成为执行上下文的一部分.

即使您不是英语使用者,我建议您阅读代码完成副本,以便对上下文,模块化,耦合,内聚等概念进行温和而全面的介绍.