软件工程

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

3
由于什么原因,您会为Swift中的每个委托使用单独的类扩展?
我正在阅读Ray Wenderlich教程,并且注意到作者使用类扩展来保存委托回调,而不是让它们在类本身中进行处理,即: 类扩展内的委托回调: extension LogsViewController : UIPopoverPresentationControllerDelegate { func adaptivePresentationStyleForPresentationController(controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { ... } } 而不是将其包含在类中: 在类内委托回调: class LogsViewController : UITableViewController, UIPopoverPresentationControllerDelegate { func adaptivePresentationStyleForPresentationController(controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { ... } } 我同时发现这很奇怪也很有趣。他有一个专门用于LogsViewController类的扩展的文件,名为“ LogsViewControllerExtension.swift”,并且每个委托协议都有一个不同的扩展名:UITableViewDataSource,UISplitViewDelegate等,即: 多个类扩展,每个都有自己的文件中的委托回调: extension LogsViewController: UISplitViewControllerDelegate { ... callbacks } extension LogsViewController …

4
如何测试依赖于复杂API(例如Amazon S3)的代码?
我正在努力测试一种将文档上传到Amazon S3的方法,但是我认为这个问题适用于任何非平凡的API /外部依赖。我只提出了三种潜在的解决方案,但似乎没有一个令人满意的: 请运行代码,实际上传文档,使用AWS的API检查文档是否已上传,然后在测试结束时将其删除。这将使测试非常缓慢,每次运行测试都将花费金钱,并且永远不会返回相同的结果。 模拟S3。这是超级毛茸茸的,因为我不知道该对象的内部,并且感觉太错了,因为它太复杂了。 只要确保使用正确的参数调用MyObject.upload(),并相信我正确使用了S3对象。这使我感到困扰,因为无法确定仅从测试中就正确使用了S3 API。 我检查了亚马逊如何测试他们自己的SDK,以及它们是否在模拟一切。他们有一个200行的助手来进行模拟。我觉得这样做不可行。 我该如何解决?
13 testing  mocking 

4
我应该只为Windows部署32位版本,还是同时部署32位和64位版本?
我有一个用编译语言编写的跨平台应用程序。 对于Linux,习惯上可以同时使用amd64和i386版本,因此用户可以选择适合其当前环境的版本。 在Mac中,习惯上制作通用二进制文件,因此它可以支持多个版本的Apple计算机。或者仅提供64位版本,因为当前所有的Apple计算机都使用64位体系结构和OS。 我不想让用户困惑,问“您使用的是什么体系结构?”,但是仅部署32位是个坏主意,因为该程序使用了一些64位优化魔术,并且在这些计算机上运行得更快。 我的想法: 安装32位和64位版本的应用程序,然后在运行时选择。(需要包装程序,因此很难进行点击并启动应用程序(如uTorrent))。 User-agent在网站上使用来检测体系结构,以便用户可以自动下载适当的版本(并链接到“替代版本”)。(这是Google Chrome风格) 强制用户使用32位应用程序并将64位版本设置为“仅限专家”?(如VLC) 在Windows中我该怎么办?

3
在某些情况下如何引起程序员的注意?
让我们从一个例子开始。 比方说,我有一个称为方法export,该方法在很大程度上取决于数据库架构。“严重依赖”是指我知道(经常)向特定表中添加新列会导致相应的export方法更改(通常也应将新字段也添加到导出数据中)。 程序员通常会忘记更改export方法,因为还不清楚您是否应该看一下。我的目标是迫使程序员明确决定是否要忘记查看该export方法还是只是不想在导出数据中添加字段。我正在寻找针对此问题的设计解决方案。 我有两个想法,但它们都有缺陷。 智能的“阅读所有”包装 我可以创建智能包装器,以确保显式读取所有数据。 像这样: def export(): checker = AllReadChecker.new(table_row) name = checker.get('name') surname = checker.get('surname') checker.ignore('age') # explicitly ignore the "age" field result = [name, surname] # or whatever checker.check_now() # check all is read return result 因此,checker断言if是否table_row包含另一个未读取的字段。但是,所有这些东西看起来有点沉重,并且(可能)会影响性能。 “检查该方法”单元测试 我可以创建一个能够记住最后一个表模式的单元测试,并且每次更改表时都会失败。在那种情况下,程序员会看到类似“不要忘了检查export方法”的信息。要隐藏警告程序员,可以(或不会-这是一个问题)签出export并手动(这是另一个问题)通过在其中添加新字段来修复测试。 我还有其他一些想法,但是它们太难实现或难以理解(我不希望该项目成为难题)。 上面的问题只是我不时遇到的更多问题的一个示例。我想绑定一些代码和/或基础结构,因此更改其中的一个代码会立即提醒程序员检查另一个代码和/或基础结构。通常,您有一些简单的工具,例如提取通用逻辑或编写可靠的单元测试,但是我正在寻找更复杂情况的工具:也许我现在知道一些设计模式。

3
您如何安全地重构具有动态范围的语言?
对于那些有幸不使用动态范围内的语言的人,让我稍微介绍一下它的工作原理。想象一下一种伪语言,称为“ RUBELLA”,其行为如下: function foo() { print(x); // not defined locally => uses whatever value `x` has in the calling context y = "tetanus"; } function bar() { x = "measles"; foo(); print(y); // not defined locally, but set by the call to `foo()` } bar(); // prints "measles" followed by …

3
多个Oauth2访问令牌
我有一个使用oAuth2的API和我自己的使用此API作为后端的移动应用。由于用户可以同时通过多个设备(例如iPhone,iPad,Android平板电脑或Android手机)登录,因此我需要API来区分每个连接。我想通过单独的访问令牌来执行此操作:每个客户端都获得一个单独的访问令牌。 问题是我们使用的当前实现(spring-security-oauth2)基于client_id,用户名和范围生成唯一的密钥。因此,基本上,当获得访问令牌时,所有客户端都会为同一用户获得相同的访问令牌。这是使用DefaultAuthenticationKeyGenerator完成的。 忽略身份验证密钥生成器并仅在来自客户端的每个请求上简单地创建一个新的访问令牌是否安全?
13 spring  oauth2 

4
模拟是否违反开放/封闭原则?
前段时间,我在找不到的Stack Overflow答案上读了一句话,该句子解释您应该测试公共API,而作者说您应该测试接口。作者还解释说,如果更改了方法实现,则无需修改测试用例,因为这样做会破坏确保被测系统正常工作的契约。换句话说,如果方法不起作用,则测试应该失败,但这不是因为实现发生了变化。 当我们谈论嘲笑时,这引起了我的注意。由于模拟在很大程度上依赖于被测系统依赖项的期望调用,因此模拟与实现紧密相关,而不是与接口紧密相关。 在研究模拟与存根时,有几篇文章认为应该使用存根而不是模拟,因为它们不依赖于依赖项的期望,这意味着测试不需要了解测试实施中的基础系统。 我的问题是: 模拟是否违反开放/封闭原则? 在上一段中支持存根的论点中是否缺少某些内容,使存根与模拟不那么好? 如果是这样,什么时候可以模拟一个好用例,什么时候可以使用存根?

3
是否可以同时具有欺骗和可变参数功能?
我正在考虑在动态类型的函数编程语言中同时提供currying和variadic函数,但是我想知道是否可行。 这是一些伪代码: sum = if @args.empty then 0 else @args.head + sum @args.tail 据说应该总结所有的论点。然后,如果sum本身被视为数字,则结果为0。例如, sum + 1 等于1,假设它+只能对数字起作用。但是,即使sum == 0是真的,sum无论给出多少个参数(因此同时“部分应用”和“变量”),它都将仍然保持其值和功能属性,例如,如果我声明 g = sum 1 2 3 则g等于6,但是,我们仍然可以进一步应用g。例如,g 4 5 == 15是真的。在这种情况下,我们不能用g文字替换对象6,因为尽管它们在被视为整数时会产生相同的值,但它们内部包含不同的代码。 如果将这种设计用于真实的编程语言中,是否会引起任何混淆或歧义?

2
超过16八百万的NPath复杂性是否现实?还是我损坏了工具?
我刚刚使用PHPMD(http://phpmd.org/)测量了一大段PHP代码(1153行),它告诉我代码的NPath复杂度为16244818757303303403077832757824。 在我看来,这似乎是一个疯狂的数字,这表明PHPMD可能已经以某种方式崩溃了。人类编写的一段代码甚至有可能具有如此高的NPath复杂性吗?圈复杂度为351。 两个可能重要的细节- 这是与HTML混合在一起的过程代码,PHPMD仅会测量面向对象的代码。为了解决这个问题,我用一个函数将整个文件包装在一个类中-这代表了如何使用它。 该文件由一系列嵌套的switch语句组成,并且在其中包含许多if..else语句-因此它确实非常复杂。 编辑 我想澄清的是,我不是在问PHPMD是否在骗我。我知道代码是一团糟,我只是想知道任何代码是否真的有那么糟糕。答案似乎是肯定的,这很有可能。
13 php  code-quality 

4
是否鼓励使用单字母变量?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 Java是否鼓励使用单字母变量?在代码段或教程中,您经常会看到它们。我无法想象使用它们会受到鼓励,因为它使代码相对难以阅读,而且我从未见过将它们用于其他编程语言!

2
蚁群算法
我是一名学生,正在为课程项目开发蚁群模拟器。它的算法(显然)是蚁群算法。我知道算法的形式多种多样,但是所有这些对于我们来说在数学上都过于详细,因此我们采用了一种方法: 一只蚂蚁出生在一个殖民地,必须从源头收集食物以维持这个殖民地。 所有的蚂蚁都是相似的。 蚂蚁移动的区域是1000x1000的网格,因此每个网格点都可作为蚂蚁占据的有效点。现在,我遇到的所有算法都涉及分别处理顶点和边缘,但是由于我们将蚂蚁的移动限制在四个方向(上,下,左,右),所以我认为将信息素放在何处都没有关系。 上述网格点存储信息素。 蚂蚁仅在携带食物时才会滴下信息素。 对于处于位置(i,j)的蚂蚁,它通过简单的概率公式考虑到其四个相邻节点上的信息素量来决定下一步移动的位置,即,通过(特定相邻节点的信息素数量)/(4个相邻节点的信息素数量之和)。 一只蚂蚁不能回到原来的位置。它只有在有食物的地方或在其殖民地时才能这样做。 现在,我担心的是(以及程序中实际发生的事情)是,当一只蚂蚁FIRST到达有食物并捡起它的位置时,通过我们的算法起作用,它可以移动到任何地方!这是因为它只会留下一条信息素踪迹,一旦它有了食物而不是之前,并且因为它是第一只蚂蚁,就不存在信息踪迹了。 如果蚂蚁可以移动到任何地方,到达食物源后的蚂蚁也往往会跟随它前进。即使它没有移回殖民地,也是如此。这违反了整个算法的目的。 所以我的问题是 上述关注有效吗?如果没有,那为什么呢?如果是,那该如何处理呢? 我们是否需要对算法的基本理解进行一些更改才能使其真正起作用? 在这种情况下,像我这样的新手可能还会错过其他一些微妙但重要的事情吗?

3
GPL可以暗示为衍生作品吗?
共有三个软件项目:A,B和C。 A发布给任何人,并根据GPL许可。 B扩展了A,也已发布,但没有许可证信息或被LGPL错误地许可。基本上,它不是GPL违反了A的许可。B的源代码仍然可用。 C扩展B。C可以在GPL下发布吗?动机是“ A是GPL,任何衍生产品也必须是GPL,所以B也是GPL,C也可以是GPL”。

3
在公司内部不能使用哪些类型的开源许可证?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 最近,我了解了一些针对Microsoft Visual Studio的很棒的开源附加工具和库。这些工具可以帮助您提高生产力。库将链接到公司代码库。 我已经在电子表格中列出了所有这些很酷的工具和库,并且我将逐一列出每个许可证所依据的许可证类型。到目前为止,在很酷的库中,我看到了MIT,BSD和Apache License Version 2.0。但是,将来可能还会有更多。 我如何找出(或者更好的是,您可以列出)与公司内部使用不兼容(不向公司外部分发)的流行许可证?还要谢谢您,您能否说或指出一个解释。我不是律师,阅读这些许可证的精美字样让我感到头疼。 我想准备解释为什么可以使用允许的许可证。

1
为什么需要更高的种类?
一些语言允许带有类型参数的类和函数(例如,List<T>其中T可能是任意类型)。例如,您可以具有以下功能: List<S> Function<S, T>(List<T> list) 但是,某些语言允许将此概念扩展到更高一级,从而使您可以使用带有签名的功能: K<S> Function<K<_>, S, T>(K<T> arg) 其中K<_>本身是List<_>带有类型参数的类型。这种“部分类型”被称为类型构造函数。 我的问题是,为什么需要这种能力?之类的类型是有意义的,List<T>因为所有类型List<T>几乎都完全相同,但是所有类型K<_>可以完全不同。你可以有一个Option<_>和List<_>具有完全没有常见的功能。

3
何时在mysql上使用诸如mongodb之类的nosql数据库?
我是nosql数据库的新手,并且从未使用过它。根据我已阅读的内容和所了解的一点点内容,如果没有外键的概念,如果您不能在数据之间进行引用,我仍然看不到它们如何特别有用。 例如,如何查询“查找此用户发布的所有评论”,“查找属于相册实体的所有照片”等简单信息。 Nosql系统是否远离静态关系数据模型,但仍然让您跟踪此类引用,是否有与外键类似的东西可以在查询中使用?
13 mysql  nosql 

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.