软件工程

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

2
性能类型系统
是否存在试图使程序的性能特征形式化的(静态)类型系统?我似乎找不到找到这样的尝试。 由于类型系统是程序员中有关程序声明的最强大的工具(之一),并且由于在许多情况下性能至关重要,因此想像已尝试进行尝试似乎并不为过。创建一个类型系统,尝试至少对程序的存储和运行时特性做出一些声明。

5
在这种情况下,我应该选择组合还是继承?
考虑一个接口: interface IWaveGenerator { SoundWave GenerateWave(double frequency, double lengthInSeconds); } 此接口由许多类实现,这些类生成不同形状的波(例如SineWaveGenerator和SquareWaveGenerator)。 我想实现一个SoundWave基于音乐数据而不是原始声音数据生成类的类。它会收到音符的名称和以拍子(不是秒)为单位的长度,并在内部使用该IWaveGenerator功能来创建一个音符SoundWave。 问题是,应该NoteGenerator包含IWaveGenerator还是应该从IWaveGenerator实现中继承? 由于两个原因,我倾向于合成: 1 -它让我注入任何IWaveGenerator的NoteGenerator动态。另外,我只需要一个NoteGenerator类,而不是SineNoteGenerator,SquareNoteGenerator等等。 2-无需NoteGenerator公开由定义的较低级接口IWaveGenerator。 但是,我发布此问题是为了听取对此的其他意见,也许是我没有想到的要点。 顺便说一句:我会说NoteGenerator 从概念上讲是an,IWaveGenerator因为它生成SoundWaves。

5
突变方法的单独界面
我一直在进行一些代码的重构,我想我可能已经迈出了第一步。我正在用Java编写示例,但我想它可能是不可知的。 我有一个Foo定义为的接口 public interface Foo { int getX(); int getY(); int getZ(); } 和一个实现 public final class DefaultFoo implements Foo { public DefaultFoo(int x, int y, int z) { this.x = x; this.y = y; this.z = z; } public int getX() { return x; } public int getY() { …

5
在每个冲刺开始时尽早执行子任务
我加入了一个使用敏捷/ Scrum的新团队,其开发过程如下: 1)开发人员在每次冲刺之前都要审查每个故事,以确保它不会遗漏任何关键内容。在工作流中有一个正式的状态。 2)在Sprint启动期间,整个团队都会对每个故事要花费多少故事点进行估算(扑克计划)。 3)最后,在每个sprint开始之后,每个开发人员都必须立即将所有分配的故事快速地分解为带有时间估计的子任务(与开始每个故事之前的子任务不同)。 最后一步的主要论点是,它有助于发现实施故事是否会比预期花费更长的时间,并警告Scrum主管有关缺少冲刺截止日期的潜在风险。 但是我发现这适得其反,主要是由于以下原因: 如果目的是提供粗略的估计,那么故事要点(步骤2)是做什么的。否则,为什么还要烦恼故事点呢?-尽早进行子任务。 如果目的是提供准确的估算值,那么这就是“ 认为有害的人类任务开关”中所描述内容的清晰示例。我认为,对于刚加入现有团队并参与大型项目的新开发人员而言,情况尤其如此,因为他们需要了解需要做什么才能花费多达50%的时间。您需要先进入故事1的详细信息,然后再进入故事2、3等等,等等,这会产生大量的信息流失。 有人告诉我,这种做法是“按书进行的”,甚至我都不打算讨论这一点。谁能提供这种做法的参考-Scrum圣经中是否明确定义了这种做法,并且/或者也许提供了任何额外的见解?
11 agile  scrum 

5
比较三个数字的简单方法
我有一些代码,其中包含一系列if可以正常工作的,但是感觉很混乱。基本上,我想选择三个整数中最大的一个,并设置一个状态标志来说明选择了哪个。我当前的代码如下所示: a = countAs(); b = countBs(); c = countCs(); if (a > b && a > c) status = MOSTLY_A; else if (b > a && b > c) status = MOSTLY_B; else if (c > a && c > b) status = MOSTLY_C; else status = DONT_KNOW; 这种模式会发生几次,并且变量名较长,从视觉上确认每一个if都是正确的会有些困难。我觉得可能会有更好,更清晰的方法来执行此操作;有人可以建议什么吗? …
11 algorithms  c 

1
为什么无法在C#中重载复合赋值运算符?
标题具有误导性,因此请阅读整个问题:-)。 所谓“复合赋值操作符”我心里有这样的结构op=,例如+=。纯赋值运算符(=)不属于我的问题。 “为什么”我不是指观点,而是某些设计师或其同事等表达其推理(即设计选择的来源)时的资源(书,文章等)。 我对C ++和C#中的不对称感到困惑(是的,我知道C#不是C ++ 2.0)-在C ++中,您将重载运算符+=,然后几乎完全+依靠先前定义的运算符自动编写适当的运算符。在C#中是相反的-您过载+并+=为您综合了。 如果我没记错的话,后面的方法在使用real时会失去优化的机会+=,因为必须创建新的对象。因此,这种方法必须具有很大的优势,但是MSDN却不愿透露任何信息。 我想知道这样做的好处是什么,因此,如果您在C#书籍,技术讲座视频,博客文章中发现了解释,我将不胜感激。 我发现最接近的是Eric Lippert博客上的评论为什么C#中重载运算符总是静态的?汤姆·布朗(Tom Brown)。如果首先确定了静态重载,则它仅指示可以为结构重载哪些运算符。这进一步指示了可以为类重载的内容。

8
是否根据日期打开和关闭UI(或其他)功能(一种代码气味)?
我们有一个用ASP.NET 2.0编写的糟糕的系统,我们需要向其中添加一些功能。问题在于,某个产品具有UI功能,对于在特定日期(其他时间已关闭)之后启动的业务,必须打开该UI功能,而页面必须与现有业务的外观相同。 我本能地发现基于日期的JavaScript UI开关的想法,而将新老业务的Web控件混合在一起是“不统一的”(因为想要一个更好的词),所以我努力为新业务重写页面)。 使用基于时间的UI的做法是否已被广泛接受,如果没有,采取该措施的已知风险是什么?

2
排他性代码权利如何工作?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 4年前关闭。 客户要求我为他要构建的Web应用程序提交建议。到目前为止,该客户是一家具有相对较好吸引力的初创企业。 我被要求草拟一份合同,以阻止我在其他任何地方编写为他们编写的任何代码。到目前为止,我正在起草合同,在这些合同中,我保留了对源代码的专有权利,但客户也保留了所有权利(销售,修改等)。 所以这对我来说听起来很奇怪: 如果我有另一个具有相似(但不完全相同)项目的客户,他想让我开发他的应用程序怎么办? 当然,我不会从先前的项目中复制和粘贴-但对我来说,我将无法使用在先前的项目中获得的任何见解,也无法再次编写此代码对于任何客户。 因此,问题是-如果我将源代码的所有权利提供给客户端,这是否意味着我永远无法为他人重写此代码? 注意:我知道你们中的大多数人不是律师,我并不是在真正地寻求法律建议,而是这些类型的合同对源代码的所有权的真正含义,通常要做的事情等。

4
如何在Python中为部分日期建模?像是未知的年份或月的未知日期?
我希望能够捕获诸如Bob was born in 2000和的事实Bill's birthday is May 7th。 在这两个示例中,我们仅知道该人的生日的一部分。在一种情况下,我们只知道年份;在其他情况下,我们知道月份和日期,但不知道年份。 如何捕获此信息? 有关如何工作的一些示例: 想象一下像datetime这样的库,它允许字段中的None代表未知数。我可能有如下代码: date_a = date(2000, 5, None) date_b = date(2000, 6, None) difference = date_b - date_a assert difference.min.days == 1 assert difference.max.days == 60 # Or something close to 60. assert equal(date_a, date_b) == False date_c = date(2000, …
11 python 

6
在git中,如何对十二个库进行版本控制
我们正在做项目,但是我们在项目之间重用了很多代码,并且有很多包含我们共同代码的库。在实施新项目时,我们发现了更多方法来分解通用代码并将其放入库中。这些库相互依赖,而项目则取决于这些库。每个项目以及该项目中使用的所有库都需要使用它们所引用的所有库的相同版本。如果我们发布某个软件,则我们将不得不修复错误,并可能添加许多年甚至数十年的新功能。我们有大约十二个库,更改通常跨越两个以上,并且几个团队并行处理多个项目,并同时对所有这些库进行更改。 我们最近已切换到git并为每个库和每个项目设置存储库。我们使用存储作为公共存储库,在功能分支上进行新工作,然后发出拉取请求并仅在审阅后合并它们。 我们必须在项目中处理的许多问题都要求我们在多个库和项目的特定代码之间进行更改。这些通常包括库接口的更改,其中一些不兼容。(如果您认为这听起来有些可疑:我们与硬件进行交互,并将特定的硬件隐藏在通用接口之后。几乎每次我们集成其他供应商的硬件时,都会遇到我们当前的接口无法预期的情况,因此必须对其进行完善。)例如,假设一个项目P1使用的库L1,L2和L3。L1还采用了L2和L3,并L2使用L3为好。依赖关系图如下所示: <-------L1<--+ P1 <----+ ^ | <-+ | | | | +--L2 | | ^ | | | | +-----L3---+ 现在,想象一下此项目的功能需要更改,P1并L3更改的界面L3。现在添加项目P2并添加P3到组合中,它们也引用这些库。我们不能将它们全部切换到新界面,运行所有测试并部署新软件。那有什么选择呢? 在中实现新接口 L3 提出请求L3并等待审查 合并变更 创建一个新版本 L3 P1通过参考L3的新版本开始使用该功能,然后在其P1功能分支上实现该功能 提出拉取请求,对此进行审核并合并 (我只注意到我忘了切换L1,并L2到新版本,而我甚至不知道在哪里要坚持这一点,因为这将需要同时做同P1...) 这是一个繁琐,容易出错的过程,并且实施此功能的过程非常漫长,它需要进行独立审核(这使得审核变得更加困难),根本无法扩展,并且有可能使我们停业在过程中陷入困境,我们永远都做不完。 但是,如何使用分支和标记来创建一个流程,使我们能够在新项目中实现新功能而又没有太多开销?

2
RTOS与Bare Metal在MCU编程方面的优势?
请注意:这个问题专门提到了两个RTOS,但更为通用,以前曾为嵌入式RTOS编写过C代码并且直接在MCU上运行其软件的任何人都可以回答。 我有兴趣了解有关嵌入式RTOS的更多信息并为其编写应用程序。我目前正在查看Embox和RIOT,因为它们是开源的,现代的,活跃的并且似乎有出色的文档。我的目标分为两个阶段:第一阶段是弄清楚如何将这些OS编译并刷新到MCU(可能是AVR或ARM)。然后,第2阶段将编写一个简单的C程序(基本上是一个无头的守护程序),该程序会随着时间的流逝而发展为“业余应用程序”。然后,我将该程序刷新/部署到同一MCU,从而成功部署了一个由Embox / RIOT和位于其之上的应用程序组成的应用程序堆栈。 在走上任何最终导致死胡同的道路之前,我偶然发现了这篇文章,很好地解释了为什么用C /汇编器编写并闪存到MCU的实时应用程序真正不需要它们下面的RTOS。 。 所以现在我真的很困惑,并且质疑我对计算理论的一些基本理解。我想我想首先决定是否使用Embox / RIOT,或者: 保持进度,并在两个OS +应用程序的MCU上使用“应用程序堆栈”;要么 请留意本文的警告,并选择运行我的应用程序“裸机”的MCU 显然,前者需要做更多的工作,因此最好还是有一个很好的理由/选择那条路线。因此,我想问:这些(和类似的)嵌入式RTOS为MCU / C应用程序开发人员提供的真正好处是什么?使用RTOS,我的C应用程序可以从哪些特定功能中受益(也许不重新发明轮子?)?抛弃RTOS并裸机失去了什么? 我在这里要求具体的例子,而不是当您进入RTOS的Wikipedia条目时获得的媒体宣传;-)

2
您将使用什么数据结构来表示有机化合物?
是否有任何可以用来表示分子的良好数据结构? 我当时想也许我可以通过使每个原子成为一个顶点来表示为图,但是,有机化合物通常含有大量的碳和氢。你怎么编号?是否存在代表分子的好方法,但同时又有一种有效的.contains()方法? 最基本的用途之一是检查化合物是否含有羰基,苄基氢或什至苯环。

2
是否可以通过使用二进制搜索树进行单独链接来加快哈希表的速度?
我想使用二进制搜索树实现哈希表,以减少从O(n)(使用链表)到O(log n)(使用BST)的单独链接过程中的搜索复杂性。可以这样做,如果可以,怎么办?如果解决方案是逐步实施的,则逻辑将更容易理解。 我想减少哈希表中的“搜索”时间(使用单独的链接进行构建),但同时我不想增加插入时间。对于我的项目,我无法更改哈希函数以减少冲突。但是由于可伸缩性,冲突正在发生。我试图找到一种解决方法,以便在发生冲突的情况下以某种方式使用最佳访问并插入时间...即管理事物的当前状态,而不是重构整个算法。如果没有成功,则必须进行重组。有什么想法吗?

3
如何以编程方式监视长时间运行的程序
我现在得到的可以用这个伪代码来总结: public static void Main(string[] args) { var listOfObjects = Database.GetObjectsToUploadToOnlineService(); Parallel.ForEach(Upload) } private static void Upload(MyUploadObject obj) { //Build object (takes a few milliseconds) //Format to JSON (takes a few more milliseconds) //Upload (can take up to a max of 10 minutes) //Wait for a response (can take up …

1
在对较早的提交进行修复时,我应该重新设置基础还是添加单独的修复提交?
软件开发中的一种常见情况是代码检查其他人的代码。执行此操作的常用工具是打开请求请求。 我的问题是,当在审查中发现问题时,是否应进行更改 分开提交(新提交) 还是应该修改现有的提交(假设没有人从您先前的提交中分支出来,因为从共享分支重写历史记录是个坏消息)。 对于第一种情况,尽管它会在提交历史记录中增加一些噪音,但是很容易跟踪增量更改。第二种选择具有相反的优点和缺点。

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.