软件工程

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

3
代码背后的目的是否“惯用”以减少认知开销?
我试图向某人解释,他们编写代码的方式很难理解,并且如果您重构它,那么它更容易阅读。我正在使用的这种代码风格通常称为“惯用代码”。 但是,惯用代码一词带来了道德上的正确性,这并不是促使人们改变其编码风格的巨大动力。一种更积极的说法是遵循通用样式的代码 -但对于批判性思想家来说,这种想法是随众而为的。 我提出这个想法的方式可以激发人们更改他们的代码: 以减少读者认知负担的方式编写代码(例如,我不记得这是第一类矢量还是第五类矢量) 易于理解意图的代码(例如,此向量的作用是什么?) (顺便说一句,我知道《 Clojure的喜悦》一书在其首次发行之前就具有标题“ Idiomatic Clojure”的草稿。因此,这似乎是使代码“惯用”,从而为读者“带来喜悦”的原因。 )。 我的问题是:代码背后的目的是“惯用的”以减少认知开销吗?
22 idioms 

4
在GitHub流中,可以将功能分支基于另一个功能分支吗?
我们在项目中使用GitHub Flow,大多数时候,我们从master开一个新的功能分支,在那做一些工作,打开PR,查看代码,然后合并回master。 但是,我目前的工作取决于中正在处理的另一个问题feature-branch-A。从另一个分支创建我的分支是否符合犹太规范,还是违背GitHub Flow的精神? 另一种选择是将我的分支基于master并合并feature-branch-A(经常)进行的更改。 GitHub流中首选哪个选项?
22 git  github  gitflow 

4
为什么不让非参数化查询返回错误呢?
SQL注入是一个非常严重的安全性问题,很大程度上是因为它很容易弄错:显而易见的,直观的方法来构建包含用户输入的查询,这使您容易受到攻击,而减轻它的正确方法则需要您了解参数化查询和SQL注入优先。 在我看来,解决此问题的显而易见的方法是关闭一个显而易见的(但错误的)选项:修复数据库引擎,以便接收到的所有在其WHERE子句中使用硬编码值而不是参数的查询都返回一个漂亮的,描述性的错误消息,指示您改为使用参数。显然,这需要有一个退出选项,这样管理工具中的临时查询之类的东西仍然可以轻松运行,但是默认情况下应启用它。 这样做将关闭SQL注入冷服务,几乎在一夜之间,但是据我所知,实际上没有RDBMS这样做。有什么理由不这样做吗?
22 security  sql  rdbms 

2
在VCS中存储软件版本号是一种好习惯吗?
产品版本(例如)v1.0.0.100不仅代表软件的唯一生产版本,而且还有助于识别该产品的功能集和修补程序阶段。现在,我看到两种方法来维护产品的最终程序包/内部版本/二进制版本: 版本控制。一个文件存储着版本号。持续集成(CI)构建服务器将具有脚本来构建软件,该脚本使用此签入的版本号将其应用于所需的软件的所有区域(二进制文件,安装程序包,帮助页面,文档等)。 环境和/或构建参数。这些在版本控制之外进行维护(即,它们不依赖于快照/标签/分支)。构建脚本以相同的方式分配和使用数字,但是它们只是以不同的方式获取值(将其提供给构建脚本,而不是让脚本知道相对于源树在何处获取该值)。 第一种方法的问题在于,它会使跨主线分支的合并变得复杂。如果您仍然维护同一软件的2个并行发行版,并且自上次合并以来两个主版本的版本均已更改,则将在合并两个主干之间时解决冲突。 第二种方法的问题是和解。回到1年前的发行版时,您将仅依靠标签信息来标识其发行版号。 在这两种情况下,版本号的某些方面可能在CI生成之前是未知的。例如,CI构建可能会以编程方式放入第4个组件,该组件实际上是自动构建编号(例如,分支上的第140个构建)。它也可能是VCS中的修订号。 跟上软件版本号的最佳方法是什么?是否应始终在VCS中维护“已知”部分?如果是这样,主线分支之间的冲突是否成为问题? 现在,我们通过CI构建计划(Atlassian Bamboo)中指定和维护的参数来维护版本号。在合并到我们的master分支机构之前,我们必须小心一点,即在开始构建CI之前已正确设置了版本号。关于Gitflow工作流程,我认为,如果在源代码管理中跟踪了版本号,我们可以保证在创建release分支以准备发布时正确设置了版本号。质量检查人员将在该分支机构上执行最终的集成/烟熏/回归测试,并在签收后进行合并,master这表示发布承诺。

8
如何在团队中促进使用Builder模式?
我们的代码库是新老程序员,像我自己一样,为了统一起见,他们很快就学会了按照做事的方式来做。考虑到我们必须从某个地方开始,我自己决定重构一个数据持有者类,如下所示: 删除了setter方法,并设置了所有字段final(我final理所当然地认为“ 好”)。事实证明,该二传手仅在构造函数中使用,因此没有副作用。 引入了一个Builder类 Builder类是必需的,因为构造函数(首先是提示重构的原因)跨越大约3行代码。它有很多参数。 幸运的是,我的一个团队的成员正在另一个模块上工作,并且碰巧需要设置者,因为他需要的值在流程的不同点可用。因此,代码如下所示: public void foo(Bar bar){ //do stuff bar.setA(stuff); //do more stuff bar.setB(moreStuff); } 我认为他应该改用构建器,因为摆脱设置器可以使字段保持不变(他们之前听说过关于不变性的内容),并且还因为构建器允许对象创建是事务性的。我草绘了以下伪代码: public void foo(Bar bar){ try{ bar.setA(a); //enter exception-throwing stuff bar.setB(b); }catch(){} } 如果引发该异常,bar将有损坏的数据,而使用构建器可以避免: public Bar foo(){ Builder builder=new Builder(); try{ builder.setA(a); //dangerous stuff; builder.setB(b); //more dangerous stuff builder.setC(c); return builder.build(); }catch(){} …

5
如何管理垃圾桶用户?
我创建了一个系统,希望它将有很多用户。我们担心我们的数据库将堆满使用高要求用户名的垃圾用户,或者他们只是注册而永不回来。 我知道这很常见,我自己做,因为我有3个Google帐户,但我只使用1。一个大型网站如何管理垃圾用户或永远不会像这样回来?

8
如何处理大量失败的测试?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 我正在开发一个用Java编写的旧项目。我们有超过1000万个LOC,更糟糕的是,有4000多个功能测试。 由哈德森(Hudson)安排的测试由于每次较大的代码更改而疯狂,但都失败了。验证测试失败-如果是产品或测试中的问题,则需要几个月的时间。我们无法删除旧测试,因为我们不知道它们在测试什么! 我们能做什么?如何进行如此大量的传统测试?


2
功能所有权是一种好习惯吗?
最近,在我公司中,有人建议一位开发人员应该(仅一位)专注于一项功能。这意味着要像将开发人员置于正常的团队常规工作之外,再将其承担其他职责(会议等),而此人将是负责该功能(技术上明智)的“唯一”人员。 作为记录,我们在SAFe中使用SCRUM,并且每个团队都有专职开发人员,在我们两个团队(Android和iOS)之间共享质量检查和产品所有者。 尽管我同意这会在短期内提高生产率,但我有一种感觉(我认为我是在大学里学到的),这是一个不好的做法,原因有很多: 代码审查失去价值。 最少的知识共享。 风险增加。 失去团队灵活性。 我说的对吗,或者这不是一个坏习惯?

3
与在创建过程中可变但之后不可变的成员一起上课
我有一个创建对象集合的算法。这些对象在创建期间是可变的,因为它们最初很少,但是随后在算法中的不同位置填充了数据。 算法完成后,就决不能更改对象,但是对象会被软件的其他部分消耗。 在这些情况下,如下所述,拥有该类的两个版本是否被视为一种好习惯? 可变的是由算法创建的,然后 算法完成后,将数据复制到不可变的对象中,然后将其返回。
22 c# 

4
git“重新定金的黄金法则”是如此重要吗?
最近,我与绝对反对在GIT上对功能分支的重新定位策略的人们进行了讨论。这似乎是一种公认​​的模式,仅对本地私有分支使用rebase,但是当有多个人在同一个功能和分支上工作时,从不使用它,这就是所谓的“重新分配的黄金法则”(如此处所述:https ://www.atlassian.com/git/tutorials/merging-vs-rebasing/conceptual-overview) 我只是对此感到惊讶。我花了3年的时间制定了完整的重新调整策略,大约有20位开发人员共同努力,并猜出了什么有效。 该过程基本上是: 创建功能分支,我们将其称为“ myfeature”,并将其推送到origin / myfeature 其他人可能会检查出来并进行处理 您有时可能会从master重新设置它的基准:从“ myfeature”,git rebase origin / master ; 然后,是的,您必须强制使用它。 当其他人想要推送他们的提交时会发生什么?他们只是重新设置它的基础:git rebase origin / myfeature。因此,他们现在处在快速前进的过程中,无需强求就可以推动它。 要遵守的唯一原则是要素分支由某人拥有。所有者是唯一可以推动力量的人。 因此,我承认:只要有推动力,就有犯错误的风险。确实如此。但是也有很多方法可以从错误中恢复,实际上,在3年的开发中,我没有看到很多强制错误,而且当它发生时,我们总能找到一种正确恢复的方法。 那么,为什么这种“黄金基础规则”被如此广泛地接受呢?我还有其他想念的吗?我了解这需要最少的组织(每个策略都需要某些组织),但是它可以工作。
22 git 


3
是否有没有继承的OO语言?
在今天的代码审查中,我的一位同事说了一些有趣的事情: prototype仅在需要继承时才有用- 何时继承是个好主意? 我考虑了一下,然后意识到,我通常使用继承来解决最初设计不好的代码。现代的OO风格更喜欢使用组合而不是继承,但是我不知道有哪一种语言能够真正做到这一点并真正执行它。 是否有带有类,对象,方法,接口等的通用编程语言,这些语言不允许基于类的继承?(如果这样的想法没有意义,为什么不呢?)

5
保持与实现不可知论真的值得吗?
我有一个正在使用Tomcat,Spring 4,Spring Security,MySQL和带有Hibernate的JPA的项目。 我从JPA的角度出发选择了JPA,它是为了使ORM提供程序的基础实现无缝交换,或者至少减轻痛苦。我要说的是,在思想上使用规范而非实现(JAX-RS)是Java开发社区的默认观点。 我很好奇这是否真的值得一做。我敢肯定,如果我直接使用Hibernate,我会获得一些力量,因为我可以使用不属于主要JPA规范的功能。 我的部分担忧来自YAGNI的想法。我本质上是以特定的样式和方式编程(使用JPA而不是Hibernate),以便将来可以在某些时候换出我的ORM实现。我严重怀疑这种情况会在产品的整个生命周期内发生,因此,我实质上是在努力做一些我可能永远不会从中受益的事情。 你怎么看?对于诸如JPA之类的东西,“编程接口”是否值得?您是否曾经在产品中交换过整个ORM实施?您是否曾经能够完全避免像JPA这样的泄漏引起的抽象?我个人已经有一个本地SQL调用(以清理数据库表),并且我想在JPA规范中内置一些功能(获取/设置方法的前缀,以及MEMBER OF之间的区别) / IN,它只会将自己绑定到底层实现上,这给了我避免的机会。


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.