软件工程

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

1
编程中的“解析”是什么意思?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 我在很多地方Resolve都使用过这个词,例如在“依赖注入”(解析接口的实现),“包管理器”(例如:解析包的依赖关系),“ Web”(例如:解析主机名)中。 那么,是什么使代码的逻辑,特别是使一个人选择这个词Resolve在简单的Convert或者Transform甚至是Get?

2
我应该对子类还是抽象父类进行单元测试?
我有一个简单的实现,如Effective Java的第18项(此处扩展了讨论)。它是一个抽象类,提供2个公共方法methodA()和methodB(),这些方法调用子类方法来“填补我无法以抽象方式定义的空白”。 我首先通过创建一个具体的类并为其编写单元测试来开发它。当第二个类到来时,我能够提取常见的行为,在第二个类中实现“缺失的差距”,并且已经准备就绪(当然,单元测试是为第二个子类创建的)。 时光流逝,现在我有4个子类,每个子类实现3个受保护的短方法,这些方法非常具体地针对其具体实现,而骨架实现则完成所有常规工作。 我的问题是,当我创建一个新的实现时,我会重新编写测试: 子类是否调用给定的必需方法? 给定的方法是否具有给定的注释? 从方法A中可以获得预期的结果吗? 从方法B中可以获得预期的结果吗? 虽然看到了这种方法的优点: 它通过测试记录了子类需求 如果重构有问题,它可能会很快失败 对子类进行整体测试,并通过其公共API进行测试(“ methodA()是否起作用?”而不是“此受保护的方法起作用吗?”) 我的问题是对新子类的测试基本上是理所当然的:-这些测试在所有子类中都相同,它们只是更改方法的返回类型(最基本的实现是通用的)和属性I检查测试的断言部分。-通常,子类没有针对其的测试 我喜欢测试集中于子类本身的结果并防止其重构的方式,但是实施测试只是“手动工作”,这一事实使我觉得我做错了。 测试类层次结构时,此问题常见吗?我该如何避免呢? ps:我考虑过测试骨架类,但是创建一个抽象类的模拟对象以进行测试也很奇怪。而且我认为,对抽象类进行的任何重构会改变子类所不期望的行为,因此不会很快被注意到。我的胆量告诉我,“整体”测试子类是这里的首选方法,但是请随时告诉我我错了:) ps2:我已经在Google上搜索了,发现了许多与此主题有关的问题。其中之一是这样的一个具有很大的答案从奈杰尔·索恩,我的情况下,将他的“1号。” 那太好了,但是我现在不能重构,所以我不得不忍受这个问题。如果我可以重构,我会将每个子类都作为一种策略。可以,但是我仍然会测试“主类”并测试策略,但是我不会注意到任何重构会破坏主类和策略之间的集成。 ps3:我找到了一些答案,说测试抽象类“可以接受”。我同意这是可以接受的,但是我想知道在这种情况下哪种方法更可取(我仍然从单元测试开始)

4
并行层次结构-部分相同,部分不同
那里有很多类似的问题 1,2,3,4,但是在这个问题上似乎并非如此,解决方案也不是最优的。 假设多态性,泛型和混合可用,这是一个普遍的OOP问题。实际使用的语言是OOP Javascript(Typescript),但是在Java或C ++中,这是同样的问题。 我有并行的类层次结构,有时具有相同的行为(接口和实现),但有时每个都有其自己的“受保护”行为。像这样说明: 这仅是为了说明目的 ; 这不是实际的类图。阅读: Canvas(左)和SVG(右)层次结构共享公共层次结构(中心)中的任何内容。分享是指接口和实现。 仅左列或右列中的任何内容均表示特定于该层次结构的行为(方法和成员)。例如: 左和右层次结构都使用完全相同的验证机制,Viewee.validate()在通用层次结构上显示为单个方法()。 仅画布层次结构具有方法paint()。此方法在所有子项上调用paint方法。 SVG层次结构需要覆盖的addChild()方法Composite,但是canvas层次结构并非如此。 不能从两个侧面层次结构中混合构造。工厂确保做到这一点。 解决方案I-逗弄继承 Fowler的“逗趣分开继承”在这里似乎不起作用,因为两个相似之处之间存在一些差异。 解决方案II-Mixins 这是我目前唯一能想到的。这两个层次结构是分别开发的,但是在每个级别上,这些类都混合在公共类中,而这并不属于类层次结构。省略structural叉子,将如下所示: 请注意,每列将位于其自己的名称空间中,因此类名不会冲突。 问题 谁能看到这种方法的缺点?谁能想到更好的解决方案? 附录 这是一些示例代码,该如何使用。命名空间svg可以替换为canvas: var iView = document.getElementById( 'view' ), iKandinsky = new svg.Kandinsky(), iEpigone = new svg.Epigone(), iTonyBlair = new svg.TonyBlair( iView, iKandinsky ), iLayer = new svg.Layer(), iZoomer …

3
在Scrum中,开发人员是否应该直接与客户交谈(绕过PO)?
Scrum中的产品负责人应如何处理团队中非常详细的问题,这些问题涉及他们正在实施的,无法立即回答自己的功能?对于开发商而言,何时直接与客户直接对话将是更快的解决方案? 我想知道团队与客户之间的直接交流是否会破坏产品所有者的作用。我认为PO应该专门代表客户,因此可以回答有关要求的所有问题-即使需要更长的时间。绕开他似乎削弱了他的能力,最终使他变得多余。 Scrum中有最佳实践吗?

6
我们如何每隔一周在生产版本中仅包含准备发布的功能?
我是一个相当大的敏捷团队的软件开发人员(我们有8个开发人员积极地对单个代码存储库进行更改)。每隔两周,我们会将软件的新版本投入生产。这是我们当前的工作流程: 在开始新任务时,开发人员在主开发分支(我们使用git)的基础上创建一个“功能分支”,并在此新分支上工作 开发人员完成任务后,将其功能分支合并回开发分支 开发人员将开发分支合并到质量检查分支。 质量检查分支会触发构建。此构建的输出已部署到我们的QA环境中,以允许测试人员开始其测试。 对于我们的测试人员来说,发现这些已合并到QA分支中的新功能的问题很常见。这意味着在任何给定的时间,QA环境都可能包含一些新功能-一些经过测试且没有错误,还有一些已损坏。这使得发布变得困难,因为很少有QA版本处于生产就绪状态。 为了减轻这种情况,我们一直试图启动“质量检查冻结”,这意味着开发人员在发布前几天不会将我们的开发分支合并到质量检查分支中。质量检查环境的错误修复程序直接在质量检查分支中进行,并合并到开发分支中。从理论上讲,这使新的,已损坏的功能无法进入质量检查,同时仍使我们能够解决质量检查中已有的问题。 虽然“质量检查冻结”的概念已部分成功,但很难进行协调,人们常常对是否允许其合并到质量检查中感到困惑。设置“ QA冻结”截止日期也很困难-每个人都喜欢在冻结和发布之间留出一些喘息的想法,但是实际上,他们宁愿在下一个发行版中发挥自己的功能,也不愿遵守截止日期。 是否有更好的方法来确保我们每两周发布一次新版本?

2
准备就绪与完成异步IO内存使用情况?
我看这次谈话有关实现异步IO在锈和卡尔提到了两个潜在的车型。准备和完成。 准备模型: 您告诉内核您要从套接字读取 暂时做其他事情…… 内核会告诉您套接字准备就绪的时间 您阅读(填充缓冲区) 做你需要的一切 释放缓冲区(Rust自动发生) 完成模型: 您为内核分配缓冲区以填充 暂时做其他事情…… 内核会告诉您何时缓冲区已满 对数据做您需要做的一切 释放缓冲区 在使用准备模型的卡尔例如,你可以遍历准备插槽填充和释放一个全球性的缓冲,这使得它看起来像它会使用很多的内存更少。 现在我的假设是: 在底层(在内核空间中),当套接字被称为“就绪”时,数据已经存在。它已通过网络(或从任何地方)插入套接字,并且OS保留了数据。 这似乎并没有在准备模型中神奇地发生内存分配。只是操作系统正在从您那里提取它。在完成模型中,操作系统要求您在数据实际流入之前分配内存,这很明显正在发生。 这是我对“就绪模型”的修订版: 您告诉内核您要从套接字读取 暂时做其他事情…… 修订:数据进入操作系统(内核内存中的某个位置) 内核告诉您套接字已准备好 阅读(填充另一个与上述内核缓冲区分开的缓冲区(或者得到指向它的指针?)) 做你需要的一切 释放缓冲区(Rust自动发生) /我的假设 我碰巧喜欢将用户空间程序保持在很小的位置,但是我只是想澄清一下实际情况。我看不到一个模型会固有地使用更少的内存或支持更高级别的并发IO。我很想听听对此的想法和更深入的解释。
12 async  io 

1
Java 8:在API中传递流以进行惰性操作的良好实践?
在像Guava这样的Java 8之前的lambda繁重库中,输出使用通用的Java Collection Framework接口,因此很容易将它们传递给外部/内部API,并且如果库方法做到了,则仍然可以利用一些惰性计算(例如lazy filter()和transform())。 但是,在Java 8 Streams中,获取Collection/ 的调用Map是终端(即渴望),并且还将分配新的数据结构来保存结果。 对于中间具有多个阶段和策略模式的复杂计算,由于中间结果,这会导致很多不必要的分配。 因此,人们是否认为采用内部API(即策略模式策略)并返回Streams 是一个好习惯,还是我应该退后到懒惰的Guava API而不精简(我想是双关语)? 编辑: 我主要关心的Stream是它只能被消费一次并传递Supplier<Stream<X>>看起来非常笨拙的东西。它几乎迫使您只通过a Collection然后重新stream()通过(并为此付出了急切的评估费用)。
12 java  lambda 

1
k组合的快速索引
我正在重新审视我前一段时间正在研究的一个老问题。 典型的场景是“在8位整数内设置3位”,即00000111。 通过嵌套循环可以轻松地(按顺序)生成具有3个置位的所有唯一组合。我感兴趣的是映射索引<->组合,即“ 00001011”将是第二个组合(或从零开始的索引中的值“ 1”)。 到目前为止,我浏览了所有组合并将它们存储在表中,从而使查找索引->对话成为O(1)操作。另一个方向是对分搜索的O(ln(n))。 但是,不利的一面是,如果我们增加域的范围,这显然会占用大量内存,直到不可行的程度。 计算第n个组合或给定组合的索引的简单方法是什么?组合顺序会很好,但不是强制性的。

2
算法收敛意味着什么?
在阅读有关强化学习的内容时,我会不断遇到这个词,例如,这句话: 如果仔细地对问题进行建模,则某些强化学习算法可以收敛到全局最优值 http://reinforcementlearning.ai-depot.com/ 或在这里: 对于任何固定策略Pi,已经证明上述TD算法可以收敛到VPi http://webdocs.cs.ualberta.ca/~sutton/book/ebook/node62.html 我对“收敛”这个词的理解是,它意味着将多个事物放到同一点,但是单个事物(算法)如何做到这一点?

2
微服务的用户授权
微服务是否应该负责处理自己的授权,或者您认为最好有一个单独的授权服务,该服务在微服务的全部或子集(在同一业务域内)共享? 对我而言,后者更有意义,因为它使更改,执行策略变得更加容易。它是DRY等。但是,通过各种将其规则转储到一个地方的服务,它也很容易失控,并且还担心网络开销。 有什么想法吗?

3
在Golang中使用“ this”
对于Golang而言,最接近于此处的样式指南的东西是这样写的: 方法的接收者的名称应反映其身份。通常,其类型的一个或两个字母缩写就足够了(例如,“ Client”(客户)使用“ c”或“ cl”)。不要使用诸如“我”,“此”或“自我”之类的通用名称,它们是面向对象语言的典型标识符,这些标识符更加强调方法而非功能。该名称不必像方法参数那样具有描述性,因为它的作用是显而易见的,没有任何文档目的。 我个人一直只是使用“ this”作为标识符,因为“ this”是我编写和编辑函数时正在研究的重点。听起来不错,而且(至少对我而言)是有道理的。 如果名称不需要描述,那么它的作用是显而易见的,并且没有记录目的,为什么“ this”的使用会被拒绝?

2
绘制通话图
我正在维护使用python编写的旧代码库。特别是,有一段复杂的代码可以从一个模块调用其他功能,而从其他模块调用其他功能,依此类推。它不是OOP,而只是功能和模块。 每当我调用main函数时,我都试图跟踪流的开始和结束位置,但是我觉得我需要绘制该流,因为我在子调用中迷路了。 让我担心的是,每个函数都在其体内调用多个外部函数以完成其任务并将该值返回给调用者。 我怎么画这个?意味着哪种图表/图形适合于记录这种行为/代码? 因此,我认为绘制UML图和流程图都不有用。通话图,也许吗?

1
ASP.NET MVC中的异步控制器:真正的优势/如何实现?
我一直在阅读有关ASP.NET MVC中异步控制器方法的文章(http://visualstudiomagazine.com/articles/2013/07/23/async-actions-in-aspnet-mvc-4.aspx),我认为我可能错过了重点。 考虑一下我写的这种方法,它与文章中的示例非常相似: [HttpGet] [AsyncTimeout(8000)] [HandleError(ExceptionType = typeof(TimeoutException), View = "TimedOut")] public async Task<ActionResult> Index(CancellationToken cancellationToken) { WidgetPageViewModel model = new WidgetPageViewModel() { toAdd = new Widget() }; model.all = await _repo.GetAllAsync(cancellationToken); return View(model); } 据我了解,这是运行时事物将如何展开的方式: 将为传入的HTTP请求创建一个ASP.NET线程。 该线程将(已经完成了一些必要的初步工作)输入上述我的Index()方法。 执行将到达“ await”关键字,并在另一个线程上启动数据获取过程。 原始的“ ASP.NET”线程将返回调用我的处理程序方法的代码,并将Task类的实例作为返回值。 调用我的处理程序方法的基础结构代码将继续在原始的“ ASP.NET”线程上运行,直到达到需要使用实际ActionResult对象(例如,呈现页面)的程度。 然后,调用者将使用Task.Result成员访问此对象,这将使它(即“ ASP.NET”线程)等待上述步骤3中隐式创建的线程。 与没有等待/异步的同一件事相比,我看不到这完成了什么,除了我认为是琐碎的两件事: 由await创建的调用者线程和工作线程可以并行运行一段时间(上述#5的“直到”部分)。我的预感是这段时间很小。当基础结构调用控制器方法时,我认为它通常需要控制器调用的实际ActionResult才能做更多(如果有的话)。 有一些有用的新基础结构与超时和取消长时间运行的异步控制器操作有关。 添加异步控制器方法的目的应该是释放那些ASP.NET辅助线程以实际响应HTTP请求。这些线程是有限的资源。不幸的是,我没有看到文章中建议的模式实际上如何用于保存这些线程。即使这样做,并且以某种方式将处理请求的负担转移到了一些非ASP.NET线程上,那又完成了什么呢?碰巧能够处理HTTP请求的线程与一般线程有很大不同吗?

2
Python中作用域和名称空间之间的关系是什么?
在许多资源中,我发现“作用域”和“命名空间”可互换使用,这似乎有点令人困惑,因为它们的含义不同。 范围定义了可使用名称的代码区域。 LEGB规则定义了查找名称的方式。 命名空间是您查找名称的地方。 然后我读到: “名称根据其分配的位置绑定到名称空间...”(我认为这是处理词法作用域中的作用域的方法)。 “功能添加一个额外的命名空间层,你的程序” [ 参考。](他们不添加额外的本地范围吗?) “在函数定义内分配的所有名称都放在本地范围(与函数调用关联的名称空间)中。” “全局作用域-即一个命名空间,在该命名空间中存在(分配)在模块文件顶层的变量。” *所有报价均来自学习python第5版ch17 Python中的名称空间是实现范围的方式吗?它们是一样的吗?谁能启发我?
12 python 

2
Scala中缀表示法
是否可以使用中缀符号来调用方法? 例如,在Haskell中,我可以编写以下函数: x `isAFactorOf` y = x % y == 0 然后像这样使用它: if 2 `isAFactorOf` 10 ... 在某些情况下,这允许非常可读的代码。在Scala中可能有与此类似的东西吗?我搜索了“ Scala中缀表示法”,但是该术语似乎在Scala中表示不同的含义。
12 scala 

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.