软件工程

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

2
使用Subversion作为工件存储库而不是特定的工件管理工具
TL; DR:为什么使用Apache Archiva或Sonatype Nexus之类的东西作为工件存储库而不是Subversion? 我目前使用的构建系统有很多二进制Blob(图像,声音文件,已编译的二进制文件等),既可作为构建的输入也可作为输出。我们用于管理这些文件的系统非常临时;有些代码和代码一起被检入到Subversion存储库中,有些代码则存储在任何正式版本控制之外的其他位置。 我正在考虑将其合并,因此我们拥有一些更加自洽和易于使用的功能,并将二进制工件与代码分开。 Google告诉我,有一些可用的工件存储库(Archiva,Nexus, Artifactory …),但是从阅读的内容来看,与Subversion相比,使用它们没有任何优势。这将为我们照顾二进制文件-对于某些二进制文件已经做到了,我们只想重新排列存储库布局以将它们与代码分开-并具有明显的优势,因为我们已经拥有Subversion服务器和专业知识。 所以。与使用像Subversion这样的通用版本控制工具相比,使用专用的工件管理系统有什么优势?

3
为小型开源Java项目选择什么软件包名称?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 我想用Java发布一个小的开源库。我想知道应该选择哪个软件包名称?我不是公司,我没有一个可根据命名约定命名软件包的基础的域。我还是想以某种方式遵循命名约定,以防止意外冲突并使事情保持标准。

6
为什么需要单元测试来测试存储库方法?
我需要在这个问题上扮演一个恶魔倡导者,因为由于缺乏经验我无法很好地捍卫它。这是交易,我从概念上得到了单元测试和集成测试之间的区别。当专门关注持久性方法和存储库时,单元测试可能会通过Moq之类的框架使用模拟,以断言所搜索的订单已按预期返回。 假设我已经建立了以下单元测试: [TestMethod] public void GetOrderByIDTest() { //Uses Moq for dependency for getting order to make sure //ID I set up in 'Arrange' is same one returned to test in 'Assertion' } 因此,如果我设置好OrderIdExpected = 5并且我的模拟对象返回5了ID,那么我的测试就会通过。我知道了。我对代码进行了单元测试,以确保我的代码瓶坯返回期望的对象和ID,而不返回其他内容。 我将得到的参数是这样的: “为什么不跳过单元测试并进行集成测试呢?这是一起测试数据库存储过程和代码的重要性。当最终我想知道数据库是否调用时,进行单元测试和集成测试似乎是多余的工作。我知道测试需要花费更长的时间,但是无论如何都必须运行和测试它们,所以对我来说,两者都显得毫无意义。只需对重要问题进行测试。” 我可以用诸如以下的教科书定义来捍卫它:“嗯,这是一个集成测试,我们需要将代码作为单元测试和yada,yada,yada分别进行测试。”这种情况是一种纯粹的实践解释与现实的对比正在消失。有时我会碰到这种情况,如果我无法捍卫最终依赖于外部依赖关系的单元测试代码背后的原因,那我就没有理由了。 非常感谢您对这个问题的任何帮助,谢谢!

2
是否可以使用开放源代码创建封闭源软件?
当我打开帮助文件的法律部分时,我在使用一个流行的音乐包(Ableton Live),当时我看到该程序包含的代码许可证看上去既自由又自由,而且啤酒也一样。cannot,我找不到在线副本,但是如有必要,我可以列出许可的软件包。 据我所知,这里有3种可能性: 一家相当大的公司正在违反代码许可-极不可能,如果那样的话,为什么它们会包含许可文本? 实际上,出于某种原因,向包含开源代码的软件包收费并关闭源代码是合法的-绝对对我来说这是新闻。 我误会了-很有可能。

2
Protobuf设计模式
我正在评估基于Java的服务的Google协议缓冲区(但希望使用与语言无关的模式)。我有两个问题: 第一个是一个广泛的一般性问题: 我们看到人们使用什么模式?所述模式与类组织(例如,每个.proto文件,打包和分发的消息)和消息定义(例如,重复字段vs.重复封装字段*)等有关。 在Google Protobuf帮助页面和公共博客上,此类信息很少,而对于已建立的协议(例如XML)则有大量信息。 对于以下两种不同的模式,我也有特定的问题: 将消息表示为.proto文件,将它们打包为一个单独的jar,然后将其发送给服务的使用者-这基本上是我认为的默认方法。 这样做,但在每条消息周围包括手工包装器(不是子类!),这些消息实现了至少支持这两种方法的协定(T是包装器类,V是消息类(使用泛型,但为简化起见简化了语法) : public V toProtobufMessage() { V.Builder builder = V.newBuilder(); for (Item item : getItemList()) { builder.addItem(item); } return builder.setAmountPayable(getAmountPayable()). setShippingAddress(getShippingAddress()). build(); } public static T fromProtobufMessage(V message_) { return new T(message_.getShippingAddress(), message_.getItemList(), message_.getAmountPayable()); } 我从(2)中看到的一个优点是,我可以隐藏由它引入的复杂性,V.newBuilder().addField().build()并在包装器中添加一些有意义的方法,例如isOpenForTrade()或isAddressInFreeDeliveryZone()等。我在(2)中看到的第二个优点是我的客户端处理了不可变的对象(可以在包装类中强制执行的事情)。 我在(2)中看到的一个缺点是我复制了代码,并且不得不将包装类与.proto文件进行同步。 有没有人对这两种方法有更好的技巧或进一步的批评? *通过封装重复字段,我的意思是像这样的消息: message ItemList { repeated …


2
检查用@Nonnull注释的参数是否为null?
我们已经开始使用FindBugs并@Nonnull适当地注释了我们的参数,它很有效地指出了周期早期的错误。到目前为止,我们一直在null使用Guava的方法继续检查这些参数checkNotNull,但我宁愿null仅在边缘进行检查-无需检查即可输入值的地方null,例如SOAP请求。 // service layer accessible from outside public Person createPerson(@CheckForNull String name) { return new Person(Preconditions.checkNotNull(name)); } ... // internal constructor accessed only by the service layer public Person(@Nonnull String name) { this.name = Preconditions.checkNotNull(name); // remove this check? } 我了解这本身@Nonnull并不会阻止null价值观。 但是,鉴于FindBugs会指出将值从未标记字段转移到已标记字段的任何地方@Nonnull,我们是否可以依靠它来捕获这些情况(它确实如此),而不必在null传递给它们的任何地方检查这些值系统?我是否天真地想要信任该工具并避免进行这些冗长的检查? 底线:虽然删除null下面的第二张支票似乎很安全,但这是不好的做法吗? 这个问题可能与“ 如果有人不希望null,是否应该检查null”这个问题太相似了,但是我要特别问一下@Nonnull注解。
19 java  null 

5
Google Closure是真正的编译器吗?
这个问题的灵感来自对此Stack Overflow问题的评论中的辩论。在谷歌关闭编译文档指出以下(强调): Closure Compiler是使JavaScript下载和运行速度更快的工具。这是一个真正的JavaScript编译器。它不是从源语言编译为机器代码,而是从JavaScript编译为更好的JavaScript。 但是,维基百科给出了“编译器”的以下定义: 编译器是一种计算机程序(或一组程序),可以将以编程语言(源语言)编写的源代码转换为另一种计算机语言。语言。 基于此,我想说Google Closure不是编译器。但是Google明确声明它实际上是一个“真正的编译器”,这一事实使我想知道是否还有更多功能。Google Closure真的是JavaScript编译器吗?

4
RPG棋盘游戏规则的通用规则解析器-怎么做?
我想为笔和纸风格的RPG系统构建一个通用的规则解析器。规则通常可以包含1到N个实体,一个骰子的1个到N个角色,并基于一个实体的多个属性来计算值。 例如: 玩家拥有STR 18,他目前装备的武器使他获得+1 STR的加值,但获得了DEX -1的恶意。他攻击一个怪物实体,并且现在需要运行游戏逻辑来运行一组规则或动作: 玩家掷骰子,如果他获得例如8或更高(他需要传递的基本攻击值是其基本属性之一!),则攻击成功。然后,怪物掷骰子以计算攻击是否通过了它的装甲。如果是,则造成伤害,否则攻击将被阻止。 除了简单的数学规则外,还可能存在一些限制,例如仅适用于特定类别的用户(例如,战士还是向导)或任何其他属性。因此,这不仅限于数学运算。 如果您熟悉诸如Dungeon和Dragons之类的RPG系统,您会知道我在做什么。 我的问题是,现在我不知道如何以最佳方式准确地构建它。我希望人们能够设置任何种类的规则,之后再简单地执行一个操作,例如选择一个玩家和一个怪物,然后执行一个操作(一组规则,例如攻击)。 在数据库方面,我寻求的帮助较少,但更多地是关于如何提出结构和解析器的要求,以保持规则的灵活性。顺便说一下,为此选择的语言是php。 编辑我: 让我完善我的目标:我想创建一个用户友好的界面(不需要别人学习编程语言)来构建或多或少的复杂游戏规则。原因很简单:个人使用并不需要一直记住所有规则,我们只是没有那么频繁地玩,每次查看它们都是一个障碍。另外:做和学习东西看起来很有趣。:) 到目前为止,我已经尝试过:只考虑一个概念,而不是浪费时间构建错误的体系结构。到目前为止,我的想法是允许用户创建所需数量的属性,然后将所需数量的属性分配给任何类型的实体。实体可以是玩家,怪物,物品或其他任何东西。现在,当计算某些内容时,数据将可用于规则解析器,以便规则解析器应能够执行以下操作,例如Player.base_attack + dice(1x6)> Monster.armor_check然后Monster.health-1; 这里的问题是关于如何创建该解析器的。 编辑二: 这是一个非常基本的值的示例,但是要正确地计算它,需要考虑很多不同的事物和变量: 基本攻击加成(期限)您的基本攻击加成(通常由d20社区称为BAB)是从角色等级和等级获得的攻击掷骰加成。不同角色类别的基础攻击加成会以不同的速率增加。角色的基本攻击加值达到+6时,每回合会获得第二次攻击;基本攻击加成为+11或更高的角色获得三分之一;基本攻击加成为+16或更高的角色获得第四点。从不同类别获得的基础攻击加成,例如,针对多类别角色的叠加。角色的基本攻击加成在达到+16后不再给予任何更多攻击,不能小于+0,并且在角色等级达到20后不会由于职业等级而增加。某些专长需要最低基础攻击加成。 您可以在这里http://www.dandwiki.com/wiki/Base_Attack_Bonus_(Term)上阅读它,包括指向类和专长的链接,这些类和专长又具有自己的规则来计算基础攻击所需的值。 我开始认为,使其尽可能地通用将使完成良好的规则解析器变得相当困难。

6
我应该按业务领域还是技术领域来组织文件夹?
例如,如果我使用某种类似于MVC的体系结构,则应使用哪种文件夹结构: domain1/ controller model view domain2/ controller model view 要么: controllers/ domain1 domain2 models/ domain1 domain2 views/ domain1 domain2 我故意省略了文件扩展名,以使该问题与语言无关。 就个人而言,我更喜欢按业务领域(直觉)分开,但我看到大多数/许多框架都按技术领域分开。为什么我要选择谁呢?

6
在Metro应用程序中使用XAML / C#或HTML5 / JavaScipt的优缺点?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我只是想知道将XAML / C#或HTML5 / JavaScript用于Metro Apps是否有主要优点或缺点。
19 c#  javascript  html5  xaml  metro 

6
为什么Web赢得了远程应用程序的空间而X却没有呢?
X Window System已有25年的历史,它在昨天(15日)生日。 您可能已经知道,它最重要的功能之一就是将服务器端和客户端分开,这是Microsoft,Apple或Wayland的窗口系统所没有的。 早在过去(对措词不清表示抱歉),由于服务器和客户端之间的这种分离,许多人认为X在其他制作窗口的方法中将占主导地位,从而允许应用程序在用户单击并在其上键入内容时在其他位置的服务器上运行在家里拥有电脑。 这种用法显然仍然存在,但充其量是被边缘化的。当我们编写和使用在服务器上运行的程序时,我们几乎总是将Web与html / css / js一起使用。 为什么网络赢了,而X没有赢?用于网络的技术(称为html / css / js)是一团糟。结合所有后端框架(Rails,Django和所有后端框架),它确实是一个可以穿越的丛林。Web仍然凭借创造力和进步而蓬勃发展,而远程X应用程序却没有。
19 history  web 

3
GPL静态与动态链接规则如何应用于解释语言?
据我了解,GPL禁止从非GPL代码到GPL代码的静态链接,但允许从非GPL代码到GPL代码的动态链接。那么当所讨论的代码因为是用一种解释语言(例如Perl)编写而根本没有链接时,该怎么办? 如果认为该规则是动态链接,则利用该规则似乎太容易了,但是,另一方面,如果认为该规则是静态的,则从合法的非GPL代码中引用GPL代码也似乎是不可能的!编译语言至少在静态链接和动态链接之间有区别,但是当所有“链接”都在运行脚本时,没有明确的许可就无法说出意图! 还是我对这个问题的理解不正确,使问题无济于事?我也听说过涉及动态链接的“类路径异常”。那不是GPL的一部分,而是可以添加到GPL的一部分,因此仅当许可证包含此例外时才允许动态链接吗?
19 licensing  gpl  perl 

6
在C ++开发中放弃STL是否可行?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 我知道在某些领域(例如游戏行业),不建议使用STL。所以我的问题是:在某些情况下不使用STL是否真的是一个好习惯?如果是这样,不使用现代C ++的STL的最大原因是什么?
19 c++  stl 

4
在不这样做的公司中实施单元测试
我公司的软件开发负责人只是“辞职”(即被解雇),我们现在正在研究改善公司的开发实践。我们希望在以后创建的所有软件中实施单元测试。 开发人员的反馈是: 我们知道测试很有价值 但是,您总是在更改规格,因此会浪费时间 而且,您的截止日期太紧了,我们还是没有足够的时间进行测试 CEO的反馈是: 我希望我们的公司进行自动化测试,但我不知道如何实现 我们没有时间编写大型规范文档 开发人员现在如何获得规格?口耳相传或PowerPoint幻灯片。显然,这是一个大问题。我的建议是这样的: 我们还为开发人员提供一组测试数据和单元测试 那是规格。管理层需要清楚,定量地了解其需求。 开发人员可以将其认为需要的任何其他功能放入测试中,而无需测试 好吧,如果您曾经在一家处于这种情况的公司任职,那么您是如何解决问题的?这种方法看起来合理吗?
19 unit-testing  tdd 

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.