软件工程

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

3
如何处理似乎已修复的错误?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 4年前关闭。 我是内部系统的Web应用程序开发人员。用户报告存在错误。 错误是某些单词无法显示。该报告包含一个截屏,清楚地显示了该错误。但是该报告已经发布了将近一个月,并且该错误无法再在我们的生产环境中复制。 我应该如何回复客户和用户?

2
UDP数据有效载荷应包含CRC吗?
对于我曾经工作过的公司,我必须实现一个套接字接收器,该接收器主要通过一些专用传感器硬件通过本地连接以UDP形式获取数据。所讨论的数据是格式正确的UDP数据包,但有趣的是,数据有效负载始终以使用其余数据形成的CRC16校验和结尾。 我按照规范在终端执行了检查,但是我一直想知道这是否有必要。毕竟,UDP协议本身不携带16位CRC吗?因此,尽管UDP数据包可能会丢失或乱序,但我给人的印象是,在到达OS进程之前,如果不被网络硬件丢弃,就无法破坏它们。还是我缺少一些特殊用例? 值得补充的是,我在国防行业工作,正如您确定的那样,我对这样的事情都非常清楚,所以我想知道这是否仅仅是“安全OCD”的案例。 ..

4
如何为GUI编写可维护的而不是脆弱的单元测试?
我尝试为我的GUI应用程序编写UI单元测试,但我遇到的问题是,尽管在我最初编写它们时它们可以很好地工作,但是它们却很脆弱,并且每当设计更改时(即经常)它们就会损坏。我正在努力寻找一套指导方针,以使我能够进行GUI的可维护单元测试。 就目前而言,我发现的一件事是,测试表明“该组件应在某处显示其输入数据”是很好的(并且使用HTML非常容易)。检查组件特定部分的特定状态的测试通常很脆弱。试图遵循用户行为和基本业务逻辑(这是最重要的部分)的测试,如单击-单击-单击-预期,通常会变得很脆弱。如何编写好的测试? 更精确地说,我想了解一些模式有什么可我在UI测试,不完全是如何对其进行测试。命名约定和固定标识符很好,但是不能解决核心问题,即GUI发生了很大变化。我想测试最不可能改变的行为。如何找到合适的东西进行测试?

2
语义版本控制是否允许版本号包含4个组件?
我所看到的所有语义版本控制示例都显示了3个使用中的组件。不超过2个句点字符。在$DAYJOB,我们在发行版号中使用4个组件: 5.0.1.2 语义版本允许吗? 作为一个更高层次且更具争议性的附带问题,这真的很重要吗?我开始认为实施语义版本控制可能是一个好主意,但最终像PCI这样的实体会覆盖它。 我应该在我的PCI评论中弄清楚。问题在于,当主要和次要组件发生更改时,审核及其成本会受到影响,而这不一定是真正的新功能。例如,如果引入了与付款相关的功能,我们将为PCI分配次要数字。但是,如果我们在gui中添加了与某物相关的全新功能,则不会。仅补丁程序更改。因此,在这种情况下,作为开发人员,我们实际上没有发言权,因为其他人会做出这些决定。

1
REST API安全性:HMAC /密钥哈希与JWT
我刚刚读了这篇已有几年历史的文章,但是描述了一种保护REST API的聪明方法。实质上: 每个客户都有唯一的公钥/私钥对 只有客户端和服务器才知道私钥。它永远不会通过电线发送 对于每个请求,客户端都会获取多个输入(整个请求本身,当前时间戳和私钥),并通过HMAC函数运行它们以生成请求的哈希 然后,客户端将常规请求(包含公钥)和哈希发送到服务器 服务器会查询客户端的私钥(基于提供的公钥),并进行一些时间戳检查(我当然不理解),以验证请求是否不是受害对象。 重播攻击 如果一切正常,则服务器使用私钥和相同的HMAC函数来生成其自己的请求哈希 然后,服务器比较两个哈希(客户端发送的哈希值以及它生成的哈希值);如果它们匹配,则对请求进行身份验证并允许其继续 然后我偶然发现了JWT,听起来很相似。但是第一篇文章根本没有提到JWT,因此我想知道JWT是否与上述auth解决方案不同,如果有所不同,怎么做。

1
使用百分号(%)表示模数/余数是使用哪种编程语言生成的?
使用百分号(%)表示模数/余数是使用哪种编程语言生成的? 上一篇文章1解释了选择%符号的原因,因为它包含一个斜线,对于与除法相关的运算很巧妙。它还提到了C使用符号的影响。但是,我不确定它起源于C。B编程语言是C的前身,我发现B的用户指南(PDF,第12页)指出: 运算符%表示模。如果两个操作数均为正,则结果正确。否则未定义。 该用户指南的日期为1972年,大约是C出现的时间。从理论上讲,这仍然可能起源于C,但是后来又移植到B。在表示使用%符号之前,我还无法找到其他语言的规范。 我认为对这个问题不是重复的:有人问为什么取模运算是基本的,我问的是该符号何时特别是表示取模。

3
将ViewModel与Model完全相同是个好主意吗
我的解决方案中包含以下几层: 应用域 应用服务 App.Core(也许您将此称为App.DataLayer) App.Web 软件设计模式不是我的问题,我有以下模型 Domain public class Foo { public int Id {get;set;} public int Name {get;set;} public int Value {get;set;} } 我想在视图(例如主页)上使用此模型,并且要使用Id, Name & Value,因此,如果要创建ViewModel,我将添加以下内容: public class FooViewModel { public int Id {get;set;} public int Name {get;set;} public int Value {get;set;} } 那么,这是个好主意吗?或只是使用Foo代替FooViewModel?

1
渐进式HTTP下载是否可以替代HLS / DASH / RTMP提供实时视频?
我正在一个需要向用户流式传输实时视频的网站上工作,因此,我不得不直奔当前基于浏览器的视频流技术的遗憾状态。目前,最流行的实时流媒体解决方案都存在兼容性问题。RTMP需要Flash,Safari和Chrome for Android仅本地支持HLS,DASH在任何地方均不受本地支持,使用dash.js需要Media Source Extensions,但尚未得到广泛支持。 这给我带来了一个显而易见的问题:是否可以使用简单的渐进式下载来替代需要浏览器支持或插件的HLS,RTMP和DASH之类的协议? 使用渐进式下载流式传输实时媒体的想法并不是前所未有的。人们已经将其用于音频。诸如liveCaster之类的工具可让您通过单个渐进式HTTP响应流式传输实时MP3音频,而无需预先录制的MP3文件,而AmplitudeJS之类的库已竭尽全力添加与这种实时音频流相关的功能。 不过,我还没有看到这种技术在视频中被广泛使用的任何实例,而且我也不能说出原因。似乎它将以较少的权衡消除一层混乱且困难的浏览器端兼容性问题。(即使是专业人士,兼容性仍然是实时流的一个巨大问题;如果我尝试在Firefox中BBC的iPlayer上观看实时视频,它只会给我一条错误消息,告诉我安装Flash。)这种技术,我从未见过有人提到我这个想法。 为什么?是否有基本限制(我看不到),使得它无法像正在生成的MP4一样通过渐进式下载流式传输视频文件,并在<video>下载时在元素中播放?

2
序列化和反序列化应该由要序列化的类负责吗?
我目前处于C#.NET应用程序的几个模型类的(重新)设计阶段。(模型与MVC中的M相同)。模型类已经具有大量精心设计的数据,行为和相互关系。我正在将模型从Python重写为C#。 在旧的Python模型中,我认为我看到了疣。每个模型都知道如何进行序列化,而序列化逻辑与任何类的其余行为无关。例如,假设: Image类的.toJPG(String filePath) .fromJPG(String filePath)方法 ImageMetaData.toString()和.fromString(String serialized)方法的类。 您可以想象这些序列化方法与该类的其余部分之间是否没有凝聚力,但是只能保证该类知道足够的数据来对其自身进行序列化。 上课知道如何序列化和反序列化是一种常见的做法吗?还是我错过了通用模式?

5
如何为代表自身或另外两件事的事物创建数据类型
背景 这是我正在研究的实际问题:我想要一种在纸牌游戏“ 魔术:聚会”中表示纸牌的方法。游戏中的大多数卡都是外观正常的卡,但其中有些分为两部分,每部分都有自己的名称。这些分为两部分的卡的每半都被视为卡本身。因此,为清楚起见,我将Card仅指代普通卡或两部分卡的一半(换句话说,只有一个名字的东西)。 因此,我们有一个基本类型Card。这些对象的目的实际上只是为了保留卡的属性。他们自己根本不做任何事情。 interface Card { String name(); String text(); // etc } Card我称之为的两个子类PartialCard(两部分的卡的一半)和WholeCard(普通卡)。 PartialCard还有两个附加方法:PartialCard otherPart()和boolean isFirstPart()。 代表 如果我有一个牌组,它应该由WholeCards而不是Cards组成,因为a Card可能是a PartialCard,这没有任何意义。因此,我想要一个表示“物理卡”的对象,即可以表示一个WholeCard或两个PartialCards的对象。我暂时称呼这种类型Representative,并Card有方法getRepresentative()。A Representative几乎不会在其代表的卡上提供任何直接信息,而只会指向它/它们。现在,我的聪明/疯狂/愚蠢的想法(由您决定)是WholeCard继承自两个 Card和Representative。毕竟,它们是代表自己的卡片!WholeCards可以实现getRepresentative为return this;。 至于PartialCards,它们并不代表自己,但是它们的外部Representative不是Card,而是提供了访问这两个PartialCard的方法。 我认为这种类型的层次结构很有意义,但是很复杂。如果我们将Cards视为“概念卡”而将Representatives视为“物理卡”,那么,大多数卡都是!我认为您可以提出一个论点,即物理卡实际上包含概念卡,并且它们不是一回事,但我认为它们是相同的。 类型转换的必要性 因为PartialCards和WholeCards都是Cards,通常没有充分的理由将它们分开,所以我通常只使用Collection<Card>。所以有时我需要转换PartialCards才能访问它们的其他方法。现在,我正在使用此处描述的系统,因为我真的不喜欢显式强制转换。和一样Card,Representative需要将其强制转换为WholeCard或Composite,以访问Card它们所代表的实际。 所以仅作总结: 基本类型 Representative 基本类型 Card 类型WholeCard extends Card, Representative(无需访问,它代表自己) 类型PartialCard extends Card(允许访问其他部分) 类型Composite extends Representative(允许访问两个部分) 这是疯了吗?我认为这实际上很有意义,但是老实说我不确定。

5
C ++:类应该拥有还是观察其依赖关系?
说我有一个Foobar使用(取决于)class的类Widget。好的时候,将Widgetwolud声明为中的字段Foobar,或者如果需要多态行为,则可以声明为智能指针,并将其在构造函​​数中初始化: class Foobar { Widget widget; public: Foobar() : widget(blah blah blah) {} // or std::unique_ptr<Widget> widget; public: Foobar() : widget(std::make_unique<Widget>(blah blah blah)) {} (…) }; 而且我们已经准备就绪。不幸的是,今天,Java的孩子们会嘲笑我们一旦看到它,这是理所当然的,因为它的夫妇Foobar和Widget在一起。解决方案看似很简单:应用“依赖注入”以使依赖构造脱离Foobar类。但是,C ++迫使我们考虑依赖关系的所有权。想到三个解决方案: 唯一指针 class Foobar { std::unique_ptr<Widget> widget; public: Foobar(std::unique_ptr<Widget> &&w) : widget(w) {} (…) } Foobar要求将所有权Widget转移给它。这具有以下优点: 对性能的影响可以忽略不计。 它很安全,因为它可以Foobar控制生命周期Widget,因此可以确保Widget它不会突然消失。 它是安全的,Widget不会泄漏,并且在不再需要时会被适当破坏。 但是,这是有代价的: 它对如何使用Widget实例设置了限制,例如,不能使用堆栈分配Widgets,Widget不能共享。 共享指针 class …

2
将OpenJDK与GPL允许的专有应用程序捆绑在一起?
我目前正在用Java制作视频游戏,很可能会通过Steam发行。当然,在这种情况下,许多Steam用户不会安装Java。如果发生这种情况,我可以使用一个小的本机启动器来显示提示性对话框,告诉用户他们需要安装Java,也可以将我自己的Java运行时环境(特别是OpenJDK 8)捆绑到我的游戏中。我的游戏将是封闭源代码,但是它基于开放源代码(BSD许可)游戏引擎。 我确实看过OpenJDK的许可证。这是一个GPL项目,这意味着链接到它的任何内容也必须是GPL。但是,它们也有classpath异常。我不确定链接部分是否适用,因为我的代码所链接的部分与捆绑或不捆绑的情况相同。据我所知,classpath异常不涵盖此用例。 在Stack Overflow上也有类似的问题,但是这是指使用OpenJDK开发应用程序的情况,我指的是使用OpenJDK进行分发。
16 licensing  gpl 

4
固定时间和摊销固定时间是否有效地等同?
我需要编写一个RandomQueue,以允许在恒定时间(O(1))中进行追加和随机删除。 我的第一个想法是使用某种Array(我选择ArrayList)来支持它,因为数组可以通过索引进行恒定访问。 虽然查看文档,但我意识到ArrayLists的添加被视为摊销固定时间,因为添加可能需要重新分配基础数组O(n)。 摊销的固定时间和固定时间实际上是否相同,还是我需要查看某种结构,不需要每次添加都进行完全重新分配? 我之所以这样问是因为除了基于数组的结构(据我所知,它将始终具有摊销的固定时间),我想不出任何满足要求的东西: 任何基于树的事物最多都具有O(log n)访问权限 链表可能会增加O(1)(如果保留对尾部的引用),但是随机删除最多应为O(n)。 这是完整的问题;万一我对一些重要细节感到困惑: 设计并实现一个RandomQueue。这是Queue接口的一种实现,其中remove()操作将删除一个元素,该元素是在队列中当前所有元素中随机选择的。(将RandomQueue当作一个包,我们可以在其中添加元素或进入并盲目删除一些随机元素。)RandomQueue中的add(x)和remove()操作每个操作应在恒定的时间内运行。

7
什么更快?使用REST API还是直接查询数据库?
什么是更快的性能明智的选择?创建REST API并让您的Web应用使用REST API来与数据库进行所有交互,或者直接查询数据库(即使用您的语言用来查询数据库的任何典型对象,例如Java的JDBC)? 我使用REST的方式: 您在代码中创建一个对象以调用REST方法 调用http方法 REST API中的代码查询数据库 数据库返回一些数据 REST API代码将数据打包到Json中并将其发送到您的客户端 客户端收到Json / XML响应 将响应映射到代码中的对象 另一方面,直接查询数据库: 使用查询字符串创建对象以查询数据库 数据库返回一些数据 将响应映射到代码中的对象 因此,这是否意味着使用REST API会更慢?也许取决于数据库的类型(SQL vs NoSQL)?
16 database  rest  sql 

5
版本控制数据库的内容
我正在开发一个涉及用户可编辑内容的Web项目,并且我希望能够对存在于数据库中的实际内容进行版本跟踪。基本上,我想实现Wiki样式的更改历史记录。 做一些背景研究,我看到了很多有关如何对数据库模式进行版本控制的文档(实际上已经控制了我的数据库),但是关于模式跟踪数据库内容变化的任何现有策略都至少在模式版本控制方面大失所望。在我的搜索中。 我可以想到几种实现我自己的变更跟踪的方法,但它们似乎都非常粗糙: 保存每次更改的整个行,并使用主键将行与源ID相关联(这是我目前最倾向于的方法,这是最简单的方法)。但是,许多小的更改可能会导致很多桌子膨胀。 保存每个更改之前/之后/用户/时间戳记,并使用列名称将更改关联回相关列。 用每列的表保存之前/之后/用户/时间戳(会导致表过多)。 使用列将每个更改的差异/用户/时间戳记保存起来(这意味着您必须遍历整个干预更改历史记录才能返回到特定日期)。 最好的方法是什么?自己动手似乎是在重塑别人的(更好)代码库。 PostgreSQL的加分点。

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.