软件工程

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

4
使用struct强制验证内置类型
通常,域对象具有可以用内置类型表示的属性,但是其有效值是可以用该类型表示的值的子集。 在这些情况下,可以使用内置类型存储值,但是必须确保始终在输入点验证值,否则我们最终可能会使用无效值。 解决此问题的一种方法是将值存储为自定义struct,该自定义具有private readonly内置类型的单个后备字段,并且其构造函数会验证提供的值。然后,我们始终可以确保仅通过使用此struct类型来使用经过验证的值。 我们还可以提供与底层内置类型之间的强制转换运算符,以便值可以作为底层类型无缝地进入和退出。 以一个例子为例,其中我们需要表示域对象的名称,并且有效值是长度在1到255个字符(含)之间的任何字符串。我们可以使用以下结构来表示: public struct ValidatedName : IEquatable<ValidatedName> { private readonly string _value; private ValidatedName(string name) { _value = name; } public static bool IsValid(string name) { return !String.IsNullOrEmpty(name) && name.Length <= 255; } public bool Equals(ValidatedName other) { return _value == other._value; } public override bool …
9 c#  .net 

5
服务器终止时正确处置对象
我正在从事大型C ++项目。它由公开REST API的服务器组成,为包含许多其他服务器的非常广泛的系统提供了一个简单且用户友好的界面。该代码库很大且很复杂,并且随着时间的流逝而没有适当的设计前期。我的任务是实现新功能并重构/修复旧代码,以使其更稳定,更可靠。 目前,服务器创建了多个长寿命对象,这些对象在进程终止时不会终止或处置。这使得Valgrind几乎无法用于泄漏检测,因为不可能区分成千上万(合法地)合法泄漏与“危险”泄漏。 我的想法是确保在终止之前将所有对象都处置掉,但是当我提出此建议时,我的同事和老板反对我指出操作系统将以任何方式释放内存(这对每个人都是显而易见的)并处置对象将减慢服务器的关闭速度(目前基本上是对的调用std::exit)。我回答说,拥有一个“干净的”关闭程序并不一定意味着必须使用它。如果我们感到不耐烦,我们可以随时致电,也可以std::quick_exit只是kill -9这个过程。 他们回答说:“大多数Linux守护程序和进程都不会在关闭时释放内存”。虽然我可以看到,但确实我们的项目确实需要准确的内存调试,因为我已经发现内存损坏,双重释放和未初始化的变量。 你怎么看?我在追求无意义的努力吗?如果没有,我该如何说服我的同事和老板?如果是这样,为什么,我应该怎么做?
9 c++  debugging  memory 

1
CC许可证(0,BY,BY-SA)如何影响专有/封闭源应用程序?
我认为这个问题是特定于独立开发人员所关心的。将其视为“许可证澄清”或“许可证实际使用案例”。 我需要知道我的项目基本软件包的结构如何以及如何分发它? 我是一个应用程序开发人员,我还没有网站,我将创建代码((B包将是我用非常有限的技能设法创建的)占位符资产,或者以后可以购买以使我的项目中有一些资产独特的视觉/ sfx /音乐功能(如果它与程序包(C)不以任何可能引起麻烦的方式发生冲突)。 我认为: A)二进制专有可执行应用程序包(无源分发)。 B)专有媒体的媒体/资产包(可以与(A)打包在一起)。 C)CC内容的媒体/资产包。 关于程序包(C)的问题是: CC-0是我唯一能解决的CC内容吗?我将必须至少按照以下方式以CC-BY软件包的形式重新分发它:如果我创建了一个包含在CC许可下提供的工作的许可,该许可可能我选择收集 如何在包(C)上使用CC-BY和CC-BY-SA内容?如我所读,任何CC-BY-SA至少都会干扰屏幕截图,视频和其他任何推广媒体(但是,除非我自己创建项目的过场动画,否则推广媒体至少对我来说没有太多麻烦) 。 除了(2)中指定的内容以外,任何CC-BY-SA内容是否会对包装(A)或(B)产生影响?那么(A)或(B)是否必须属于某些CC许可? 是否通过CC-BY-SA条款“为了避免疑问,在作品是音乐作品,表演或录音制品的情况下,将作品与运动图像按时间关系进行同步(“同步”),就本许可而言。” 会迫使我以我的项目引擎的同步代码部分(甚至是完整的源代码)的开源形式自由分发我的项目吗?考虑该项目可能被视为“绩效”。 应用程序运行可能需要软件包(C),因此,在牢不可破的情况下,它会以任何方式影响应用程序许可证吗?另外,如果我能够在没有它的情况下运行该应用程序,该应用程序是否还会受到它的影响? 我可以单独分发软件包(C)和我的应用程序,以后,用户(购买者)可以自由地重新分发软件包(C),甚至将其发布在重新分发CC内容的网站上吗?还是我被迫立即在我的网站(或将要出售它的网站)和/或其他网站上免费提供该软件包?还是只能从其他站点分发它,而只能从我的站点链接到它? PS .:确认答案的许可代码摘录大受赞赏!我一直在尝试阅读和理解所有内容,但是这对我来说肯定不容易...其他授予的信息来源,例如常见问题解答或其他种类,可能也足够好(因为它们通常指的是许可证代码,使其更易于理解)。 PS.2:对于感兴趣的任何人,有一些有趣的常识性概念,可用于了解公共领域的媒体:http : //pixabay.com/en/blog/posts/public-domain-images-what-is-allowed-and-what -is-4 /

3
我应该在哪里存储测试数据?
我有一些较小的单元测试,它们使用真实数据集中的小片段。由于多种原因,我还想针对完整的数据集测试我的程序。唯一的问题是单个真实数据集约为5GB。我还没有找到关于Git存储库可以存储的任何硬数字,但这似乎太多了。 根据该程序员的帖子,我应该将测试项目所需的所有数据保留在存储库中。 我的团队采用的解决方案是该项目具有一个文件,该文件包含指向包含我们的测试数据的网络连接文件系统的路径。该文件被Git忽略。 我觉得这是一个不完善的解决方案,原因有两个。当NAS无法正常工作,运行缓慢或出现故障时,我们将无法进行全面测试。第二个原因是,当某人第一次克隆存储库时,单元测试失败,因此他们必须弄清楚如何使用特定名称挂载事物以及用于构建测试路径文件的语法。 所以我的问题有两个。多少数据就是太多数据无法存储在修订控制中? 什么是处理大量测试数据的更好方法?
9 testing 

1
为什么GCC默认使用AT&T语法?
我认为标题说明了一切:) GCC使用AT&T / GAS语法有什么特殊的实际原因(我想这主要是历史原因,但我自己找不到)。 注意:我知道这只是默认设置,您可以对其进行切换 注2:我个人认为“英特尔语法”更具可读性,所以这使我感到惊讶。
9 history  assembly  gcc 

5
Scrum:用户故事的设计/ UX是否可以在与实现相同的冲刺中发生?
我目前处于冲刺阶段(两个星期),设计师负责定义特定用户故事的需求和用户体验。 在同一个Sprint中,我要实现此设计。在sprint计划期间,我不得不对这个不确定的用户故事需要花费多长时间进行大胆猜测。 今天,我终于收到了设计。不幸的是,设计是不完整/模糊的,比设计更类似于客户的要求。但是,从这一点上,我仍然可以看出,我的估计还不够。 更糟的是,这不是第一次。在最后的冲刺中,发生了完全相同的事情。我在回顾中标记了它,Scrum主管没有解决该问题的答案,而是说“这只是您的发展”。具有讽刺意味的是,如果烧毁没有达到目标,他会感到恼火。 现在,我将不得不咨询/与设计师合作才能完成工作。当我完成所有其他任务时,这将使我受挫。 所以我的问题是 A)您如何处理Sprint计划中的依存关系?编辑:可以在与实现相同的冲刺中进行用户故事的设计/ UX吗 B)我现在应该如何处理冲刺?重新估计当前的用户情况,并观察燃尽状态变成燃尽状态并被视为不称职/无效?或按照“帮助设计人员创建合适的设计”的方式向当前的sprint添加新任务
9 agile  scrum  planning 

1
设计一个应用程序框架,该框架将允许每个实现自定义UI的各个部分
我的任务是设计一个应用程序框架,该框架将允许每个实现自定义用户界面的各个部分。一个这样的例子就是实现(现在称它为客户端)可以定义要返回到特定屏幕的集合视图单元格。该框架仅负责出售适当的对象,以使构建应用程序变得更加容易,因为我们将构建一些外观相似的实例。 我目前对框架的方法是设计一个协调控制器,该控制器负责整个App中的所有演示和解雇事件。默认的Coordination Controller售卖框架内所有默认视图控制器,它们全部执行其相关任务,而不必提供配置的UI。例如:一个控制器将显示一个包含模板单元格的集合视图,没有什么特别的。这种设计的好处在于,它消除了控制器之间的耦合,还允许客户端覆盖默认的协调器,并为特定任务返回全新的视图控制器。 我遇到的问题是如何设计该框架,以允许客户端将自己的自定义UI添加到App中。 方法一 使框架需要一个视图工厂,并让该视图工厂负责出售所有相关视图。因此,在App Delegate中,我们可能会强制客户端创建一个CollectionViewCellFactory例如,并且该接口定义了任何符合类需要提供的所有单元。我继承了这种设计的代码库,并因为它过于抽象和可定制,而放弃了它。它为App的各个方面提供了大量的工厂,这为每个App的建立时间增加了几天的时间。 方法二 每个视图控制器都指定子类挂钩或设置API,以允许在运行时定义这些自定义UI类(类似于UISplitViewController允许调用者使用viewControllers属性设置控制器的方式)。为此,每个客户只需将基本协调控制器和每个控制器的表示形式子类化即可;在控制器上设置适当的值,以实现所需的UI。就像是 viewController.registerReusableCellsBlock = ^(UICollectionView *collectionView){ //perform custom registration } viewController.cellDequeueBlock = ^UICollectionViewCell<SomeProtocol> *(UICollectionView *collectionView,NSIndexPath *indexPath){ //dequeue custom cells } 当前,我将视图的数据源分离到一个单独的对象中,以提高可重用性并防止ViewController膨胀。这使得对视图控制器进行子类化以提供单元的接口更加困难,但并非不可能。 方法3 尝试设计框架并预期其使用可能是一个坏主意。也许最好的选择是允许子集具有最大的控制权,即使设置成本相对较高。然后,为多个客户构建了该模型之后,我可能会注意到出现的模式并开始沿路线进行优化。 我了解如何在框架内部进行自定义,而我正在努力解决的问题是如何最好地定义一个接口,该接口定义客户端对框架的潜在自定义点。 TL; DR 界面最复杂的部分涉及嵌套在“集合视图”单元格内的“集合视图”。这允许单元的水平分页和垂直滚动。这可以通过拥有一个管理水平单元格并使用新数据源配置每个单元格的收集视图的数据源来实现。 如何设计一个允许所有这些单元都可自定义的接口?

2
对有状态的框架(例如Phaser)进行单元测试?
TL; DR在确定有状态的框架中工作时,我需要帮助您确定简化自动化单元测试的技术。 背景: 我目前正在用TypeScript和Phaser框架编写游戏。Phaser将自己描述为一个HTML5游戏框架,该框架试图尽可能少地限制代码的结构。这需要进行一些权衡,即存在一个上帝对象的Phaser.Game,它可以让您访问所有内容:缓存,物理,游戏状态等。 这种状态性使得很难测试很多功能,例如我的Tilemap。让我们来看一个例子: 在这里,我正在测试我的瓷砖图层是否正确,并且可以在我的Tilemap中识别墙壁和生物: export class TilemapTest extends tsUnit.TestClass { constructor() { super(); this.map = this.mapLoader.load("maze", this.manifest, this.mazeMapDefinition); this.parameterizeUnitTest(this.isWall, [ [{ x: 0, y: 0 }, true], [{ x: 1, y: 1 }, false], [{ x: 1, y: 0 }, true], [{ x: 0, y: 1 }, true], …

1
(seed * 9301 + 49297)%233280随机算法的原始来源?
如果您搜索创建种子式(伪)随机数生成器的示例,则会遇到类似以下内容(特定示例http://indiegamr.com/generate-repeatable-random-numbers-in-js/): // the initial seed Math.seed = 6; // in order to work 'Math.seed' must NOT be undefined, // so in any case, you HAVE to provide a Math.seed Math.seededRandom = function(max, min) { max = max || 1; min = min || 0; Math.seed = (Math.seed * 9301 + …
9 history  random 

4
如果我使用GPLv2许可软件来导出数据,是否必须打开源代码?
我自己一个人在做一个日历项目。在这个项目中,我必须使用瑞士星历表。它已获得GPLv2和商业许可。拥有商业版许可,开发人员可以根据自己的意愿分发软件。但这是我的个人项目,因此我必须使用GPLv2许可证。 通过使用库和数据文件,我可以为日历生成数据。以后,我将在网站上免费发布这些日历。显然,在此过程中,我必须修改库,编写自己的代码和其他杂项。我是否必须打开我的最终源代码。 我没有任何要公开的问题。但是我在问,是否必须这样做。 编辑:从@apsillers和其他人的详细答案中,我很清楚地知道,我不必使我的软件成为GPL,甚至不必向网站的访问者提供源代码。尽管我必须按照该条款将显示的数据设为GPL,但作为瑞士星历数据,已获得GPLv2或更高版本的许可,并且可以商业使用: 更一般而言,当程序将其输入转换为其他形式时,输出的版权状态将继承其生成的输入的版权状态。

4
在DAL和BLL层之间分离检索数据和业务对象
在发布此问题之前,我做了一些研究。在其他问题或帖子中,下面提供其中一个。我不清楚如何确定。 数据访问层中的业务对象 我有一个存储库,业务层调用该存储库以检索数据。例如,说我有以下BLL和DAL类: class BllCustomer { public int CustomerId {get; set;} public String Name {get; set;} public BllAddress Address {get; set;} } class BllAddress { public int AddressId {get; set;} public String Street {get; set;} public String City {get; set;} public String ZipCode {get; set; } } class DalCustomer { …

3
如何最好地让初级开发人员从头开始设计应用程序?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 我们是一个由3个开发人员(2个经验丰富的开发人员和一个初级)组成的团队。 我们刚刚启动了一个全新的项目。我们已经设计了应用程序,致力于选择正确的体系结构,现在我们在代码的第一行打下基础。我们正在编写它的核心,它将成为整个应用程序的基础。 这也不是一件容易的事。硬性能要求,大规模分布,复杂的实体模型等 我们都超出了我们的舒适范围,尤其是大三学生。他没有创建好的设计的经验。但这不是问题,因为我和其他开发人员会在这里提供帮助,并且我们都相信指导和建立团队,但是...我们不知道确切的最佳做法是什么,以便他得到令人愉快的经历,并学习最大程度的技能。 我们俩都意识到,我们对新项目没有大三,而只是对现有项目没有大三,因为他有一个完整的代码库可供学习和启发,因此对大三生来说比较容易。但是对于这个程序,我们几乎没有代码。我们才刚开始。 我们正在考虑以下几种方法: 让他自己尝试几天,然后与他一起干预并重构代码,将他引导到正确的方向,然后重复=>可能对他来说不是一个有趣的经历,因为我们将在每次重构中指出他的错误; 让他与我们其中的一对结伴编程=>他可能会成为“旁观​​者”并同意我们所做的一切,而不会实际学习很多知识或消化很多信息; 让我们用坚固的设计来构建每个模块的骨架,然后将其交给他以添加缺少的部分=>在我们之后接起来可能没什么好玩的,并且存在他可能只专注于填补空白的风险而不是整个设计。 我们如何才能使他参与设计,以使他不会觉得自己被设计遗忘了,从而使他从经验中学到很多东西,并获得足够的信心来自己尝试设计?

3
需要帮助来确定联赛排程算法
我正在尝试创建体育联赛调度程序。我无法确定一种算法来帮助我有效地填写每个位置。 建立时间表的样本数据为: 10支 每个团队互相比赛1次(总共需要45场比赛) 每队每天最多玩1次 在我的测试中,我使用9天,每天5个广告位。 组合表(包含45个连击) ID Team1ID Team2ID位已 分配 时间表表(包含45个时隙) scheduleID homeTeamID awayTeamID GameDate GameTime 现在,我现有的过程将填补约90%的插槽,而剩下10%的插槽将留空,以免基于上述规则发生调度冲突。 我以递增的日期/时间顺序遍历我的计划表。 我的第一个时段可能是星期六上午8点。 我查询尚未安排的球队名单。然后,我对这些团队进行了一系列可能的组合。然后,我使用该数组从我的组合表中从尚未安排的组合中提取1条随机记录,然后将这些团队放在计划中。然后,我将该组合设置为使用状态。 我一遍又一遍地重复循环,每次我的可用团队列表变小,结果数组也变小。 我发现有些日子过得很好,而在另一些日子里,我最后剩下的最后两支球队已经在前一周打过球,因此不再被添加到日程表中。 我还没有尝试过的唯一方法就是“重置”冲突天数,然后再试一次以查看我是否能获得更好的排名。 有没有人有什么建议?

2
Golang / Haskell中的类型推断
我已经读过,从ML或Haskell之类的功能语言的意义上讲,Go实际上没有真正的类型推断,但是我无法找到一个简单易懂的两个版本的比较。有人可以用基本术语解释Go中的类型推断与Haskell中的类型推断有何不同,以及每种方法的优缺点吗?

4
用DDD(或有意义)建立模型关系?
这是一个简化的要求: 用户创建一个Question带有多个Answer的。Question必须至少有一个Answer。 澄清:思考Question并Answer像测试一样:有一个问题,但是有几个答案,其中几个可能是正确的。用户是准备此测试的演员,因此他创建了问题和答案。 我正在尝试对这个简单的示例进行建模,以便1)匹配现实生活模型2)用代码进行表达,从而最大程度地减少潜在的误用和错误,并向开发人员提示如何使用该模型。 问题是实体,答案是价值对象。问题包含答案。到目前为止,我已经有了这些可能的解决方案。 [A]工厂内Question 除了Answer手动创建,我们可以调用: Answer answer = question.createAnswer() answer.setText(""); ... 这将创建一个答案并将其添加到问题中。然后,我们可以通过设置其属性来操纵答案。这样,只有问题才能创造答案。此外,我们会避免没有问题的答案。但是,我们无法控制创建答案的方式,因为答案已在中进行了硬编码Question。 上述代码的“语言”也存在一个问题。用户是创建答案而不是问题的人。就我个人而言,我不喜欢我们创建值对象并依靠开发人员将其填充值-他如何确定需要添加什么? [B]工厂内部问题,参加#2 有人说我们应该在以下方法中使用这种方法Question: question.addAnswer(String answer, boolean correct, int level....); 与上述解决方案类似,此方法将强制性数据用于答案并创建一个也将添加到问题中的答案。 这里的问题是我们无缘无故地复制的构造函数Answer。另外,问题真的会产生答案吗? [C]构造函数依赖 让我们自由地自己创建两个对象。我们还要在构造函数中表达依赖权: Question q = new Question(...); Answer a = new Answer(q, ...); // answer can't exist without a question 这为开发人员提供了提示,因为不能毫无疑问地创建答案。但是,我们看不到“语言”表明答案已“添加”到问题。另一方面,我们真的需要看到它吗? [D]构造函数依赖项,采用#2 我们可以做相反的事情: Answer a1 …

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.