问题标签 [control-flow]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
12 回答
9578 浏览

language-agnostic - 编程风格:如果不满足守卫条件,是否应该提前返回?

我有时想知道的一件事是下面显示的两种风格中哪一种更好(如果有的话)?如果没有满足保护条件,是立即返回更好,还是只在满足保护条件时才做其他事情?

为了论证,请假设保护条件是一个返回布尔值的简单测试,例如检查元素是否在集合中,而不是通过抛出异常可能影响控制流的东西。还假设方法/函数足够短,不需要编辑器滚动。

0 投票
2 回答
596 浏览

common-lisp - 用于控制转移的通用 Lisp 条件系统

我会马上承认以下是对我想做的事情的非常糟糕的描述。提前道歉。请提出问题以帮助我解释。:-)

我用其他语言编写了 ETL(提取、转换、加载),其中包含看起来像这样的单个操作:

然后你将这些操作串在一起,并调用 Dispatcher,它负责调用 Operations 并在它们之间推送数据。

我正在尝试在 Common Lisp 中做类似的事情,并且我想使用相同的基本结构,即每个操作都被定义为一个输入列表和输出列表的普通函数,但是很懒惰。

我可以define-condition使用条件 ( have-value) 来使用类似 foryield的行为,并且可以在单个循环中运行它,并且效果很好。我以相同的方式定义操作,循环输入:

问题是如果我想将几个操作串在一起并运行它们。我第一次尝试为这些编写调度程序看起来像:

但是重新启动只有动态范围:每个操作都将具有相同的重新启动名称。重新启动不是我可以存储的 Lisp 对象,用于存储函数的状态:它是您在处理程序块中按名称(符号)调用的东西,而不是您可以存储以供以后使用的延续。

可以在这里做我想做的事情吗?或者我最好让每个操作函数明确地查看它的输入队列,并明确地将值放在输出队列上?

0 投票
3 回答
853 浏览

networking - 使用“待发送”队列和其他设计问题限制 TCP 发送

这个问题是我在过去几天提出的另外两个问题的结果。
我正在创建一个新问题,因为我认为它与我理解如何控制发送/接收流程的“下一步”有关,我还没有得到完整的答案。
其他相关问题是:
IOCP 文档解释问题 - 缓冲区所有权模糊性
非阻塞 TCP 缓冲区问题

总之,我使用的是 Windows I/O 完成端口。
我有几个线程处理来自完成端口的通知。
我相信这个问题与平台无关,并且会得到与在 *nix、*BSD、Solaris 系统上做同样的事情相同的答案。

所以,我需要有自己的流量控制系统。美好的。
所以我发送发送和发送,很多。我怎么知道什么时候开始排队发送,因为接收方限制为 X 数量?

让我们举个例子(最接近我的问题):FTP 协议。
我有两台服务器;一个在 100Mb 链路上,另一个在 10Mb 链路上。
我命令 100Mb 的一个向另一个(10Mb 链接的)发送一个 1GB 的文件。它以 1.25MB/s 的平均传输速率结束。
发送者(100Mb 链接的)如何知道何时停止发送,所以较慢的发送者不会被淹没?(在这种情况下,“待发送”队列是硬盘上的实际文件)。

另一种问这个问题的方法:
我可以从远程收到“保留发送”通知吗?它是内置在 TCP 中还是所谓的“可靠网络协议”需要我这样做?

我当然可以将我的发送限制为固定数量的字节,但这对我来说听起来不合适。

同样,我有一个循环,其中有许多发送到远程服务器,并且在某些时候,在该循环中,我必须确定是否应该对该发送进行排队,或者我可以将其传递给传输层 (TCP)
我怎么做?你会怎么做?当然,当我从 IOCP 收到发送已完成的完成通知时,我将发出其他待处理的发送,这很清楚。

与此相关的另一个设计问题:
由于我要使用带有发送队列的自定义缓冲区,并且当“send-done”通知到达时,这些缓冲区被释放以供重用(因此不使用“delete”关键字) ,我将不得不在该缓冲池上使用互斥。
使用互斥锁会减慢速度,所以我一直在想;为什么不让每个线程都有自己的缓冲池,因此访问它,至少在获取发送操作所需的缓冲区时,不需要互斥体,因为它只属于那个线程。
缓冲池位于线程本地存储 (TLS) 级别。
没有相互池意味着不需要锁,意味着更快的操作,但也意味着应用程序使用更多的内存,因为即使一个线程已经分配了 1000 个缓冲区,另一个正在发送并且需要 1000 个缓冲区来发送内容的线程也需要分配这些都是自己的。

另一个问题:
假设我在“待发送”队列中有缓冲区 A、B、C。
然后我收到一个完成通知,告诉我接收器收到了 15 个字节中的 10 个。我应该从缓冲区的相对偏移量重新发送,还是 TCP 会为我处理它,即完成发送?如果我应该这样做,我是否可以确保这个缓冲区是队列中的“下一个发送”缓冲区,或者它可以是缓冲区 B 吗?

这是一个很长的问题,我希望没有人受伤(:

我希望看到有人花时间在这里回答。我保证我会双重投票给他!(:
谢谢大家!

0 投票
4 回答
338 浏览

php - 即使初始 if 语句为 false,PHP elseif 语句也不会执行

我正在编写一个递归函数来打印出 2 个多维 php 数组之间的差异。此代码的目的是查看 jpeg 标头之间的差异,以确定 adobe bridge cs3 如何在 jpg 文件中保存评级信息。

当我使用我的 eclipse - zend 调试器 ide 单步执行代码时,似乎即使初始 if 语句为假(即,两个值都不是数组),后续 elseif 语句也不会执行。函数附在下面。

注意:自原始帖子以来基于评论的更改
添加了默认级别=''
删除了 if{} elseif{} 块之间的评论
删除了一个 else; 在没有函数的块的末尾对 < 和 > 符号进行了编码,因此尖括号将显示在我的代码中

0 投票
4 回答
344 浏览

java - Java 流控制问题

我正在编写一个简单的 2d 游戏引擎。我已经决定了我希望引擎如何运行:它将由包含“事件”的对象组成,我的主游戏循环将在适当的时候触发。

关于结构的更多信息:每个GameObject人都有一个updateEvent方法。 objectList是将接收更新事件的所有对象的列表。只有此列表中的对象具有被游戏循环调用的 updateEvent 方法。

我正在尝试在 GameObject 类中实现这个方法(这个规范是我想要实现的方法):

因此,如果一个对象试图在更新事件中移除自己,控制权应该转移回游戏引擎:

这是我到目前为止所拥有的。它有效,但是我越了解使用异常进行流控制,我就越不喜欢它,所以我想看看是否有替代方案。

删除方法

p>

游戏循环

p>

2个问题:

  1. 我是否正确假设实现上述删除方法的立即停止部分的唯一方法是抛出自定义异常并在游戏循环中捕获它?(我知道,使用异常进行流控制就像 goto,这很糟糕。我只是想不出另一种方法来做我想做的事!)

  2. 对于从列表本身中移除,一个对象可以移除列表中更靠后的对象。目前,我在执行任何代码之前检查已删除的标志,并在每次传递结束时删除对象以避免并发修改。有没有更好的,最好是即时/非轮询的方式来做到这一点?

[编辑] 阅读您的答案后,我想我会更改方法规格。即时删除行为是我已经习惯在不同的引擎中使用的东西,但你是对的,它并不真正适合 Java 的工作方式。是时候尝试用一种稍微不同的思维方式来解决我的问题了!

0 投票
1 回答
4509 浏览

java - 用于将 C 程序转换为控制流图的 Java 代码

我需要一个 Java 代码来将 C 程序转换为控制流图。

有人可以帮我解决吗?

0 投票
11 回答
7966 浏览

loops - Perl 循环标签算作 GOTO 吗?

通常,避免 GOTO 是一种很好的做法。牢记这一点,我一直在与一位同事就这个话题进行辩论。

考虑以下代码:

使用循环标签算作 goto 吗?

这是perldoc 中的perlsyn必须说的:

以下是 C 程序员如何在 Perl 中编写特定算法的方法:

而下面是一个对这个习惯用法更熟悉的 Perl 程序员可能会这样做的方式:

我对此的看法是否定的,因为您明确告诉循环短路并前进,但是我的同事不同意,说这只是一个花哨的 GOTO,应该避免。我正在寻找一个令人信服的论点或文档来解释为什么这是或不是 GOTO。我也会接受解释为什么这在 perl 中被认为是或不被认为是好的做法。

0 投票
5 回答
150 浏览

language-agnostic - 编程101,选择VS if block

我不确定我是否理解 if 块和 switch/select 块之间的区别。我的意思是我一直在使用它们。但是我不清楚什么时候应该应用 switch 块,什么时候不应该。因为,选择块可以扩展为 if 块。因此,我能想到的使用 select 块的唯一真正优势是人类可读性。

0 投票
1 回答
375 浏览

c# - 通用回调机制重载成功处理程序作为流控制的一种手段 - 代码异味?

我是一个项目的新手,并且遇到了一个有趣的设计范例,用于我们对数据库进行的一些异步调用(变量和函数名称已更改):

示例用法:

示例用法显示了在两种不同情况下对该函数的两次不同调用——初始登录和重新登录(从技术上讲,不是重新登录,而是为当前登录的用户以不同的初始状态重新启动应用程序)。

困扰我的是,这两种情况下的回调函数是不同的。我习惯于看到函数接受回调以允许函数的用户在被调用函数的范围内提供自定义实现。

但是,在上述情况下,回调函数会更改控制流。根据提供的回调函数不同,异步调用返回后的后续调用函数也不同。这是代码异味还是仅仅是回调的创造性用途?

0 投票
1 回答
427 浏览

mips - 寻找一种定义反编译器规则的好方法,需要建议

我正在为 MIPS 架构开发一个非常简单的反编译器,随着我的进步,我必须为代码分析定义许多规则,例如“如果这个操作码是lui并且下一个操作码是addiu然后返回var = value ”或“如果这个操作码是bne,它指的是当前地址之前的地址 - 创建循环解析树中的定义”。问题 - 有很多这样的规则,我找不到定义它们的好方法。我尝试为每个规则编写单独的函数,定义好的 OOP 基础逻辑类并将它们扩展以创建规则,甚至尝试在 disasmed 代码上使用正则表达式(令我惊讶的是,这比预期的效果更好)但无论我尝试了什么,我的代码很快变得很大并且很难阅读,无论我尝试记录和构建的效果如何它。

这让我得出结论,我试图通过使用错误的工具来解决这个任务(更不用说对于如此复杂的任务来说太愚蠢了:)),但我不知道我应该尝试什么。目前我有两个未经测试的想法,一个是使用某种 DSL(我完全没有这方面的经验,所以我可能完全错了),另一个是编写某种类似于二进制正则表达式的工具来进行操作码匹配。

我希望有人能指出我正确的方向,谢谢。