软件工程

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

11
在实际情况下,您使用的最复杂的数据结构是什么?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 这个问题的根源来自我与业内其他开发人员的讨论。 事实证明,在很多地方,项目经理对复杂的数据结构保持警惕,并且通常坚持使用标准库/软件包中的现成的东西。一般的想法似乎是使用已经可用的东西的组合,除非严重阻碍性能。这有助于使代码库保持简单,对于非外交人员来说,这意味着“我们的人员流失率很高,而我们雇用的新员工可能并不那么好”。 因此,没有CS迷使用Bloom过滤器,跳过列表或展开树。因此,这又是一个问题:您在办公室使用或使用过的最复杂的数据结构是什么? 帮助您了解现实世界中软件的质量/复杂程度。

10
Ruby on Rails应该具有陡峭的学习曲线还是仅我一个人?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 6年前关闭。 我是一个自学成才的程序员。自10月以来,我一直在学习RoR,而且强度有所不同(有时一天一整天,有时几周都没空)。在此之前,我只了解Java,但是非常了解。我听到过很多关于RoR的炒作,以及它如何使您快乐,多产等。到目前为止,这只是让我感到沮丧。我是从敏捷书中学到的,并且我怀疑部分困难可能与我不了解JavaScript和CSS以及对数据库和HTML的掌握不佳有关。但是显然,我完成敏捷书中的项目所花的时间比其他人花了很多时间,我仍然不记得很多。关于Rails的某些事情我似乎无法理解,例如何时使用符号,何时不使用符号或如何调用动态方法。 最近,我收到了一个小的Rails任务,要求我对界面进行一些小的更改。我花了大约25个小时,尽管我在理解代码方面取得了一些进步,但我仍然不知道如何进行。我什至不能问Stack Overflow,因为要提供上下文,我必须提供太多代码。 所以我的问题在标题中:RoR应该花很长时间学习还是我只是很慢?可能是我从错误的书中学到了什么吗?我的学习风格使我要么什么都不懂,要么什么都不懂(如果有的话)。

7
使用空格与{}来表示范围的语言的优缺点是什么?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 5年前关闭。 在使用空白还是使用括号之类的标记来表示范围方面似乎存在冲突。我已经看到许多人赞扬python对不一致的缩进问题的解决方案,但是许多人不同意: 任何将空格作为标记的语言都必​​须消失。 稍后在相同答案上发布: 直到我真正尝试过为止,我还是有点像反空格一样。我的个人空白布局几乎与python-land中的每个人所使用的布局相匹配可能会有所帮助。也许是因为我有点简约,但是如果您要缩进,为什么还要打扰{}? 我可以从两边看到一些明确的论点: 使用空格: 帮助减少代码中不一致的缩进 通过将可见标记替换为空白以达到相同目的来清除屏幕 使用令牌: 将代码剪切和粘贴到不同级别更加容易(您不必修复缩进) 更一致。一些文本编辑器以不同的方式显示空白。 目前比较流行。 我有什么遗漏的地方吗?你喜欢哪个?与彼此长期合作后,有什么智慧的话吗? PS。当语言不为每个控件结构使用相同的标记时,我会讨厌它。VB的End Ifand End While语句确实很烦人,大多数其他语言仅对所有内容使用{}。但这也许是另一个问题的话题...

10
函数重载?是或否[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 我正在开发一种静态和强类型的编译语言,并且正在重新考虑是否将函数重载作为一种语言功能包括在内的想法。我意识到我有点偏颇,主要来自C[++|#]背景。 支持和反对在语言中包含函数重载的最有说服力的论据是什么? 编辑:没有人有反对意见吗? 伯特兰·迈耶(Bertrand Meyer,埃菲尔铁塔的创建者早在1985/1986年)就将方法重载称为:(源) 一种虚荣机制,不会使OO语言的语义能力发挥任何作用,但会妨碍可读性并使每个人的任务变得复杂 现在这些是一些笼统的概括,但是他是一个聪明的人,所以我可以肯定地说他可以根据需要支持它们。实际上,他几乎让Brad Abrams(CLSv1开发人员之一)确信.NET不应该支持方法重载。(来源)这是一些有力的东西。谁能说明他的思想,以及25年后他的观点是否仍然合理?

4
如何最好地组织类和接口文件?
好的..经过所有讨论之后,我将稍微更改我的问题以更好地反映我正在处理的具体示例。 我有两个类,ModelOne和ModelTwo,这些类执行类似的功能,但彼此无关。但是,我有一个第三类CommonFunc,其中包含一些公共功能,这两种功能都在两者中实现ModelOne,ModelTwo并且已根据进行了分解DRY。这两个模型是在ModelMain类中实例化的(它本身是在更高级别上实例化的,但是我将在这个级别上停止)。 我正在使用的IoC容器是Microsoft Unity。我不假装自己是专家,但是我的理解是,您在容器中注册了一个接口和类的元组,当您想要一个具体的类时,您会向IoC容器询问与特定接口匹配的任何对象。这意味着对于我要从Unity实例化的每个对象,都必须有一个匹配的接口。因为我的每个类都执行不同的功能(且不重叠),所以这意味着接口和类1之间的比例为1:1。但是,这并不意味着我正在为每个编写的类都刻苦地编写一个接口。 因此,在代码方面,我最终得到2: public interface ICommonFunc { } public interface IModelOne { ICommonFunc Common { get; } .. } public interface IModelTwo { ICommonFunc Common { get; } .. } public interface IModelMain { IModelOne One { get; } IModelTwo Two { get; } .. } public class …

4
我应该在哪里进行本地化(服务器端还是客户端)?
我目前正在基于富JavaScript客户端开发一个新的Web应用程序,该客户端可与服务器上的多个REST Web服务进行通信。该应用程序打算在至少两个使用不同语言的国家/地区使用,因此我们需要对其进行本地化。 我的问题是我应该在哪里管理本地化:REST服务应该接收请求并发送带有本地化数据的答案,还是客户端应该接收并发送通用数据然后负责进行本地化?

3
使用DDD和CRQS时,每个命令应该恰好是一个事件吗?
我正在寻找一种设计约定通用的ddd应用程序的方法。 说一个聚合“客户端”有一个定义为“ FillProfile”的命令。它将在逻辑上引发事件“ ProfileFilled”。 在某些情况下,命令会引发的事件多于一个事件,或者命令会基于某种逻辑引发不同的事件吗?还是这始终是1-1的关系(1个命令将始终不引发任何事件,或者仅引发给定类型的单个事件)。 我之所以这样问是因为,如果这是事实,那么命令将始终引发同一事件,那么我可以基于该事实建立约定系统。我知道“ RaiseEvent”将导致“ EventRaised” ...

6
枚举什么时候不是代码气味?
困境 我已经阅读了很多有关面向对象实践的最佳实践书籍,几乎我读过的每一本书都有一部分内容,他们说枚举是一种代码味道。我认为他们已经错过了解释枚举何时有效的部分。 因此,我正在寻找准则和/或用例,其中枚举不是代码的味道,而实际上是有效的构造。 资料来源: “根据经验,枚举是代码的味道,应将其重构为多态类。[8]” Seemann,Mark,依赖注入,.Net,2011年,第2页。342 [8] Martin Fowler等人,《重构:改进现有代码的设计》(纽约:Addison-Wesley,1999年),第82页。 语境 我陷入困境的原因是交易API。通过以下方法,他们给了我Tick数据流: void TickPrice(TickType tickType, double value) 哪里 enum TickType { BuyPrice, BuyQuantity, LastPrice, LastQuantity, ... } 我尝试过围绕该API进行包装,因为打破更改是该API的生活方式。我想跟踪包装器上最后收到的刻度线类型的值,并且通过使用ticktypes字典来做到这一点: Dictionary<TickType,double> LastValues 在我看来,如果将它们用作键,这似乎是对枚举的正确使用。但是我有第二个想法,因为我确实有一个地方可以根据这个集合做出决定,而且我想不出一种消除消除switch语句的方法,我可以使用一个工厂,但是那个工厂仍然会有一个在某处切换语句。在我看来,我只是在移动东西,但仍然闻起来。 找到枚举的不容易,但是要做到的却不那么容易,如果人们可以分享他们的专业知识,利弊,我将不胜感激。 第二个想法 有些决定和行动是基于这些决定和行动的TickType,我似乎想不出消除枚举/切换语句的方法。我能想到的最干净的解决方案是使用工厂并返回基于的实现TickType。即使那样,我仍然会有一个switch语句,该语句返回接口的实现。 下面列出的是示例类之一,在其中我怀疑自己可能使用的枚举错误: public class ExecutionSimulator { Dictionary<TickType, double> LastReceived; void ProcessTick(TickType tickType, double value) { //Store Last Received …

4
在一处管理客户端和服务器端验证
我在船上100%与1的情况应该 肯定使用了客户端和服务器端的数据验证。 但是,在我工作过的框架和环境中,我见过的方法从来都不是DRY。大多数情况下,没有计划或模式-验证写在模型规范中,而验证则写在视图上的表单中。(注意:我大部分的第一手经验是使用Rails,Sinatra和带有jQuery的PHP) 考虑一下,创建一个生成器似乎并不困难,只要生成一组验证(例如,模型名称,字段,条件),就可以生成必要的客户端和服务器端材料。或者,这种工具可以接受服务器端验证(例如validatesActiveRecord模型中的代码),并生成客户端验证(例如jQuery插件),然后将其应用于表单。 显然,以上只是“嘿,我有这个主意”,而不是正式的建议。这种事情肯定比这个主意击中时看起来要困难得多。 这使我想到一个问题:您将如何设计一种“一次写入,在服务器和客户端上运行”的数据验证技术? 相关子主题:是否存在针对任何特定框架或客户端服务器技术的类似工具?尝试仅维护一组验证有哪些主要难题或挑战?

5
在TDD中,如果我编写的测试用例在不修改生产代码的情况下通过了,那意味着什么?
这些是Robert C. Martin的TDD规则: 除非要通过失败的单元测试,否则不允许编写任何生产代码。 您不得编写任何足以使单元测试失败的单元测试。编译失败就是失败。 您不能编写任何足以通过一项失败的单元测试的生产代码。 当我编写一个看似值得但未更改生产代码的测试通过时: 这是否表示我做错了? 如果可以帮助,将来是否应该避免编写此类测试? 我应该将该测试留在那里还是将其删除? 注意: 我在这里试图问这个问题:我可以从通过单元测试开始吗? 但是直到现在我还不能很好地阐明这个问题。

5
消息队列。数据库与专用MQ
我正在寻求有关消息队列的建议。我们要求将“职位”发布到消息队列中。 最初的建议只是使用SQL Server实例并处理来自该实例的消息。我在互联网上阅读的所有内容都表明,将数据库用于Message Queue并不是可扩展的解决方案。因此,建议使用RabbitMQ或其他第三方的MQ。 要考虑的另一件事是“作业处理”的要求不会低于30秒,因此执行作业的过程将每30秒轮询一次数据库。在我看来,这似乎还不错,并且在不向数据库中添加大量负载的情况下可以正常工作。 我们已经在客户端上建立了一个数据库,我们可以为此使用它,因此它不会为客户端增加太多额外的支持,而如果我们添加了一个第三方MQ,则会对网络配置等提供额外的支持。考虑到有很多用户,这相当可观。 我正在考虑的另一个选项是允许用户在两​​者之间进行选择。如果他们是小用户,则可以使用Sql Server解决方案,但如果他们是大用户,则可以允许他们配置第三方MQ解决方案。 我没有出售任何解决方案,我想知道是否有人有我应该考虑或建议的东西。


3
为什么要使用(检查过的)异常之一?
不久之前,我开始使用Scala而不是Java。对我来说,在这些语言之间进行“转换”过程的一部分是学习使用Eithers而不是(checked)Exceptions。我已经用这种方式编码了一段时间,但是最近我开始怀疑这是否真的是更好的方法。 一个主要的优点Either拥有Exception更好的性能; 一个Exception需要建立一个堆栈跟踪和被抛出。据我了解,虽然Exception不是必须的,但构建堆栈跟踪是必需的。 但随后,人们总是可以构建/继承Exceptions的scala.util.control.NoStackTrace,更是这样,我看到很多的情况下,其中的左侧Either实际上是一个Exception(免收性能提升)。 另一个优点Either是编译器安全。Scala编译器不会抱怨未处理Exception的(不同于Java的编译器)。但是,如果我没记错的话,那么这个决定就是用与本主题中讨论的相同的推理来推理的,所以... 在语法方面,我觉得Exception-style更清晰。检查以下代码块(均实现相同的功能): Either 样式: def compute(): Either[String, Int] = { val aEither: Either[String, String] = if (someCondition) Right("good") else Left("bad") val bEithers: Iterable[Either[String, Int]] = someSeq.map { item => if (someCondition(item)) Right(item.toInt) else Left("bad") } for { a <- aEither.right bs <- reduce(bEithers).right ignore <- validate(bs).right …

5
我们什么时候应该使用MongoDB?
MongoDB是一个NoSQL数据库,我发现它非常易于使用。最近,我不得不开发一个简单的应用程序,该应用程序需要使用HTTP请求收集一些数据并在处理数据后存储一些结果,然后我尝试使用MongoDB。 通过这种经验,我发现使用它比使用传统的关系数据库要好得多,并且由于我是开发人员而不是DBA,因此极大地简化了我的工作。 不过,有时我不确定何时应该使用MongoDB代替传统的关系数据库(如SQL Server或MySQL)。 在那种情况下,何时可以使用MongoDB代替关系数据库?是否有关于MongoDB的重大警告,使其在某些情况下不合适?

2
压拉请求会破坏git的合并算法吗?
我目前在一家使用VSTS管理git代码的公司工作。Microsoft合并分支的“推荐”方法是进行“挤压合并”,这意味着该分支的所有提交都被压缩为一个合并了所有更改的新提交。 问题是,如果我在一个分支中对一个积压项目进行了一些更改,然后立即开始在另一个分支中对另一个积压项目进行更改,而这些更改取决于第一个分支的更改集怎么办? 我可以为该积压项目创建一个分支,并将其基于第一个分支。到目前为止,一切都很好。但是,当需要为我的第二个分支创建一个拉取请求时,第一个分支已经合并到master分支中了,因为它是作为壁球合并完成的,所以git会标记很多冲突。这是因为git看不到第二个分支所基于的原始提交,它只看到一个大壁球合并,因此为了合并第二个分支以掌握它,它尝试重播第一个分支的所有提交。壁球合并的顶部,引起很多冲突。 所以我的问题是,有什么办法可以解决这个问题(除了从不将一个功能分支从另一个功能分支上转移出去,这限制了我的工作流程),或者壁球合并只是打破了git的合并算法?
17 git 

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.