软件工程

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

8
Git-直接在master上工作会出现什么问题?
我已经看到了很多有关git分支模型的建议,最普遍的观点似乎是直接在master分支上进行更改是一个坏主意。 我们的一位同事很高兴直接在主分支上进行更改,尽管进行了几次交谈,但他们似乎不太可能更改此更改。 在这一点上,我无法说服一个不擅长直接在师傅上工作的同事,但我想了解会与他的工作方式相抵触的事物,知道何时需要重新访问这个问题。

5
通过使用getter避免常量是一种好习惯吗?
用getter替换在类外部使用的常量是一种好习惯吗? 例如,使用if User.getRole().getCode() == Role.CODE_ADMIN还是更好if User.getRole().isCodeAdmin()? 这将导致此类: class Role { constant CODE_ADMIN = "admin" constant CODE_USER = "user" private code getRoleCode() { return Role.code } isCodeAdmin () { return Role.code == Role.CODE_ADMIN } isCodeUser () { return Role.code == Role.CODE_USER } }

5
是否仅针对错误情况拒绝承诺?
此问题是从Stack Overflow 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 3年前。 假设我有此函数authenticate可以返回承诺。然后,诺言就会解决结果。如我所见,假和真是预期的结果,并且拒绝仅应在错误情况下发生。或者,是否认为身份验证失败会导致您无法兑现承诺?
25 javascript 

6
接口包含以常量形式返回实现的具体类型的方法是否可以?
我经常会遇到需要不同的组件行为(取决于不同接口的具体类型)的情况。 为了说明我的问题,我写了一个小代码段,它将显示我的意思。在此示例中,我尝试从动物对象实例化食物对象。 interface Animal { void growl(); String getAnimalType(); //"DOG" or "FISH" } abstract class Food {} Meat extends Food {} Bread extends Food {} class FoodFactory { Food createFoodForAnimal(Animal animal) { switch (animal.getAnimalType()) { case "DOG": Food food = new Meat(); break; case "FISH": Food food = new Bread(); …

6
如何处理复杂的合并
这是一笔交易,我加入了一家新公司,并被要求完成在已经近一年没有碰过的分支机构上的工作。同时,主分支机构也在稳定增长。理想情况下,我希望将master分支中的所有更改合并到feature分支中,然后从那里继续工作,但是我不太确定该如何处理。 如何在保留分支两侧的重要更改的同时安全地执行此合并?

5
一个实例可以等于某个更特定类型的其他实例吗?
我读过这篇文章:如何用Java编写平等方法。 基本上,它为支持继承的equals()方法提供了一种解决方案: Point2D twoD = new Point2D(10, 20); Point3D threeD = new Point3D(10, 20, 50); twoD.equals(threeD); // true threeD.equals(twoD); // true 但这是个好主意吗?这两个实例看起来是相等的,但可能具有两个不同的哈希码。是不是有点不对劲? 我相信这可以通过改用操作数来更好地实现。
25 java  c#  scala  comparison 

7
指定可选参数名称,即使不是必需的?
请考虑以下方法: public List<Guid> ReturnEmployeeIds(bool includeManagement = false) { } 和以下调用: var ids = ReturnEmployeeIds(true); 对于刚接触该系统的开发人员来说,很难猜得出是什么true。您要做的第一件事是将鼠标悬停在方法名称上或转到定义(都不是丝毫大的任务)。但是,出于可读性考虑,编写以下代码是否有意义: var ids = ReturnEmployeeIds(includeManagement: true); 在编译器不需要您时,是否有任何地方正式讨论是否明确指定可选参数? 以下文章讨论了某些编码约定:https : //msdn.microsoft.com/zh-cn/library/ff926074.aspx 与上面的文章类似的东西会很棒。

1
REST API-特定于移动设备的挑战
我正在移动端上开发一个新的iOS应用程序项目。正在进行一些体系结构更改,事实证明,我们将不得不依赖自定义构建的私有API,该API将由我们正在构建的应用程序以及网站等其他客户端使用。 正在设计的API遵循映射到HTTP动词的以资源为中心的URI和CRUD操作的Rest样式。像: GET www.example.com/books DELETE www.example.com/books/482094 POST www.example.com/users/6793 问题在于,这种风格通常导致移动客户端需要执行许多请求来加载单个应用程序屏幕或管理单个用户UI操作。这将导致应用程序处于加载模式8秒钟,直到拥有所需的一切为止。缓慢且无响应的应用程序。 移动客户端在连接方面有严重的限制,因此理想情况下,我们应遵循以下规则: 1个屏幕== 1个API调用 1个保存== 1个API调用。 在许多情况下,这会使您与REST设计原则发生冲突,例如: 假设您的应用离线了一天,您需要与后端数据库的四个表进行同步,并且您需要像 www.example.com/sync_everything?since=2015-07-24 可以说有一个屏幕,用户可以在其中编辑许多对象,例如在待办事项列表中勾选任务。应该有一种方法可以在一个批处理API调用中编辑所有这些任务记录,而不是每次编辑都可以一个API调用。 假设有一个混合了来自ORDER,SALESMEN和PRODUCT数据库表的信息的屏幕,我应该一次调用而不是三个调用来获取该数据。 这样做的风险是,我们最终可能会获得最宁静的API,以及最无用的无响应移动应用程序。 问题是我只是那里的新承包商,我需要的是可以帮助我阐明这些要点的东西,一些受到尊敬的消息来源的文章等等。主要参与者在针对其移动客户端的REST风格上妥协(例如:通过使用复合聚合API端点)。 或针对此一般问题的任何解决方案。谢谢!
25 rest  api  ios  mobile 

7
是否可以对需要估计已花费时间和节省时间的项目采取灵活的敏捷方法?
想要改善这篇文章吗?提供此问题的详细答案,包括引文和答案正确的解释。答案不够详细的答案可能会被编辑或删除。 作为以前在敏捷领域进行过有效工作的人,我正在努力说服我目前的雇主对它的好处。但是,管理层坚持认为我们保留进行前期估算的能力,以便评估项目的业务价值。 我的大多数客户都是内部客户,最近我受命去组建团队,并要求他们提供有关自动化业务流程的想法。然后,我要弄清楚这花了他们多少时间,计算出该解决方案将节省多少时间,并估计总的开发时间。这样,管理人员可以尝试根据节省的时间来衡量解决方案的有效性。 但是,在我看来,没有办法以“敏捷”的方式满足此要求。灵活的要求意味着不仅要花费的时间估算是错误的,而且可能节省的时间估算也将是错误的。我做了很多解释,解释了为什么它可能有问题,但被告知这是不可谈判的。 如何向(瀑布式)客户出售敏捷开发问题对如何将敏捷 “销售”给外部客户提出了一些有用的建议。我不是在试图将其出售给外部客户:我正在尝试找出如何在保持我认为很好的方法的同时,最好地调和内部管理的需求。 有什么方法可以灵活地完成这项任务,从而至少保留一些敏捷优势?
25 agile 

1
发布使用Apache 2.0许可下许可的库的应用程序时要牢记什么?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 5个月前关闭。 我正在创建一个即将准备发布的Android应用。 我将使用该库来实现选项卡系统。我读到它是根据Apache 2.0 License许可的。我从未对已分发的应用程序/程序/游戏使用过任何许可库(因为我还没有分发过),所以我对许可和许可库没有任何经验,所以我想知道是否有任何东西在分发使用根据Apache 2.0许可获得许可的库的应用程序时要牢记。 记住 我在StackOverflow上问了这个问题,但建议我改为将其移至Programmers,但在我发布之前,请先检查帮助中心是否该网站接受了此类问题。我做到了,据我所能看到和理解的内容,这种问题是允许的。 我已经阅读了几个类似的问题,并找到了一些问题的答案,但是我仍然想知道一些事情,我想清楚一点,所以我不会犯任何错误。 这些是剩下的问题 我读到“我的应用程序的用户必须收到Apache 2.0许可证的副本。为避免混淆,您还应说明许可证适用于发行版的哪一部分。” 仅在应用程序的“关于应用程序”页面上放置指向Apache 2.0许可证的链接,并连同链接一起告诉许可库的名称就足够了吗? 继续上述问题:我需要如何“声明许可证适用于发行版的哪些部分”。这是否意味着我将告诉我的应用程序的哪个部分已获得许可(换句话说,该库是许可的部分)? 我可以修改库的源代码,然后将修改后的版本包含在我的应用程序中并出售吗? (这与许可库无关)我是否需要为我的应用程序申请许可证?如果是,推荐哪个?将我的应用上传到Google Play商店后,会自动受到版权保护吗?建议采取什么措施来保护它免受“模仿者”的攻击? 有什么建议或指导方针吗?我想知道,这样我就不会犯任何错误,而要支付罚款或陷入麻烦之类的事情。谢谢! 更新:我阅读了amon的答案,发现了更多问题: 据阿蒙说的了解,我的应用自动受到版权保护。他还说,我可以注册版权,这可能会使我在某些司法管辖区受益。我在哪里注册版权? 我必须在“关于”页面上打印出许可证的哪些部分?是否可以将其(从Apache 2.0 Library网站获得)放在库的信息文本下方,并使用完整的Apache 2.0许可证将链接放置到单独的页面(在应用程序中)? 版权[yyyy] [版权所有者名称] 根据Apache许可版本2.0(“许可”)许可;除非遵守许可,否则不得使用此文件。您可以在以下位置获得许可的副本: http://www.apache.org/licenses/LICENSE-2.0 除非适用法律要求或以书面形式同意,否则根据“许可证”分发的软件将按“原样”分发,没有任何明示或暗示的保证或条件。请参阅许可证,以了解许可证下管理权限和限制的特定语言。 可能还会有更多问题。

1
Vanilla JS是否仍被视为库?
最近,我发现VanillaJS(文档?)是一个仅与99%的浏览器捆绑在一起的库,并且不完全是本机JavaScript(我一生的震惊)。在编写自己的库时,我通常会避免所有有用的事情,主要是库。现在我有三个问题: VanillaJS仍然被认为是库吗? 没有VanillaJS,有没有办法对DOM做任何事情? 是基于VanillaJS或本地JS的主要库(无文档资料)

4
如何处理不可变字段上的setter?
我有一堂课有两个readonly int领域。它们作为属性公开: public class Thing { private readonly int _foo, _bar; /// <summary> I AM IMMUTABLE. </summary> public Thing(int foo, int bar) { _foo = foo; _bar = bar; } public int Foo { get { return _foo; } set { } } public int Bar { get { return …

2
如果不是“所有非第三方代码”,“业务逻辑”实际上意味着什么?
我听说人们经常在工作中和在线上谈论业务逻辑,并且我已经在此站点上阅读了一些有关它的问题,但是这个词对我来说仍然没有多大意义。例如,以下是我经常看到的一些(释义)语句: “业务逻辑是程序中编码实际业务规则的部分。” 我读过的大多数定义都是这样的循环定义。 “业务逻辑是您的特定应用程序所独有的一切。” 我不认为这与“您的特定应用程序不过是业务逻辑”有什么不同,除非我们不小心重新发明了一些轮子,可以使用现有的第三方软件。因此,问题标题。 “在数据访问层上方和GUI层下方应该有一个业务逻辑层。” 在我编写的代码中,数据库访问者必须知道他们应该访问什么数据,UI代码必须知道很多关于其显示内容的信息才能正确显示,这之间没有任何实际要做的事情。除了在客户端和服务器之间传递数据Blob之外,还有这两个地方。那么,实际上应该放入业务逻辑层的内容是什么? “业务逻辑应与表示逻辑分开。” 我们收到的大多数功能请求都是出于业务原因更改展示逻辑。如果业务规则之一是默认情况下以32位符号显示美国政府债券价格(同时还为用户提供配置UI的功能),则表示逻辑至少需要知道该规则存在(如果未完全实现)。而且,UX设计的主要部分似乎是帮助用户了解我们的软件试图实现的业务规则。 我是否有可能实际上只在一个只包含业务逻辑的团队中工作,而所有非业务逻辑都由其他团队来完成?还是“业务逻辑”作为一个单独实体的整个概念仅适用于某些应用程序或体系结构? 为了使答案更具体:假设您必须重新实现Domino的Pizza应用程序。什么是业务逻辑,该应用程序的非业务逻辑是什么?以及如何在不将大多数披萨信息渗入数据访问和表示层的情况下,将披萨订购业务逻辑放入其自己的代码“层”中? 更新:我得出的结论是,我的团队可能正在执行90%的UI代码,并且您所称的大多数(但不是全部)业务逻辑都来自其他团队或公司。基本上,我们的应用程序是用于监视财务数据以及几乎所有功能都是用户自定义其所见以及所见方式的方式。没有进行买卖(尽管我们与公司的其他应用程序进行了一些集成),并且实际数据由大量外部资源提供。但是我们确实允许用户执行诸如将其“监视器”的副本发送给其他用户之类的事情,因此我们处理方式的详细信息可能符合业务逻辑。实际上,目前有一个移动应用程序正在与我们的一些后端代码进行对话,并且我确切地知道我希望在理想的世界中与我们的UI共享前端代码的哪一部分(基本上是准MVC中的M),因此我猜这就是我们的BLL。 我接受user61852的回答,因为它使我对“业务逻辑”指的是和不指的有更具体的了解。

8
我的顺序收集应该从索引0还是索引1开始?
我正在为具有多个通道的设备创建对象模型。客户和我之间使用的名词是Channel和ChannelSet。(“集合”在语义上不准确,因为它是有序的,而正确的集合不是。但这在不同的时间是个问题。) 我正在使用C#。这是一个用法示例ChannelSet: // load a 5-channel ChannelSet ChannelSet channels = ChannelSetFactory.FromFile("some_5_channel_set.json"); Console.Write(channels.Count); // -> 5 foreach (Channel channel in channels) { Console.Write(channel.Average); Console.Write(", "); } // -> 0.3, 0.3, 0.9, 0.1, 0.2 一切都是花花公子。 但是,客户端不是程序员,它们绝对会被零索引混淆-第一个通道是它们的通道1。但是,为了与C#保持一致,我想将ChannelSet索引从零开始。 当我的开发团队和客户进行交互时,这肯定会导致他们之间的脱节。但更糟糕的是,在代码库中如何处理此问题的任何不一致都是潜在的问题。例如,这是一个UI屏幕,最终用户(根据1个索引进行思考)正在编辑频道13: 该Save按钮最终将产生一些代码。如果ChannelSet索引为1: channels.GetChannel(13).SomeProperty = newValue; // notice: 13 或如果它的索引为零: channels.GetChannel(12).SomeProperty = newValue; // notice: 12 我不确定如何处理。我觉得这是个好习惯,即使有序的,整数索引的事物列表(ChannelSet)与C#Universe中的所有其他数组和列表接口保持一致(通过零索引ChannelSet)。但是,然后,UI和后端之间的每一段代码都需要翻译(减1),我们都知道隐患和常见的一对一错误已经是多么的隐秘。 …

2
Java:为什么集合会接受比较器而不接受(假设的)Hasher和Equator?
当您使用接口的不同实现时,此问题最明显,并且出于特定集合的目的,您仅关心对象的接口级视图。例如,假设您有一个像这样的接口: public interface Person { int getId(); } 实现hashcode()和equals()实现类的通常方法在equals方法中将具有如下代码: if (getClass() != other.getClass()) { return false; } 这会导致问题,当你混的实现Person中HashMap。如果HashMap仅关心的接口级视图Person,则最终可能会出现仅在实现类上有所不同的重复项。 您可以通过equals()对所有实现使用相同的Liberty 方法来使这种情况起作用,但是您冒着equals()在不同上下文中做错事的风险(例如,比较Person数据库记录支持的两个带有版本号的)。 我的直觉告诉我,应该对每个集合而不是对每个类定义相等性。当使用依赖于排序的集合时,可以使用自定义Comparator在每个上下文中选择正确的排序。基于散列的集合没有类似物。为什么是这样? 为了澄清起见,此问题与“ 为什么.compalsTo()在接口中而.equals()在Java类中? ”不同,因为它处理集合的实现。compareTo()和equals()/ 和/ hashcode()都存在使用集合时的通用性问题:您不能为不同的集合选择不同的比较函数。因此,出于这个问题的目的,对象的继承层次结构根本无关紧要;重要的是比较函数是按对象定义还是按集合定义。
25 java  collections 

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.