软件工程

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

8
如何针对最终一致的服务编写测试?
我正在Google App Engine数据存储区上构建服务,这是最终一致的数据存储区。对于我的应用程序,这很好。 但是,我正在开发测试,这些测试执行的操作类似PUT对象,然后执行GET对象,并检查返回对象的属性。不幸的是,因为数据存储最终是一致的,所以这些简单的测试无法重现。 您如何测试最终一致的服务?

5
如果将函数作为参数,函数是否立即不纯?
由于输入参数的纯度直到运行时才是未知的,如果将函数作为输入参数,该函数是否立即被认为是不纯的? 相关:如果一个函数应用了一个在函数外部定义的纯函数,但没有作为参数传递,那么它是否满足纯函数的要求,即输出是否仅取决于输入,它是否仍然是纯函数? 对于上下文,我正在用JavaScript编写功能代码。

4
IO monad模式处理副作用的好处是否纯粹是学术上的?
对不起,还有另一个FP +副作用问题,但是我找不到一个可以完全回答我的问题。 我对函数式编程的(有限的)理解是,应将状态/副作用最小化并与无状态逻辑分开。 我还收集了Haskell的方法,即IO monad,它通过将有状态的动作包装在一个容器中以供以后执行(被认为超出程序本身的范围)来实现。 我试图理解这种模式,但实际上是确定是否在Python项目中使用它,因此要避免使用Haskell规范。 粗暴的例子来了。 如果我的程序将XML文件转换为JSON文件: def main(): xml_data = read_file('input.xml') # impure json_data = convert(xml_data) # pure write_file('output.json', json_data) # impure IO monad的方法不是有效地做到这一点: steps = list( read_file, convert, write_file, ) 然后通过不实际调用这些步骤来放任自己的责任,而是让口译员这样做? 换一种说法,就像写: def main(): # pure def inner(): # impure xml_data = read_file('input.xml') json_data = convert(xml_data) write_file('output.json', …

3
向小型团队介绍版本控制分支策略
我是最近刚从一家公司开始的承包商。 团队是由3位开发人员组成的,其中包括2位初级到中级开发人员,以及即将在同级别开始的另一位开发人员和我本人(6年xp)。对于这两个现有的开发人员来说,这是他们从大学/学院毕业后的第一份工作,而且他们之前从未有资深开发人员来监督他们的工作。 没有明确的版本控制策略。开发人员在主干上进行所有开发,然后从其开发机器直接部署到生产中。现有团队不熟悉分支。 我正在改变所有这些,并引入CI,TDD测试/登台/生产服务器等,以及与此相辅相成的版本控制策略。 源代码控制系统是TFS,我以前从未使用过。它被配置为一个巨型存储库。 我已经为他们写下了一些建议,但是考虑到团队的经验,我还有什么要补充/修改的? 版本控制政策 开发在主干上完成 如果更改估计要花费一周以上的时间,则应在分支上完成,并定期从主干合并到分支中,以阻止两者不同步。 释放为生产代码创建的分支。该分支应该只包含稳定的代码。我们可以有一个发布分支,每个sprint从主干更新一次,或者我们可以每周创建一个单独的发布分支。 如果需要进行影响生产代码的紧急错误修复,则在发布分支上进行修复,然后合并回主干。 如果我们采用一个发布分支策略,则主干将在每个sprint接近sprint末尾时合并到release分支中。 如果我们采用每个发布策略独立的分支,那么主干永远不会合并到Release分支中 在某些情况下,如果分支之间的差异太大,可能有必要在不同的分支上进行两次错误修复。如果我们正在做短距离的冲刺,那么这应该不会经常发生。 我计划有三台服务器。测试环境始终在存储库中运行最新代码。一个暂存环境,该暂存环境正在运行用于暂存/测试“ Release Candidate”代码和UAT用途的最新候选候选版本,以及生产环境。 我计划执行此操作的原因是,到目前为止,该客户端仅完成了内部软件。最新的项目是针对高知名度的媒体客户的,我的感觉是团队需要采用比他们目前更为专业的开发模型。 例如,此刻,用户可以通过错误报告给团队打电话。开发人员找到并修复该错误,在自己的计算机上进行快速测试,然后直接部署到生产中。没有自动化测试或其他任何东西。 事后看来,我认为功能分支太远了,我将删除它。 因此,从本质上讲,它可以归结为a)完全没有分支)b)发行分支和主干,以及c)每个发行版本和主干的发行分支。 我倾向于后者。我最初的想法是,我将同时拥有一个发布候选版本和一个发布版本,可以同时在单独的服务器(UAT /生产)上运行,但是实际上,主干在任何时间点都是发布候选版本,因此每个释放趋于疯狂。我唯一的想法是,如果我们不希望我们的涉众看到开发代码,那么我们可能需要一个单独的候选发布分支,但是YAGNI以及所有这些.....

2
将免费软件移植到另一种语言时的许可条款
我正在探索将现有软件包移植到另一种语言的想法。它是根据Apache License 2.0发布的,并且是免费分发的;但是使用库与创建库副本有很大的不同。我当然会全力以赴,并且诚实地说它的来源,我当然不打算从港口赚钱,只是将其用于其他项目。 我当然已经阅读了许可证,上面写着: 授予版权许可。在遵守本许可的条款和条件的前提下,每位贡献者特此授予您永久的,全球性的,非排他的,免费的,免版税的,不可撤销的版权许可,以复制,准备,公开展示,公开表演,分许可,并以“源”或“对象”形式分发作品和此类衍生作品。 [...] 重新分配。您可以在满足以下条件的情况下,以任何媒介(有或没有修改)以及以源或对象的形式复​​制和分发作品或其衍生作品的副本: 一种。您必须向该作品或衍生作品的任何其他接收者提供本许可的副本;和 b。您必须使任何修改过的文件带有明显的声明,指出您已更改文件;和 C。您必须以您分发的任何衍生作品的“源”形式保留该作品“源”形式的所有版权,专利,商标和出处声明,但不包括与该“衍生作品”的任何部分无关的那些声明;和 d。如果作品包含“注意”文本文件作为其分发的一部分,则您分发的任何衍生作品都必须包括该通知文件中包含的署名声明的可读副本[...] 您可以在自己的修改中添加自己的版权声明,并可以提供其他或不同的许可条款和条件,以供您使用,复制或分发您的修改,或任何此类衍生作品作为一个整体,但前提是您必须使用,复制和分发否则,作品应符合本许可中规定的条件。 听起来非常像端口(作为“衍生作品”)在获得作者许可或不获得作者许可的情况下都是完全允许的,只要我认真保留许可证的副本,现有的版权声明,署名等即可。 但这并不意味着我理解它的所有含义。例如,端口是否必须与原始端口共享相同的许可证? 我还没有开始任何工作,也没有联系软件包的作者(尽管我会的)。我想确定是否有浪费大量工作的风险。我还需要知道是否仅需要基于API进行无尘室实现,还是可以将工作基于现有的源代码(我尚未研究)。

5
是什么使函数式编程语言声明式而不是命令式?
在许多描述函数式编程优势的文章中,我看到函数式编程语言(例如Haskell,ML,Scala或Clojure)被称为“声明性语言”,与命令式语言(例如C / C ++ / C#/ Java)不同。我的问题是什么使函数式编程语言具有声明性而非命令性。 一个经常遇到的描述声明式和命令式编程之间差异的解释是,在命令式编程中,您告诉计算机“如何做某事”,而不是声明性语言中的“做什么”。我在此说明中遇到的问题是,您在所有编程语言中都经常这样做。即使您进入最低级别的程序集,您仍在告诉计算机“该怎么做”,您告诉CPU将两个数字相加,但并没有指示它如何执行加法。如果我们走到另一端,像Haskell这样的高级纯函数式语言,实际上就是在告诉计算机如何完成特定任务,这就是您的程序所要执行的一系列指令,计算机无法单独实现这些任务。我了解到,Haskell,Clojure等语言显然比C / C ++ / C#/ Java高,并提供诸如惰性求值,不可变数据结构,匿名函数,currying,持久数据结构等功能,所有这些使得函数式编程是可能且高效的,但我不会将它们归类为声明性语言。 对我而言,纯声明性语言将是仅由声明完全构成的语言,此类语言的示例将是CSS(是的,我知道CSS从技术上讲不是编程语言)。CSS只包含页面的HTML和Javascript使用的样式声明。CSS除了作声明外,不能做任何其他事情,它不能创建类函数,即,基于某些参数确定要显示的样式的函数,您无法执行CSS脚本等。对于我来说,它描述了声明性语言(注意,我没有说声明性语言编程语言)。 更新: 我最近一直在使用Prolog,对我而言,Prolog是最接近完全声明式语言的编程语言(至少在我看来),如果它不是唯一的完全声明式编程语言。要详细说明Prolog中的编程,请进行声明,声明要说明事实(规则(对于特定输入返回true的谓词函数))或规则(对基于输入的给定条件/模式返回true的谓词函数),规则使用模式匹配技术定义。要在序言中做任何事情,您都可以通过用变量替换谓词的一个或多个输入来查询知识库,而序言会尝试查找谓词成功的变量的值。 我的观点是在序言中没有强制性指令,您基本上是在告诉(声明)计算机知道的信息,然后询问(查询)有关知识的信息。在函数式编程语言中,即使您不是直接操作内存位置或不逐步编写计算,也仍在给出指令,即获取值,调用函数X并为其添加1等。从这个意义上讲,我不会说用Haskell,ML,Scala或Clojure进行编程是声明性的,尽管我可能是错的。在我上面所描述的意义上,它是正确,真实,纯函数式的声明式编程。

4
单一责任原则是否适用于职能?
根据Robert C. Martin所说,SRP指出: 改变班级的理由不应该只有一个以上。 但是,在他的《清洁代码》第3章:函数中,他显示了以下代码块: public Money calculatePay(Employee e) throws InvalidEmployeeType { switch (e.type) { case COMMISSIONED: return calculateCommissionedPay(e); case HOURLY: return calculateHourlyPay(e); case SALARIED: return calculateSalariedPay(e); default: throw new InvalidEmployeeType(e.type); } } 然后指出: 此功能有几个问题。首先,它很大,并且当添加新的雇员类型时,它会增长。其次,它显然做的不止一件事。第三,它违反了“单一责任原则”(SRP),因为有多个原因使其改变。[强调我的] 首先,我认为SRP是为类定义的,但事实证明它也适用于函数。其次,该功能有多个原因需要改变吗?我只能看到它随着Employee的变化而改变。

5
枚举会创建脆弱的接口吗?
考虑下面的示例。对ColorChoice枚举的任何更改都会影响所有IWindowColor子类。 枚举会导致界面脆弱吗?是否有比枚举更好的东西可以提供更多的多态灵活性? enum class ColorChoice { Blue = 0, Red = 1 }; class IWindowColor { public: ColorChoice getColor() const=0; void setColor( const ColorChoice value )=0; }; 编辑:很抱歉使用颜色作为我的示例,这不是问题所在。这是一个不同的示例,它避免出现红色鲱鱼,并提供有关灵活性的更多信息。 enum class CharacterType { orc = 0, elf = 1 }; class ISomethingThatNeedsToKnowWhatTypeOfCharacter { public: CharacterType getCharacterType() const; void setCharacterType( const CharacterType …

2
事件源和REST
我遇到了事件源设计,我想在需要REST客户端(准确地说是RESTful)的应用程序中使用。但是,由于REST非常像CRUD,并且事件源基于任务,因此我无法将它们连接在一起。我想知道您如何设计基于对REST服务器的请求的命令创建。考虑以下示例: 借助REST,您可以将一个新状态放入名为File的资源中。在一个请求中,您可以发送新的文件名,可以更改父文件夹和/或更改文件的所有者,依此类推。 如何构造服务器,以便可以使用事件源。我在考虑这些可能性: 确定服务器上哪些字段被改变,并创建相应的命令(RenameFileCommand,MoveFileCommand,ChangeOwnerCommand,...)并单独派遣这些。但是,在这种设置中,每个命令都可能失败,从而使其他命令无法进行事务处理,从而无法进行资源的“原子”更改。 调度只需要一个命令(UpdateFileCommand),并在命令处理程序,更精确地在总量上,确定哪些领域发生了变化,并发送单个事件,而不是(FileRenamedEvent,FileMovedEvent,OwnerChangedEvent,...) 我一点都不喜欢这个命令:在对服务器的请求中,我会在标头中指定要使用的命令,因为UI仍基于任务(但通信是通过REST完成的)。但是,在REST通信的任何其他用途(例如,外部应用程序)中,它都将失败,因为它们不一定要仅更改一个请求中的一个字段。另外,我在UI,REST和基于ES的后端中引入了很大的结合。 您更喜欢哪一个,或者有更好的方法来解决这一问题? 旁注:使用Java和Axon Framework编写的用于事件源的应用程序。

4
前端开发人员是否应该为后端开发人员指定JSON格式?
我在一个项目中担任前端角色。是否应该为我的后端团队成员指定他们的PHP返回我的JavaScript的JSON确切格式? 例如,我应该告诉他们,他们应该使用类似于此处所述的格式: 构造JSON以便前端使用的正确方法 还是应该尽可能地保持角色的无菌,只用文字描述我从后端接口需要的输入和输出?(当然,如果发生这种情况,就我而言,处理它们的不同数据结构格式可能会更加困难)

1
为什么PHP如此讨厌?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 最近,我遇到了一些关于PHP多么糟糕的笑话和漫画。 作为对语言的完全无知,这是为什么?是我自己的看法,还是编程社区的总体感觉?
17 php 

7
为什么按原样创建实例?
在过去六个月的时间里,我已经学习了C#,现在正在研究Java。我的问题是关于实例创建(实际上是用两种语言)的问题,而更多的是:我想知道为什么他们这样做了。举个例子 Person Bob = new Person(); 是否有理由两次指定对象?会不会有something_else Bob = new Person()? 如果我遵循惯例,似乎会更像: int XIsAnInt; Person BobIsAPerson; 也许是其中之一: Person() Bob; new Person Bob; new Person() Bob; Bob = new Person(); 我想我很好奇是否有比“这就是完成的方式”更好的答案。


2
在连接相邻的字符串文字时
C和C ++将相邻的字符串文字编译为单个字符串文字。例如: "Some text..." "and more text" 等效于: "Some text...and more text" 在其他C系列语言(如C#或Java)中,这是一种语法错误(顺便说一句很好)。 C和C ++这样做的理由/历史原因是什么?

8
与使用DB相对,何时将一个实际数据值硬编码到代码中?
对我来说,一个长期存在的问题是:何时将数据(实际值)存储在数据库表中,何时将其正确存储在代码中? 无法达成共识的通常是这样的(*): 如果它是单个变量或简单结构,或者是几个值的数组,则将数据放在代码中。 [* 共识已在评论和答案中进行了辩论,但基本上我希望有一个前提来启动这个问题,因此随时可以提出挑战并加以改进 ] 例: $number = 44; $colors = array("blue", "yellow", ... "mauve"); 如果它具有数百行以上相同类型的数据,请使用数据库。 但是似乎有一个灰色地带。那么不清楚的情况又如何呢?做出决定时需要注意哪些注意事项和因素? 示例: 假设您的公司使用10-15种不同类型的电机框架,它们可以表示为“ 412T”。您大约有30个,并且它们很少更改。您可以为这些数据库创建数据库表,也可以在数据库中对其进行硬编码。在这种情况下,电动机是静态的,物理的东西,不太可能经常改变。 将它们保留在代码中会使它们受到源代码控制,而在数据库中,通常不会跟踪数据库更改。但是将它们保存在数据库中可以从数据中释放(分离)代码。 我可以使用的另一个(实际)示例是我的这个问题:https : //stackoverflow.com/questions/26169751/how-to-best-get-the-data-out-of-a-lookup-table(当前为48行选项数据)。

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.