软件工程

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

2
Python中的类与模块
Python有许多re执行一组特定操作的模块(例如)。您可以调用此模块的函数并获取结果,并且该模块作为一个整体有一个主意(在这种情况下,处理正则表达式)。 类似乎做几乎完全相同的事情,但是它们似乎比模块更多地使用属性。 模块与类在哪些方面有所不同?(我知道我不能对模块进行子类化,是吗?)什么时候应该使用类而不是模块?
19 class  modules 

2
“灯具”的不同含义是什么?
我对理解“固定装置”的概念有些困难。我知道什么是测试套件,测试用例,测试运行,但是“夹具”到底是什么?参数化的测试用例? 在我看来,“夹具”一词的含义或语义可能会因编程语言或测试框架而略有不同?我认为一个phpunit夹具 “ 代码将世界设置为已知状态,然后在测试完成时将其返回到其原始状态。该已知状态称为测试的夹具。 ” 与“ 健身器材 ” 略有不同, “ 夹具是Wiki页面和被测系统(SUT)之间的桥梁,被测系统是要测试的实际系统 ”。 这里附近有软件测试专家可以回答这个问题吗?欢迎引用其他编程语言。

7
什么是惯用语?
我知道“惯用语”是一种常见的操作或模式,在某种特定语言中并没有通过核心语言语法来简化,例如整数增量: i = i + 1; 在C ++中,此惯用法由运算符简化: ++i; 但是,当有人使用“惯用”一词时,我不确定该如何理解。是什么使一段代码“惯用”?
19 c++  idioms 

5
跨微服务同步数据的正确方法是什么?
我对微服务架构比较陌生。我们有一个中等大小的Web应用程序,我在权衡将其细分为微服务而不是我们目前正在发展的单片系统的利弊。 据我了解,考虑微服务A,B每个微服务都依赖于另一个服务。如果通过A说某件事已发生更改来发布消息,则B可以使用该消息并复制的信息的本地副本,A并使用该副本执行所需的任何B操作。 但是,如果B出现故障/失败,过一会儿又重新出现,该怎么办。在那段停机时间内,A又发布了两条消息。如何B知道如何更新其本地信息副本A? 当然,如果B是A队列的唯一使用者,那么一旦它重新联机,它就可以开始读取它,但是如果该队列还有其他使用者并且这些消息被消耗了怎么办? 作为一个更具体的示例,如果Users服务在Billing微服务关闭时更新了其电子邮件地址,如果Billing微服务又恢复了,它如何知道电子邮件已更新? 当微服务恢复正常运行时,是否会广播说“嘿,我已经备份了,给我您所有的当前信息?” 通常,什么是数据同步的最佳行业实践?

3
没有数据重复的微服务
我发现即使对于最简单的微服务设计,也很难避免重复数据或共享数据库,这让我觉得我缺少了一些东西。这是我面临的问题的基本示例。假设某人正在使用Web应用程序来管理库存,那么他们将需要两项服务:一个用于管理物品和库存数量的库存,以及一个用于管理用户数据的用户服务。如果我们要审核谁库存数据库,可以将用户ID添加到库存服务的数据库中,作为最后按价值库存的库存。 使用该应用程序,我们可能希望查看所有即将用完的物品,以及上次库存者的清单,以便我们可以要求他们再次进行库存。使用上述架构,将向库存服务发出请求,以检索数量小于5的所有商品的商品详细信息。这将返回包含用户ID的列表。然后,将对用户服务进行单独的请求,以获取从库存服务获得的用户ID列表的用户名和联系方式。 这似乎效率很低,并且在我们向不同的服务API发出多个请求之前,不需要更多的服务,而这些服务API又会进行多个数据库查询。一种替代方法是复制库存数据中的用户详细信息。当用户更改其联系方式时,我们将需要通过所有其他服务来复制更改。但这似乎与微服务的有限上下文概念不符。我们还可以使用一个数据库,并在不同的服务之间共享它,从而解决集成数据库的所有问题。 什么是实现此目的的正确/最佳方法?

6
尝试/捕获/记录/重新抛出-是反模式吗?
我可以看到几篇文章,其中强调了在中心位置或过程边界处处理异常的重要性,这是一种好的做法,而不是乱丢try / catch周围的每个代码块。我坚信我们大多数人都了解它的重要性,但是我仍然看到人们仍然使用catch-log-threrow反模式,主要是因为在任何异常情况下,为了简化故障排除工作,他们想记录更多特定于上下文的信息(例如:方法参数)通过),方法是将方法包装在try / catch / log / rethrow周围。 public static bool DoOperation(int num1, int num2) { try { /* do some work with num1 and num2 */ } catch (Exception ex) { logger.log("error occured while number 1 = {num1} and number 2 = {num2}"); throw; } } 在保持异常处理良好实践的同时,有没有正确的方法来实现这一目标?我听说过类似PostSharp的AOP框架,但是想知道这些AOP框架是否有任何不利或主要的性能成本。 谢谢!

2
REST API设计:对API的多次调用与单次调用
我们正在开发用于电子商务网站的Rest API,它将由移动应用程序使用。 在应用程序的首页中,我们需要调用多个资源,例如滑块,顶级品牌,畅销产品,热门产品等。 进行API调用的两个选项: 单次通话: www.example.com/api/GetAllInHome 多个通话: www.example.com/api/GetSliders www.example.com/api/GetTopBrands www.example.com/api/GetBestSellingProducts www.example.com/api/GetTrendingProducts 其余api设计的最佳方法是哪种-一次或多次调用,说明优缺点? 哪个会花更多时间来响应请求?
19 rest  api  api-design  url 

6
为什么makefile应该有一个“安装”目标?
来自C和C ++的世界,大多数构建系统都有一个install目标,尤其是Makefiles(例如,GNU建议在其中)或CMake。此目标在操作系统(例如,在C:\Program Files\Windows中)中复制运行时文件(可执行文件,库等)。 这感觉确实很棘手,因为对我而言,安装程序不是构建系统的责任(实际上是操作系统/程序包管理器的责任)。这也意味着构建系统或构建脚本必须知道已安装程序的组织,以及环境变量,注册表变量,符号链接,权限等。 充其量,构建系统应该有一个release目标,该目标将输出可安装的程序(例如.deb或.msi),然后请操作系统安装该程序。它还将允许用户无需键入即可卸载make uninstall。 所以,我的问题是:为什么构建系统通常建议有install目标?

3
什么时候以及为什么指针开始被视为冒险?
似乎在考虑在编程语言中使用指针时,已经有了逐渐的转变,因此,人们普遍认为指针被认为是有风险的(如果不是彻头彻尾的“邪恶”或类似的强化)。 这种思想转变的历史发展是什么?是否有特定的开创性事件,研究或其他发展? 例如,简单回顾一下从C到C ++到Java的过渡,似乎显示出一种补充指针,然后完全用引用替换指针的趋势。但是,真正的事件链可能比这更微妙和复杂,并且不是那么连续。使其成为那些主流语言的功能可能起源于其他地方,也许很久以前了。 注意:我并不是在问指针,引用和其他东西的实际优点。我的重点是这种明显转变的理由。
18 history  pointers 


1
单元测试:Linq的延迟断言
可以添加这样的延迟断言吗 var actualKittens = actualKittens.Select(kitten => { Assert.IsСute(kitten); return kitten }); 为什么?因此,即使使用期望实现实例化的语句,我也可以仅迭代一次: CollectionAssert.AreEquivalent(expectedKittens, actualKittens.ToList()); 而且它可能不仅是Select,而且是定义了迭代器且具有大量检查和逻辑(例如,一些计数和过滤)的方法。 令人怀疑的种子是在测试失败的情况下读取和调试此类代码的复杂性。

5
RESTful API代表没有东西
想象一下一个API,以确定一个人是否选择了他们的精神动物。他们只能有零个或一个精神动物。 目前: /person/{id}/selectedSpiritAnimal 当他们选择了动物时,返回http 200, {selectedAnimal:mole} 但是当他们没有选择时,它将返回http 404。 这使我的精神动物不满意,因为我们正在表示一个有效的域问题-尚未选择精神动物-作为HTTP错误。 另外,作为一家公司-erm Sprit-Animal-Hampers-R-us,我们想知道某人何时没有选择,以便我们提示他们。 什么是更好的回应: HTTP 200和 {selectedAnimal:null} 甚至更明确 HTTP 200和 {selectedAnimal:null, spiritAnimalSelected: false} 还是返回404更好?因为很像this image has not yet been uploaded在线查看图像时将是404。this person has not selected a spirit animal可能是404 该问题已被提议作为重复项,但是当应用程序配置为不允许该URL表示更改时,该问题解决了一个其他有效的URL。 而在这里,我正在研究在没有资源的情况下有意义的代表资源的方式。也就是说,客户端请求URL是有效的,并且响应是您已成功请求表示没有东西的资源。 因此,这不是“业务逻辑”,而是情况下缺少某物有意义(可能是因为我的许多同事都认为404仍然正确),但是我不确定如何将其映射到规格 很难选择答案。我在这里的谈话和正在进行的工作中多次改变主意。 在这里为我解决的问题是,规范指出4xx是客户犯错的时间。在这种情况下,已告知客户端期望来自selectedSpiritAnimal url的响应,因此不会出错。 我的同事之间的共识是,这是API设计错误的征兆 最好只请求/ person / {id}并返回该人的一组链接关系...那么如果没有给您/ selectedSpiritAnimal链接(当一个人没有选择时),但是您不管怎样都称它为404才有意义。或者您实施部分响应并让/ person / {id}返回更完整的文档,除非客户端请求数据的子集
18 rest 


1
SOA /微服务:如何处理服务间通信中的授权?
前景 我们正在从单一平台过渡到更加面向服务的体系结构。我们正在应用非常基本的DDD原则,并将我们的域划分为不同的有界上下文。每个域都是分布式的,并通过Web API(REST)公开服务。 由于我们的业务性质,我们提供诸如订舱,服务,客户,产品等服务。 我们还建立了一个Identity Server(基于Thinktecture Identity Server 3),其主要作用是: 集中身份验证(给定颁发令牌的凭据) 在令牌中添加声明,例如:客户范围(按照客户,我是指执行请求的应用程序),客户标识符(按照客户,我是指使用该应用程序的人) 我们还介绍了API网关的作用,它可以集中外部访问我们的服务。API网关提供的功能不需要深入了解内部域,例如: 反向代理:将传入请求路由到适当的内部服务 版本控制:API网关的一个版本映射到内部服务的不同版本 身份验证:客户端请求包括由Identity Server发行的令牌,API网关会验证令牌(确保用户说的是她的身份) 节流:每个客户端的请求数量限制 授权书 与授权有关,这不是在API网关中管理,而是在内部服务本身中进行管理。我们目前正在执行两种主要的授权类型: 基于客户范围的授权。示例:客户端(使用我们的API的外部应用程序)需要范围“ bookings”来访问Bookings服务API端点 基于客户的授权。示例:仅当客户(使用应用程序的自然人)是预订的参与者时,才能从预订服务访问端点GET / bookings 为了能够处理内部服务中的授权,API网关仅转发令牌(在将请求路由到内部服务时),该令牌既包含有关客户端(执行请求的应用程序)的信息,也包含有关客户的信息(作为声明)有人在客户端应用程序中登录的情况)。 问题描述 到目前为止,到目前为止还不错,直到我们引入了服务间通信(某些服务可以与其他服务进行通信以获得一些数据)。 题 在服务间通信中,我们应该如何处理授权? 考虑的选项 为了讨论不同的选项,我将使用以下示例方案: 我们有一个名为ExternalApp的外部应用程序,该应用程序访问我们的API(可以将ExternalApp视为客户端),以建立预订流程 ExternalApp需要访问预订服务,因此我们授予ExternalApp范围“预订” 在内部(这对于ExternalApp来说是完全透明的),预订服务使服务服务获得预订的默认服务,例如航班,保险或租车 在内部讨论此问题时,会弹出几个选项,但我们不确定哪个选项最好: 当Bookings与Services通信时,它应该只转发他从API网关收到的原始令牌(表明客户端是ExternalApp)。 启示:我们可能需要将不应该被授予的范围授予ExternalApp。示例:ExternalApp可能需要同时具有“预订”和“服务”范围,而只有“预订”范围才足够 当Bookings与Services通信时,它转发一个令牌,指示该客户端现在已成为Bookings(而不是ExternalApp),并且添加了一个声明,表明Bookings模仿了原始客户端ExternalApp 通过还包括原始客户端是信息ExternalApp的服务业务也可以做逻辑如过滤取决于原调用一些服务(如用于内部应用程序,我们应该返回所有的战斗,外部应用程序只有一些) 服务不应相互通信(因此我们甚至不应面对这个问题) 预先感谢您的输入。

3
为什么在Web应用程序中通常使用REST代替类似RPC的机制?
我最近刚开始在一家公司中使用了一个非常不寻常的自定义框架用于其Web应用程序,至少与我所知道的典型Web应用程序框架相比。代替RESTful Web服务,使用RPC机制与服务器进行通信。 与服务器通信看起来像一个简单的函数调用,但是该函数在服务器而不是客户端上执行。在服务器端,有一种方法可以定义客户端可以调用的功能。完全抽象了如何将其转换为http请求的细节。 我现在只用了很短的时间,但是似乎很方便。但是我想知道我缺少这种方法的缺点。其他人似乎都在做不同的事情,这通常对我来说是一个迹象,表明我可能做的是愚蠢或出色的事情,而前者的几率更高。

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.