软件工程

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

1
为什么大多数API网关解决方案都不支持“聚合”?
在阅读有关API Gateway的内容时,每一次出现的一件事是API Gateway是一个您应该在其中汇总多个端点的结果的地方。听起来真的很好。但是,许多流行的API网关解决方案(例如AWS API Gateway,Kongo和Netflix Zuul)不支持该功能。您需要自己修改或实施自定义过滤器。 聚合被视为不良做法吗?人们如何从多个端点返回结果?

4
拉取请求作者必须合并的代码审查工作流
我公司的几个团队在实践一个我从未见过的代码审查工作流。我试图理解其背后的想法,并认为使整个公司保持一致具有价值。(我为多个代码库做出了贡献,过去的差异让我感到震惊。) 代码作者提交请求请求 审阅者检查代码 如果审阅者批准,他们会按照“看起来不错,随时可以合并”的方式发表评论 如果审阅者有疑问,他们会留下诸如“请先解决X和Y的小问题,然后合并”之类的评论(有关重大更改,请返回步骤2)。 代码作者在必要时进行更改,然后合并自己的请求请求 我有以下担忧: 在第3步获得批准的情况下,此工作流程将为拉取请求作者创建一个看似不必要的往返。已经在查看代码的审阅者可以立即将其合并。 在第3步请求更改的情况下,合并拉取请求的代理机构现在仅由PR的作者负责。除了作者之外,没有人会在合并之前查看这些更改。 此工作流程还有哪些其他优点或缺点?此工作流程在其他工程团队中是否常见?

6
如何推广和鼓励高质量代码?
我在一个由4人组成的小型外包公司中担任iOS开发人员。在我和另外两名开发人员加入该公司之前,我们正在进行的项目开始了几年。在此之前,该项目主要由一个人完成。 当我开始从事该项目时,那真是一团糟。有很多代码重复。我看到相同的500个代码处理了20个不同的文件,但有微小的变化。此外,它的组织方式也不是很好:所有UI创建代码都与逻辑一起混合在视图控制器中。 我尽力在这里和那里进行重构,消除多余的代码,改善项目的文件结构,等等。感觉就像以前的开发人员并不真正在乎所有这些事情,或者没有经验。曾经有一段时间,我一个人从事大型功能几个月。由于此功能的性质,我不得不在整个应用程序中触摸很多代码,因此我确实尝试进行一些改进。 当其他开发人员加入该项目时,我注意到他们使用不同的编码样式(有时是完全不同的样式),并且通常不使用诸如属性访问器之类的现代语言功能(这在Objective-C中相对较新)。有时他们会发明自己的自行车,而不是使用框架的类似功能,或者将他们学到的其他编程语言或模式的概念转移到我们的代码库中。通常,由于英语不正确(Objective-C是您使用长名称的语言),它们有时无法正确命名方法或变量。 有时候,我认为如果不是针对IDE,我认为他们会编写所有代码而没有缩进或格式化。 基本上,我讨厌他们编写的代码。它的格式/组织不好,有时与项目的其余部分完全不同。当他们将意大利面加到我的艺术品中时,我会感到非常沮丧,这会影响我的工作心情和工作效率。 感觉越来越像他们不被学习或不在乎的困扰:他们只是按照他们的要求去回家。有机会时,我尝试给他们一些提示(例如,评论他们的PR或在GitHub上提交)。我曾经很好地要求遵循大多数现有代码的编码风格和格式(很遗憾,我们没有正式的编码风格文档)。但这没用... 我如何解决这种情况而不仅仅是关注“糟糕的公司文化”,“没有经验的毕业生”等,而是开始改善这种情况。


3
API网关(REST)+事件驱动的微服务
我有一堆微服务,这些服务根据API网关模式通过REST API公开。由于这些微服务是Spring Boot应用程序,因此我正在使用Spring AMQP来实现这些微服务之间的RPC风格的同步通信。到目前为止,一切进展顺利。但是,我对事件驱动的微服务体系结构了解得越多,对诸如Spring Cloud Stream之类的项目的了解越多,我就深信我可能会采用RPC同步方法以错误的方式进行操作(特别是因为我需要按比例缩放)以便每秒响应来自客户端应用程序的数百或数千个请求)。 我了解事件驱动架构背后的观点。我不太了解的是当坐在期望对每个请求都响应的模型(REST)后面时,如何实际使用这种模式。例如,如果我将我的API网关作为一个微服务,而另一个将存储和管理用户的微服务作为一个微服务,那么我该如何GET /users/1以纯粹的事件驱动方式对诸如a之类的事物进行建模呢?

4
将Angular应用放在ASP.NET Web API解决方案中的何处?
我正在启动一个未开发的应用程序,并且我想使用ASP.NET(4.6)和Angular2。对于后端,我已经在Visual Studio中创建了一个项目,现在我想知道将Angular应用程序放在哪里。我真的想在前端使用npm和node-tools,但最终它将托管在同一个Azure App Service实例中,Angular应用程序位于或类似domain.com/的API下domain.com/api/。 如何在Visual Studio中分离应用程序?Angular应用程序应该属于自己的项目吗?我应该在与API相同的项目中使用Angular应用程序吗?即使我不想为此使用nuget和其他VS工具?(对于前端,VS或多或少是美化的代码编辑器)。对于这种组合,我还没有找到任何最佳做法。

11
有什么更好的IllegalStateException或无声方法执行?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 3年前关闭。 假设我有一个MediaPlayer类,该类具有play()和stop()方法。如果以前没有调用过play方法,则在实现stop方法时使用的最佳策略是什么。我看到两个选项:由于播放器未处于适当状态而引发异常,或无提示地忽略对​​stop方法的调用。 当在某些情况下不应该调用某个方法但该方法的执行对程序总体无害时,一般规则应该是什么?

4
Java中的类变量和实例变量之间有什么区别?[关闭]
已关闭。这个问题需要细节或说明。它当前不接受答案。 想改善这个问题吗?添加细节并通过编辑此帖子来澄清问题。 4年前关闭。 我对Java还是很陌生,想了解类变量和实例变量之间的区别。 例如: class Bicycle { static int cadence = 0; int speed = 0; int gear = 1; } 实例变量和类变量之间有何不同?这里的哪些变量是类变量,哪些是实例变量?这如何影响范围?
16 java  class  object  instance 

2
与std :: bitset相比,c风格的位操作有什么优势吗?
我几乎只在C ++ 11/14中工作,通常在看到这样的代码时会畏缩: std::int64_t mArray; mArray |= someMask << 1; 这只是一个例子。我说的是一般的按位操作。在C ++中,真的有什么意义吗?上面的内容容易引起误解且容易出错,而使用std::bitset可以使您: std::bitset通过调整模板参数并让实现负责其余工作,可以更轻松地根据需要修改的大小,以及 花更少的时间弄清楚正在发生的事情(并可能犯错误),并std::bitset以类似于std::array或其他数据容器的方式编写。 我的问题是;除了向后兼容以外,还有什么理由不使用std::bitset原始类型吗?

2
PHP中的非法:是否存在OOP设计原因?
下面的接口继承在PHP中是非法的,但我认为它在现实生活中将非常有用。下面的设计是否存在实际的反模式或已记录的问题,PHP正在保护我免受其侵扰? <?php /** * Marker interface */ interface IConfig {} /** * An api sdk tool */ interface IApi { public __construct(IConfig $cfg); } /** * Api configuration specific to http */ interface IHttpConfig extends IConfig { public getSomeNiceHttpSpecificFeature(); } /** * Illegal, but would be really nice to have. …

2
实际上,即使考虑了帐户缓存,Bloom过滤器真的比哈希更快吗?
当您考虑可以确定Int是否在恒定时间内具有99%的确定性的集合中时,Bloom过滤器看起来确实很棒。但是散列也是如此,唯一的区别在于,在散列中,大多数时候您只访问一次内存。使用Bloom过滤器时,您需要在完全遥远的地方每个请求访问它们约7次,因此每个请求将有多个缓存未命中。 我想念什么吗?

3
为什么可执行文件依赖于操作系统而不依赖于CPU?
如果我编写C程序并将其编译为.exe文件,则该.exe文件包含对CPU的原始机器指令。(我认为)。 如果是这样,我怎么可能在运行现代Windows版本的任何计算机上运行编译的文件?每个CPU系列都有不同的指令集。那么.exe,无论使用哪种物理CPU,任何运行适当操作系统的计算机都可以理解我文件中的指令? 同样,通常在某些应用程序“下载”页面上的网站上,您可以下载Windows,Linux和Mac(对于每个操作系统,对于86和64位计算机,通常为两次下载)。为什么每个CPU系列的下载量都没有增加?

5
我应该在Java中使用初始化程序块吗?
最近,我遇到了一个从未见过的Java构造,并且想知道是否应该使用它。它似乎被称为初始化程序块。 public class Test { public Test() { /* first constructor */ } public Test(String s) { /* second constructor */ } // Non-static initializer block - copied into every constructor: { doStuff(); } } 代码块将复制到每个构造函数中,即,如果您有多个构造函数,则不必重写代码。 但是,我看到使用此语法的三个主要缺点: 这是Java中极少数情况下代码顺序很重要的情况之一,因为您可以定义多个代码块,并且它们将按照编写的顺序执行。这对我来说似乎很有害,因为仅更改代码块的顺序实际上就会更改代码。 使用它并没有带来任何好处。在大多数情况下,构造函数会使用一些预定义的值相互调用。即使不是这种情况,也可以将代码简单地放入私有方法中,并从每个构造函数中调用。 它会降低可读性,因为您可以将代码块放在类的末尾,而构造函数通常在类的开始。如果您认为不必要查看代码文件的完全不同的部分,这是违反直觉的。 如果我的上述说法是正确的,为什么(和何时)引入了这种语言结构?有合法的用例吗?
16 java 


4
测试:确定性还是不确定性?
最好有一个 确定性测试套件,导致后续的相同测试 非确定性测试套件,可能涵盖更多案例 ? 示例: 您编写了一个测试套件来测试MVC应用程序中的控制器功能。在测试期间,控制器需要来自数据库的应用程序数据作为输入。有两种方法可以执行此操作: 您可以硬编码选择测试数据库中的哪行作为输入(例如,第10行和第412行) 您使用随机数生成器从数据库中伪随机地选择数据(随机数生成器选择了两行) 首先是确定性的:对于相同版本的代码,每次运行测试都应产生相同的结果。第二个是不确定的:测试套件的每次运行都有可能产生不同的结果。但是,随机选择的数据可能会更好地表示数据边缘情况。它可以模拟用户更好地为我们的控制器提供不可预测的数据吗? 选择一个而不是另一个的原因是什么?
16 testing  mvc 

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.