软件工程

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


5
与观察者模式相比,委托模式有什么优势?
在委托模式中,只有一个对象可以直接侦听另一对象的事件。在观察者模式中,任意数量的对象都可以侦听特定对象的事件。当设计一个需要通知其他对象事件的类时,为什么要在观察者模式上使用委托模式?我认为观察者模式更加灵活。您现在可能只有一个观察者,但是将来的设计可能需要多个观察者。

4
currying或部分应用有什么特别之处?
我每天都在阅读有关函数式编程的文章,并尝试尽可能地应用一些实践。但是我不明白在currying或部分应用程序中有什么独特之处。 以以下Groovy代码为例: def mul = { a, b -> a * b } def tripler1 = mul.curry(3) def tripler2 = { mul(3, it) } 我不了解tripler1和之间的区别tripler2。他们不是都一样吗?在纯或部分功能的语言(例如Groovy,Scala,Haskell等)中支持“ currying”。但是,我可以通过简单地创建另一个命名或匿名方法来做相同的事情(left-curry,right-curry,n-curry或部分应用程序)函数或闭包将tripler2大多数语言(甚至C)中的参数转发到原始函数(如) 我在这里想念什么吗?在某些地方可以在Grails应用程序中使用currying和Partial应用程序,但是我很犹豫这样做,因为我在问自己“那有什么不同?” 请赐教。 编辑:你们是说部分应用程序/ currying比创建/调用将默认参数转发到原始函数的另一个函数更有效吗?

5
是否有允许您对类型进行算术设置的编程语言?
出于好奇,是否存在允许您对类型进行设置算术以创建新类型的语言?就像是: interface A { void a(); void b(); } interface B { void b(); void c(); } interface C = A & B; // has b() interface D = A | B; // has a(), b() and c() interface E = (A & B) ^ B; // has c() 我知道在某些语言中可以表达这些想法(即Java具有List<Comparable …

2
如何为项目构建git仓库?
我正在为Drupal开发内容同步模块。有一个服务器模块,它位于网站上,并通过Web服务公开内容。还有一个客户端模块,它位于不同的站点上,并定期提取和导入内容。 服务器在Drupal 6上创建。客户端在Drupal 7上创建。将需要Druapl 7版本的服务器。明年发布后,客户端和服务器都需要Drupal 8版本。 我对git和源代码控制还很陌生,所以我想知道设置git存储库的最佳方法是什么?如果是每个实例都有一个单独的存储库,即: Drupal 6 server = 1 repository Drupal 6 client = 1 repository Drupal 7 server = 1 repository Drupal 7 client = 1 repository etc 还是有一个服务器存储库和一个客户端存储库,然后为每个Drupal版本创建分支会更有意义? 目前,我有2个存储库-一个用于客户端,另一个用于服务器。

5
“编程错误”例外-我的方法是否正确?
我目前正在尝试改善对异常的使用,发现了在表示编程错误的异常(例如,有人将null作为参数传递,或在对象被处置后调用方法)与在编程中指示失败的异常之间的重要区别。不是调用者的错误的操作(例如,I / O异常)。 这两种例外应如何区别对待?您是否认为需要明确记录错误异常,还是足以记录相关的前提条件?并且您是否可以忽略前提条件或错误异常的文档(如果它很明显)(例如,ObjectDisposedException在处置对象上调用方法时)
9 java  c#  c++  exceptions 

7
测试时间长时如何保持行李箱稳定?
我们提供三套测试套件: 一个“小型”套件,只需几个小时即可运行 耗时数小时的“中型”套件,通常每晚(每晚) 一个“大型”套件需要一周以上的时间才能运行 我们也有很多较短的测试套件,但在这里我不关注它们。 当前的方法是在每次提交到干线之前运行小型套件。然后,中型套件每天晚上运行,如果早晨发现它失败了,我们将尝试找出应归咎于昨天提交中的哪个,回滚该提交,然后重试测试。对于大型套房,只执行每周一次而不是每晚一次的类似过程。 不幸的是,中型套件确实经常失败。这意味着后备箱通常是不稳定的,当您要进行修改和测试时,这非常烦人。这很烦人,因为当我从后备箱中退房时,我无法确定它是否稳定,并且如果测试失败,我也无法确定它是否是我的错。 我的问题是,是否存在一些已知的方法来处理此类情况,以使行李箱始终处于最佳状态?例如:“提交到一个特殊的预提交分支,该分支将在每夜经过时定期更新中继”。 它是像SVN这样的集中式源代码控制系统还是像git这样的分布式源代码控制系统有关系吗? 顺便说一下,我是一名初级开发人员,但更改功能的能力有限,我只是想了解是否有办法解决我遇到的这种痛苦。

3
我该如何为“依赖管理”辩护?
我目前正在尝试为构建(ala Maven,Ivy,NuGet)采用依赖管理,并为共享模块创建内部存储库,我们在十几个企业范围内。这种构建技术的主要卖点是什么?到目前为止,我有: 简化了分发和导入共享模块的过程,尤其是版本升级。 要求精确记录共享模块的依赖性。 从源代码管理中删除共享模块,加快并简化检出/检入(当您的应用程序具有20多个库时,这是一个实际因素)。 使您可以更好地控制或了解组织中使用了哪些第三方库。 我有没有卖点?是否有研究或文章提供改进指标?

2
在开始新开发之前或标记发行版之前,请突出版本,哪个更好?
一些项目在启动新开发项目之前会更改版本,而其他项目在标记发布时会更改版本。 哪种方法更好? 如果在新阶段开始时未更改版本号,则开发人员可能会忘记更改它,而只是发布程序。 如果在发布标记之前更改了版本号,则2个版本号(标记和Makefile / AssemblyInfo.cs)不匹配。 git describe 如果当前版本是在v1.2.3.4之后,则可能会给您v1.2.3.4-15-g1234567,但您已经将文件更改为具有v1.2.3.5

5
如何在BDD规范研讨会上取得成功?
今天,我们试图通过举办一个规范研讨会将BDD引入我们的软件开发过程中。 在这个研讨会上,我们有2个开发人员,1个测试人员和1个业务分析师。研讨会持续了1h30,到最后,我们设法为我们的新功能找出了一些BDD方案。我们试图集中精力寻找可能错过的场景和困难的场景。 在研讨会结束时,实际上有些人对研讨会不满意。 一位开发人员觉得他浪费了时间,因为业务分析师习惯于直接向他给出方案并与她一起进行审查。业务分析师对我们的方案覆盖范围没有信心(感觉我们可能会漏掉其他重要内容),但更重要的是,因为她本可以自己弄清楚所有这些方案,所以这次研讨会也是浪费时间并且在较短的时间内。 这个实验性的研讨会持续了1h30,到最后,我们对所做的事情没有足够的信心...确保我们可以花更多的时间在上面,但是老实说,大多数人在1h30的头脑风暴后精疲力尽以开展业务来自广管局的规则。 所以我的问题是,这种研讨会实际上如何运作。从理论上讲,给定要开发的新功能,您可以将树“ amigos”(dev / tester / ba)放在同一个房间中,以便他们可以协作使用示例编写新功能的不同要求。我可以看到所有的好处。特别是在知识共享和共同产品/最终目标/完成的愿景方面。 我们从这个实验的结论是,它实际上是更经济有效的方法首先对例子BA工作在他自己的,只有再有场景进行审查/由3“吾友”返工。通过让广管局独自工作,我们实际上更加自信,我们将不会错过任何东西,而我们仍然可以在事后审查方案以进行双重检查。我们认为,仅凭一次简单的头脑风暴/刻意发现会议就不足以真正满足一项新功能的所有要求。业务分析师实际上是此类人员的最佳人选。我们能做的最好的事情是回顾她写的内容,然后看看我们是否有共同的理解(这可能导致重写她的某些情况或添加她可能错过的新情况)。 那么,如何才能在实践中有效地发挥作用呢?
9 bdd 

3
具有副作用的封闭器是否被视为“功能样式”?
许多现代编程语言都支持某种闭包概念,即一段代码(一个块或一个函数) 可以被视为一个值,因此可以存储在变量中,传递给代码的不同部分,可以在一个程序的一部分中定义,并可以在同一程序的完全不同的部分中调用。 可以从定义它的上下文中捕获变量,并在以后调用它时访问它们(可能在完全不同的上下文中)。 这是用Scala编写的闭包示例: def filterList(xs: List[Int], lowerBound: Int): List[Int] = xs.filter(x => x >= lowerBound) 函数文字x => x >= lowerBound包含free变量lowerBound,该变量由filterList具有相同名称的函数的参数关闭(绑定)。该闭包将传递给library方法filter,该方法可以作为常规函数重复调用它。 我已经在该站点上阅读了很多问题和答案,据我所知,术语闭包通常会自动与函数式编程和函数式编程风格相关联。 维基百科上的函数编程的定义为: 在计算机科学中,函数式编程是一种编程范例,将计算视为对数学函数的评估,并避免了状态数据和可变数据。与强调状态变化的命令式编程风格相反,它强调函数的应用。 并进一步 在函数代码中,函数的输出值仅取决于输入到函数的参数。消除副作用可以使理解和预测程序的行为变得更加容易,这是开发函数式编程的主要动机之一。 另一方面,编程语言提供的许多闭包构造允许闭包捕获非局部变量并在调用闭包时对其进行更改,从而对定义它们的环境产生副作用。 在这种情况下,闭包实现了函数编程的第一个想法(函数是可以像其他值一样移动的一流实体),却忽略了第二个想法(避免了副作用)。 带有副作用的闭包的这种使用是否被视为功能样式,还是被视为可以用于功能性和非功能性编程样式的更通用的构造?是否有关于该主题的文献? 重要的提示 我不是在质疑副作用或关闭副作用的有用性。另外,我对讨论带或不带副作用的闭合的优缺点没有兴趣。 我只想知道函数编程的支持者是否仍将使用此类闭包视为函数样式,或者相反,在使用函数样式时不鼓励使用此类闭包。

4
我应该如何实现命令处理应用程序?
我想制作一个简单的概念验证应用程序(REPL),该应用程序需要一个数字,然后处理该数字上的命令。 示例:我从1开始。然后我写“ add 2”,它给我3。然后我写“ multiply 7”,它给我21。然后我想知道它是否是素数,所以我is prime在当前数字上写“ ”( 21),这给了我错误。” is odd将使我成真。等等。 现在,对于具有很少命令的简单应用程序,即使是简单的应用程序switch也可以处理命令。但是,如果我想要扩展性,我将如何实现功能?我是否使用命令模式?我是否为该语言构建简单的解析器/解释器?如果我需要更复杂的命令(例如“ multiply 5 until >200”)怎么办?没有重新编译就可以扩展它(添加新命令)的简单方法是什么? 编辑:为了澄清一些事情,我的最终目标不是制作类似于WolframAlpha的东西,而是制作一个(数字列表)处理器。但是,我想一开始慢慢开始(以单个数字开始)。 我想到的是与使用Haskell处理列表的方式类似的方法,但它是一个非常简单的版本。我想知道像命令模式(或等效命令)之类的内容是否足够,还是我必须制作一个新的迷你语言和一个解析器来实现我的目标? Edit2:感谢所有答复,所有这些对我都非常有帮助,但是Emmad Kareem对我的帮助最大,所以我选择它作为答案。再次感谢!

4
专业的应用程序开发人员如何使用版本控制系统(如GIT和Subversion)?
我是一名初学者开发人员,从一开始我就一直在想,如何使用诸如GIT和Subversion之类的专业工具(我对这些工具没有很好的了解)来满足他们项目的需求。如果他们确实使用它,我将如何设置类似的东西? 我的申请不是很大,我还没有加入团队,这对我有很大帮助吗? 这个网站上有关于如何使用工具的问题,但是我需要初学者的支持。

1
与(通用)框架名称冲突的类名称应该怎么做
当框架使用最明显的组件类名称时,应该怎么做?就我而言,我需要创建一个描述HTTP请求的类。当然,最常用的名称是“采用”为System.Web.HttpRequest。我该怎么办?该项目将在Web上下文中使用,所以我真的不想强迫人们不要导入System.Web命名空间,或者手动键入我所有的类名。 处理此问题的通常方法是什么?我可以提出: 带项目简称的前缀类名 尝试使用不同的名称表示相同的意思(我已经尝试过,但无法提出任何建议) 强制用户在名称空间之间进行选择
9 c#  .net  naming  namespace 

2
飞机系统中使用的汇编语言
今天我的讲师提到了用汇编语言对飞机系统进行编程的原因是由于编写的程序出错少。这句话是真的吗?因为当他问我们的意见时,我说过程序集可以创建更快的程序,因此对于面向实时的飞机系统程序来说,这是一种很好的语言。我在Google周围搜索,但似乎找不到一篇澄清讲师陈述的文章。
9 assembly 

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.