软件工程

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

2
堆栈结构是否用于异步进程?
埃里克·利珀特(Eric Lippert)对该问题有一个很好的回答,描述了堆栈的用途。我已经了解了一年(通常来说)是什么堆栈以及如何使用堆栈,但是他的部分回答让我怀疑这种堆栈结构在当今以异步编程为标准的情况下是否被较少使用。 从他的回答: 堆栈是在没有协程的语言中延续性的一部分。 具体来说,没有协程的部分让我感到奇怪。 他在这里解释了更多: 协程是可以记住它们所在位置的功能,可以暂时控制另一个协程的功能,然后在稍后中断的位置恢复,但不一定是在所谓的协程产量之后立即执行。想想C#中的“收益回报”或“等待”,它们必须记住当请求下一项或异步操作完成时它们在哪里。具有协程或类似语言功能的语言需要比堆栈更高级的数据结构才能实现延续。 就堆栈而言,这是极好的选择,但是当堆栈太简单以至于无法处理需要更高级数据结构的这些语言功能时,我将不得不回答的问题是什么? 随着技术的进步,堆栈会消失吗?用什么代替它?它是混合类型的东西吗?(例如,.NET程序是否使用堆栈,直到遇到异步调用,然后切换到其他结构,直到完成,此时堆栈才退回到可以确定是否有下一个项目的状态,依此类推? ) 这些场景对于堆栈而言太高级了,这是很合理的,但是什么能代替堆栈呢?几年前,当我了解到这一点时,堆栈就在那里了,因为它闪电般快速且轻巧,因为它支持对即将完成的任务进行高效管理(双关语?),所以它在应用程序中从堆分配了一块内存。有什么变化?
10 stack 

2
避免获取和设置方法,显示用户信息
背景 我正在阅读“清洁代码手册”,并且在并行中,我正在像银行账户那样从事诸如体操之类的身体对象卡塔(Kata)的研究: 健美操对象的第9条规则是我们不要使用吸气剂或吸气剂。 看起来很有趣,我同意这一原则。而且,在“清洁代码”的第98-99页,作者解释说,getters / setters破坏了抽象,并且我们不必询问对象,而必须告诉对象。 在我看来,这是完全合理的,我完全同意这一原则。问题出在实践中。 语境 例如,我有一个必须列出一些用户并显示用户详细信息的应用程序。 我的用户包括: -> Name --> Firstname --> String --> Lastname --> String -> PostalAddress --> Street --> String --> PostalCode --> String 问题 当我只需要显示一个简单的信息(并且我必须确认我不需要对该特定字段进行额外的操作)时,我该怎么办?或者如何避免吸气剂以简单的方式显示Firstname值(随机)输出支持? 我想到什么 一种解决方案是: user.getName().getFirstName().getStringValue() 这非常可怕,违反了许多健美操规则,并违反了Demeter法则。 另一个可能是这样的: String firstName = user.provideFirstnameForOutput(); // That would have called in the user object …

2
堆栈限制
最近,我在三个具有不同操作系统的设备上测试了堆栈的限制(按限制,我的意思是堆栈可以具有的最大级别数),并且我注意到,每次达到2 ^ 16级别时,它都会给我溢出错误,当我放2 ^ 16-1时,它可以正常工作。 所以我的问题是-是这样吗?根据定义,堆栈是否具有最大限制2 ^ 16-1还是取决于操作系统?
10 stack 

7
服务应该在微服务架构中直接相互通信吗?
我有许多构成Web应用程序的Web服务。客户端可以通过REST API调用访问这些服务。 这些服务应该能够彼此直接对话吗?如果是这样,这是否会使他们成为夫妇,这违背了微服务的概念? 客户端是否应该一个接一个地直接调用它们以获取在客户端上加载网页所需的数据? 还是我应该在服务之上设置另一层来处理来自客户端的请求,获取该请求的数据,然后将其发送回客户端?

1
2v2游戏的数据库结构
我经常与12个朋友一起玩2v2游戏,我想要一个数据库来跟踪球员,球队,得分和比赛,以创建排名系统。 既然我们定期更换球队,我想出来的表格players,teams并games在那里比赛有两支球队(TEAM1和TEAM2)和队由两名队员(PLAYER1和player2)。 这会引起很多问题-例如,如果我选择两个球员(让他们分别称为A和B)一起玩,我必须检查是否已经存在一个其中Player1为A且Player2为B或Player1为B和Player2的球队是A。 表格和表格中都有列games和wins,但这是因为我既要查看玩家赢得了多少场比赛,又要查看玩家在不同团队中的兼容性(玩家与团队合作获胜的频率)其他特定玩家)。playersteams 排名记分牌(我可能会使用Elo评分系统) 为每个球员提供的统计信息页面,其中包括评分,获胜,比赛,最近的比赛统计信息以及与他最兼容的球员。 我强烈怀疑其中许多内容违反了数据库规范化的某些原则,并且我很乐意就如何实施数据库设计提出一些建议。

3
类似于TDD的算法问题解决方法
我在Codility的一次算法测试中失败了,因为我试图找到一种更好的解决方案,最后我一无所有。 因此,这让我开始思考是否可以使用类似于TDD的方法?即我是否通常可以以类似的方式逐步开发解决方案? 如果我正在编写排序算法,则可以从标准Bubblesort转换为2-way Bubbleort,但是诸如Quicksort之类的更高级的东西将是“量子飞跃”,但至少我拥有可以轻松验证的测试数据。 有关此类测试的其他提示?下次我要做的一件事是使用比内部循环更多的方法/函数。例如,在排序中,您通常需要交换。如果是一种方法,我只需要修改调用代码。我什至可以拥有更高级的解决方案作为派生类。 对于“算法”与“常规”问题,我指的是时间复杂性很重要的问题。因此,您不必像在TDD中那样通过更多的测试,而应使其“表现得更好”。 “类似于TDD”是指: 编写相对自动的测试以节省手动测试pr增量的时间。 增量发展。 回归测试,能够检测代码是否中断或至少在两次增量之间功能是否发生了变化。 如果您比较一下,我认为这应该很容易理解 直接编写shell排序 从Bubblesort跳到quicksort(完全重写) 从单向冒泡排序逐步转换为外壳排序(如果可能)。

2
为什么“ using”指令和“ using”语句在C#中使用相同的关键字?
该using指令使我们可以访问类型,而无需使用它们的全限定名: using MyNamespace.Foo.Bar; 该using语句充当try/ finally块的语法糖,可确保正确处置对象: using(var x = new MyDisposableClass()) { ... } 这两种情况似乎彼此无关。他们为什么使用相同的关键字? 我怀疑有人会混淆这两种情况,但是如果不为新功能创建新词似乎很奇怪。 顺便说一句,我也读过classC ++ 的双重用法(一种用于声明类,一种用于定义模板参数),但是第二种情况最终得到了自己的关键字typename,这对我来说更有意义。
10 c#  statement 

3
为另一个质量保证(QA)创建完全重复的系统是否是不良做法?
在工作中,我们有一个非常复杂的系统。我们将此系统称为System_A。我们的质量检查小组创建了另一个系统,称为系统_B,以测试系统_A。 System_B的使用方式如下。我们生成输入(使用System_B本身)IN,再通过System_B处理此类输入,并生成输出O_B。因此过程如下: System_B(IN) -> O_B。 然后,我们对System_A进行相同的操作以生成自己的输出O_A: System_A(IN) -> O_A。 在任何时候,都假定O_B是预期输出,而O_A是观测/实际输出。暗示O_B是“金”源(事实)。但是,我们遇到了一系列问题。 O_A是错误的,O_B是正确的 O_A是正确的,O_B是正确的 O_A错误,O_B错误 O_A是正确的,O_B是错误的 如果假定O_B永远是对的(或期望的是什么),谁来决定对的呢?好吧,事实证明,在人工检查和分析中,O_B有时(或经常)是错误的。使用此过程,一切都会通过质量检查,真正的用户会抱怨,我们回到发现O_B毕竟是错误的。 问题是这样的:创建“测试系统”以测试实际系统是否是错误的做法? 湿滑的斜坡呢?然后,我们不能说我们需要另一个系统来测试“测试系统”吗? 成本绝对是高得让人望而却步,因为开发人员现在需要学习至少2个代码库,而System_B的复杂性可能大于System_A。我们如何量化拥有System_B对组织有多好? 创建System_B的最初“诱人”原因之一是“自动化”测试。现在,我们为完全自动化而感到自豪(因为System_B生成输入以引导使用其自身也生成输出的过程)。但是我认为我们以一种无法量化的方式造成了更大的伤害并引入了更多的复杂性。质量检查的工作是否完全自动化?这个理由足以证明创建并行系统吗? 我真正担心的是,即使我们都知道System_B是错误的(经常)。如果System_B擅长处理输入并且其输出是黄金来源,为什么不用System_B替换System_A?为此,没有人能够提供满意的答复。 对此问题的任何指导表示赞赏。

5
术语-源代码是程序吗?[关闭]
已关闭。这个问题需要细节或说明。它当前不接受答案。 想改善这个问题吗?添加细节并通过编辑此帖子来澄清问题。 3年前关闭。 我是编程的初学者,对术语没有很好的了解。我想知道以C或C ++等编译语言编写的源代码是否被视为程序?如果没有,谁能解释为什么?

2
在Scrum站立式中,关于昨天完成的讨论的讨论应该限于董事会的任务还是完成的所有工作?
我知道Scrum在日常站立比赛中的规则说,团队应该只谈论他们昨天所做的事情,他们今天所做的事情以及任何阻碍他们前进的事情。没有其他的。但是问题是,有时开发人员会花费自己的时间从事与任务无关的工作,然后在独立讨论中谈论它。这就是他们昨天所做的! 根据我的经验,我发现谈论董事会上的任务,保持站立状态,使每个人专注于他们的任务,复查他们的估计并每天跟踪他们的记录更为有效。 将讨论限制在董事会的任务上是否有效?
10 agile  scrum  meetings 

7
为什么圈复杂度对于单一方法如此重要?
从最近开始,我就在SonarLint for Eclipse中使用它,这对我有很大帮助。但是,它向我提出了关于圈复杂度的问题。 SonarLint认为可接受的CC为10,在某些情况下我超出了CC,大约为5或6个单位。这些部分与映射器相关,其中值依赖于不同的变量,例如: 字段A依赖于字符串sA; 字段B依赖于String sB; 字段C依赖于String sC; 等... 我别无选择,只能if为每个领域放一个。(幸运的是)这不是我的选择,而是我自己无法更改的已经存在的复杂系统。 我的问题的核心是:为什么单一方法中 CC不能过高如此重要?如果您将某些条件转移到一个或多个子方法中以降低复杂性,那么它并不能降低整体功能的成本,只是将问题转移到其他地方,我猜? (对不起的小错误,如有)。 编辑 我的问题不涉及全局圈复杂性,而仅涉及单个方法的复杂性和方法的拆分(抱歉,我很难解释我的意思)。我在问为什么如果仍然属于“超级方法”,为什么可以将您的条件拆分为较小的方法,而超级方法只能执行每个子方法,从而增加了算法的复杂性。 但是,第二个链接(关于反模式)很有帮助。

3
没有压力测试的通过/失败标准是否合理?
为了清楚起见,我编写的压力测试稳步增加了系统的负载,直到达到断裂点为止。从理论上讲,它是无限期运行的,但是由于系统资源是有限的,因此预计它将在某个时间点后失败。我对系统有预期的负载,但是在负载测试中对此进行了单独测试。此压力测试的目的是找出在需要实施扩展之前可以给系统施加多少负载。 我正在为系统编写压力测试,并且想知道具有通过/失败标准是否有意义。根据测试的性质,负载会稳定增加,直到达到断裂点(即失败)。我显然不知道这个突破点是什么,因此我对系统可以处理的负载没有任何期望(理论上无论如何)。 现在,我确实还有其他性能测试,可以在预期的负载等条件下测试系统,我可以轻松为其设置通过/失败标准,并且可以将这些标准用作压力测试的基础。换句话说,我可以为压力测试设置一个最低基准,但是我不确定这是否是正确的做法(这是“重复”我的其他测试吗?)。 我希望在性能测试方面有更多经验的人可以在这里为我提供帮助。压力测试时是否使用其他通过/失败标准(如果有)?

4
面向对象编程中的主要职责是什么?
我是面向对象编程的新手,但我不明白主对象的目的是什么。 是的,我读到它是程序的“入口点”,但是我不明白的是程序的主要内容是什么?它的职责是什么? 可能会发生将主体编写的内容封装到另一个对象中的情况,但是您应该使用这种方法多少呢? 这是我用Java编写的第一个主语言,它很简单,但是可能会让您更好地理解我的疑问。我有一个抽象类Animal,它由“ Cat”和“ Dog”扩展。我使用main来创建一些对象,并使用它作为与用户的“接口”,确实如您所见,我使用了一些条件指令来“询问用户”他想做什么。 我的问题来自于这样一个事实,即接口可以封装在另一个对象中,而不是把责任交给主要对象。 public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("What type of animal do you want to create? \n dog cat"); String type = input.nextLine(); if ( Objects.equals(type, "dog")){ System.out.println("Enter the animal's age: "); int age = input.nextInt(); // Scans the …

1
如何迁移现有的旧版Web应用以使用OAuth2
我目前有一个拥有15年历史的单片式Web应用程序,具有近一百万的用户,使用自制的授权和身份验证系统:JAAS,用户名和密码存储在具有基本密码哈希的DB中,还有一些2FA个人验证问题(不同哈希算法等)。 在接下来的12-18个月中,我将全面检查应用程序,主要侧重于UI,但同时还要慢慢升级基础部分(升级到Spring,Spring Security等)。在这个项目中,我们决定逐个模块解决UI升级;完成每个模块后,使其可用;一个绝好的机会,可以将整体拆分成单独的Web应用程序(所有应用程序都保持相同的UX设计)。 我在计划和解决方案时遇到的问题是在身份验证和授权级别。我需要一个跨领域的解决方案,该解决方案应涵盖所有模块,以便将用户从一个Web应用程序定向到另一个Web应用程序时,这是一个无缝过渡-他们甚至都不知道他们位于不同的Web应用程序上。OAuth2听起来是完美的解决方案。 我一直在努力了解如何整合这一点。我是否必须构建自己的自定义OAuth2服务器?那让我感到震惊。但是我该如何: 将我所有的用户帐户和授权过程迁移到第三方OAuth2服务器 自定义外观以匹配我的应用程序的其余部分(不确定这将有多容易/可能) 阻止通过第三方服务器连接时出现典型的“应用程序XYZ想要访问您的帐户的权限...”弹出窗口?(例如:Google OpenID,Facebook等)。 我的目标是为用户提供从当前状态到新状态的无缝过渡,但提供创建独立的Web应用程序的功能,这些功能都可以在Web应用程序外部进行身份验证和授权。

3
如何通过Symfony使用外部RESTful API?
我们正在为我们的项目构建微服务架构,其中大多数前端Symfony应用程序与后端RESTful API进行交互。 问题在于,这种方法打破了严重依赖带有数据库的Doctrine的Symfony实体管理。Symfony通常使用Doctrine处理实体,从而使大部分工作自动化,而当我们必须从API访问外部数据时,就很难轻松地重现这一点。 例如,对于客户实体: 使用Doctrine,我们只需要定义Client类,现在就可以轻松地创建,更新和检索客户 使用REST API方法,可以通过API访问客户端,但是我们还有很多工作来定义如何创建(POST),更新(PUT),检索(GET)客户端等。 需要注意的是,客户端被多个应用程序使用,不仅是前端应用程序,还有专用的API。 我们是否应该使用类似于实体的方法来创建类,从而隐藏API调用的复杂性,在本地导入所有API数据并通过Doctrine或其他方式访问它们?

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.