软件工程

针对在系统开发生命周期中工作的专业人士,学者和学生的问答

2
在分布式,事件源系统中维护一致性的模式?
我最近一直在阅读事件源,非常喜欢它背后的想法,但是仍然遇到以下问题。 假设您有N个并发进程,它们接收命令(例如Web服务器),结果生成事件并将它们存储在集中存储中。我们还假设通过依次应用来自存储的事件,所有瞬态应用程序状态都保留在各个进程的内存中。 现在,我们有以下业务规则:每个不同的用户必须具有唯一的用户名。 如果两个进程收到一个针对相同用户名X的用户注册命令,则它们都将检查X是否不在其用户名列表中,该规则将对这两个进程进行验证,并且它们都会在存储中存储“具有用户名X的新用户”事件。 现在,由于违反了业务规则(存在两个具有相同用户名的不同用户),我们进入了不一致的全局状态。 在传统的N服务器<-> 1 RDBMS样式系统中,数据库被用作同步的中心点,这有助于防止此类不一致。 我的问题是:事件源系统通常如何解决此问题?它们是否只是简单地按顺序处理每个命令(例如,将可写入存储的处理量限制为1)?

2
为什么在C 2011中将可变长度数组设为可选?
在C 1999中引入VLA时,我认为这是对该语言的一项伟大创新。但是,在了解到它在C 2011中成为可选功能后,我想知道是什么导致了它的状态更改,以及这是否意味着该功能实际上即将过时。如果是这样,是否有等效的自动大小动态数据管理概念被认为可以替代它? 我试图找到C 2011基本原理文档,但该文档似乎尚未发布。

1
当他们说“不要复制并粘贴此代码”时,Google在这里意味着什么?
以下是Google recaptcha API(https://www.google.com/recaptcha/api.js)中的代码摘录: /* PLEASE DO NOT COPY AND PASTE THIS CODE. */ (function() { if (!window['___grecaptcha_cfg']) { window['___grecaptcha_cfg'] = {}; }; if (!window['___grecaptcha_cfg']['render']) { window['___grecaptcha_cfg']['render'] = 'onload'; }; window['__google_recaptcha_client'] = true; var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://www.gstatic.com/recaptcha/api2/r20160314182818/recaptcha__it.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, …

5
继承与具有空值的其他属性
对于具有可选字段的类,使用继承或可为空的属性更好吗?考虑以下示例: class Book { private String name; } class BookWithColor extends Book { private String color; } 要么 class Book { private String name; private String color; //when this is null then it is "Book" otherwise "BookWithColor" } 要么 class Book { private String name; private Optional<String> color; //when isPresent() …
12 java  inheritance  class  null 


3
坐在电脑前不能解决问题可以吗?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 4年前关闭。 我是一个业余程序员和初学者。大多数时候,我坐在电脑前无法解决问题。例如,我试图找出一个数字是否是另一个的幂。直到我握住笔和纸然后分析问题,我才能找到解决方案。在大约3分钟的时间内,我解决了该问题,并使用Python编写了脚本。 有时候,我坐在电脑前可以解决问题,但是有些挣扎。那样行吗?

6
在数据库表中具有“记录状态”列是一种不好的做法吗?
我首先要澄清一下,“状态”列并不是要反映表中记录(行)所代表的真实项目的状态。相反,它旨在显示记录本身的状态。 它可以像活动/不活动一样简单,也可以像批准/删除/锁定/未决/拒绝等复杂。状态可以存储在布尔/短整数列或单字符列中,并带有true/ 1=活动或A=已批准。 基本思想是在应用程序中具有回收站/类似垃圾桶的恢复支持(并在数据库中进行模拟)。如果有一个前端GUI或其他界面可以让用户“删除”记录,则它实际上不会删除表中的记录,而只是将记录状态更改为“不活动”或“已删除”。当接口获取记录时,它总是获取仅与状态为“活动”或“已批准”的条件匹配的记录。 如果用户犯了一个错误并且需要恢复“删除的”记录(从用户的角度来看),DBA可以轻松地将记录重新打回“活动”或“已批准”状态,这比搜索备份并希望找到原始记录要好。那里。或者界面本身可以让用户在单独的视图中查看已删除的记录,并根据需要还原它们,甚至永久删除它们(删除实际记录)。 我的问题: 这是好习惯还是坏习惯? 它会影响数据的规范化吗? 潜在的陷阱是什么? 有没有其他方法可以达到相同的目标?(看注释) 您如何让数据库仅对特定状态强制对数据执行唯一约束(但对其他状态允许任意数量的重复项)? 为什么数据库不提供原生的类似“回收站”的功能或表跟踪/恢复功能,所以我们可以让接口不用担心而删除实际记录? 注意:我读过有关维护单独的历史记录表的信息,但是在存储和必须生成触发器并使触发器与跟踪表的架构保持最新方面而言,这似乎更糟。

2
我应该允许未知的参数吗?
我正在设计一个RESTful API,并遇到标题问题,为清楚起见已重述: 如果客户端发送无法识别的参数,我应该快速失败吗?例如, http://example.com/api/foo?bar=true&paula=bean 在上面,bar是有效参数,但paulaAPI未指定。我是不是该 警告客户错误 快速失败 忽略它 如果我警告客户端,我只能对第一个参数发出警告,因为它们可能发送的数量几乎是无限的,并且服务器可能要做的更好。同样,失败时,只会将第一个无效参数指定为问题。 我更喜欢失败而不是发出警告来迫使程序员采取行动,因为否则他们可能会忽略问题并继续浪费资源,或者最终不经意地养成自己。在这方面什么都不做会更糟。 我的论点有意义吗?在这种事情上有公认的做法吗?
12 rest  api-design 

2
Haskell解决3n + 1问题的方法
这是来自SPOJ的一个简单的编程问题:http : //www.spoj.com/problems/PROBTRES/。 基本上,要求您为i和j之间的数字输出最大的Collat​​z周期。(数字$ n $的Colatz周期是最终从$ n $变为1的步骤数。) 我一直在寻找一种Haskell方法,以比Java或C ++更好的性能来解决问题(以适应允许的运行时限制)。尽管可以记住任何已计算周期的周期长度的简单Java解决方案将起作用,但是我并未成功地将其应用于获得Haskell解决方案的想法。 我已经尝试了Data.Function.Memoize,以及使用这篇文章中的想法的自制日志时间备注技术:https ://stackoverflow.com/questions/3208258/memoization-in-haskell 。不幸的是,记忆实际上使cycle(n)的计算更加缓慢。我认为,放缓的原因来自Haskell方式的开销。(我尝试使用编译的二进制代码运行,而不是进行解释。) 我还怀疑简单地将数字从i迭代到j可能会很昂贵($ i,j \ le10 ^ 6 $)。因此,我甚至尝试使用http://blog.openendings.net/2013/10/range-trees-and-profiling-in-haskell.html中的想法为范围查询预先计算所有内容。但是,这仍然会出现“超出时间限制”错误。 您能为此告知一个精巧的竞争性Haskell程序吗?

3
更好地保护方法调用或方法本身?
我正在编写一个应用程序,到此为止: private void SomeMethod() { if (Settings.GiveApples) { GiveApples(); } if (Settings.GiveBananas) { GiveBananas(); } } private void GiveApples() { ... } private void GiveBananas() { ... } 这看起来很简单。有一些条件,如果满足,则将调用方法。但是,我在想,这样做是否更好: private void SomeMethod() { GiveApples(); GiveBananas(); } private void GiveApples() { if (!Settings.GiveApples) { return; } ... } private void GiveBananas() …

1
许多异步调用与对API的单次调用
我们正在开发REST API,其中的HTML5前端将通过javascript使用REST API。该应用程序供组织内部使用,通常有大约300个用户,但我们希望扩展到1000个左右的用户。 通常不会在LAN内建立与API的连接,因此连接的质量和延迟会很好,尽管不排除偶尔会在Internet上使用3G / 4G时连接速度较慢且滞后时间较长的情况。 我们认为的两个选择是: 前端将同时对API进行多次异步调用,以加载接口的各个组件。 优点:简单。 缺点:与服务器的连接更多。 前端的控制器将对API进行一次调用,将需要获取的对象作为参数传递给参数。 优点:尽管服务器将与数据库建立多个连接,但仅与服务器建立一个连接。 缺点:在前端和API中都需要机制。它使设计复杂化。 进一步说明:将有不同的资源... /产品... /位置等。可以单独获取这些资源,但是将有另一个抽象资源... / screen?Product&Locations将在一次调用中获取。
12 rest  api  ajax 

1
维护API与在端口中使用成语
我正在研究从Python到Rust的移植,并遇到了一些代码,这些代码在Rust中无法像在Python中那样自然地表达。 一种情况是使用默认参数: class Foo: def __init__(self, a="Hello"): self._a = a 在Rust中,您可以使用构建器来实现: struct FooBuilder { a: &'static str, } struct Foo { _a: &'static str } impl FooBuilder { fn new() -> FooBuilder { FooBuilder { a: "Hello", } } fn change_a(self, new_a: &'static str) -> FooBuilder { FooBuilder { a: …

3
通过指针算术而不是[]运算符引用访问数组元素是否不好?
我刚刚开始学习用C编程,并且为了提高对指针和数组的理解,我尝试引用数组的元素而根本不创建任何指针: for(k1 = 0; k1 < ROW; k1++){ for(k2 = 0; k2 < COLUMN; k2++){ array[k1][k2] = k1*COLUMN + k2 + 1; printf("[%d][%d] = %d\n", k1, k2, *(array[k1] + k2)); } } 整个代码可以编译并完美运行。 我想必须在大型源代码中为每个数组创建一个指针似乎效率很低。 因此,与其使用指针存储和检索数组的地址,不如上面所示,直接使用数组的地址是一种不好的编程习惯吗?

2
为什么行为亚型还不确定?
Liskov在该领域的工作集中于行为子类型,除了本文讨论的类型系统安全性之外,Liskov还要求子类型保留某些契约中由超类型保证的所有不变量。[3] 子类型的定义通常无法确定,因此类型检查器无法验证。 来自:http : //www.wikiwand.com/cn/Subtyping#/Function_types

2
使用gitignore连续部署
使用Git进行连续部署时,如何处理gitignore中被忽略的文件?这些文件出于隐私原因而被忽略(即,不希望它们被推送到其他远程存储库,例如GitHub),但是由于这些被忽略的文件没有被推送到连续部署存储库中,因此它们的应用程序将无法运行(因为被忽略的文件是该软件才能正常运行。 人们通常如何做到这一点?在这种情况下,由于文件被忽略,Git是否不是连续部署的最佳选择?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.