软件工程

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


2
java集合框架接口中的UnsupportedOperationException
通过Java Collections Framework查看,我注意到相当多的接口都带有comment (optional operation)。这些方法允许类只通过UnsupportedOperationException不想实现的方法来实现。 这方面的一个示例是中的addAll方法Set Interface。 现在,如本系列问题所述,接口是使用预期的定义合同。 接口很重要,因为它们将类的工作与工作方式分开。合同规定了客户的期望,使开发人员可以自由选择自己选择的方式实施合同,只要他们遵守合同即可。 和 界面是对对象可以执行的操作的描述……例如,当您打开电灯开关时,电灯就亮了,您不在乎如何做,只是它确实在做。在面向对象的程序设计中,接口是对象成为“ X”所必须具有的所有功能的描述。 和 我认为基于接口的方法要好得多。然后,您可以很好地模拟您的依赖关系,并且基本上所有事物之间的耦合都不太紧密。 接口的意义是什么? 什么是接口? 接口+扩展(mixin)与基类 鉴于接口的目的是定义一个契约并使您的依赖关系松散耦合,是否有些方法不能UnsupportedOperationException达到目的?这意味着我不能再通过了Set,只能使用addAll。相反,我必须知道Set我通过了什么实现,所以我可以知道是否可以使用addAll。对我来说,这似乎毫无价值。 那有什么意义UnsupportedOperationException呢?它只是在弥补遗留代码,并且需要清理其接口吗?还是我错过了更有意义的目的?

1
包含多个项目的CMake(C ++)存储库的目录组织
我想为存储在单个(git)存储库中的一组相关但独立的C ++项目的组织提供一些建议。这些项目使用CMake。 对于一个简化的示例,我们假设有两个项目A和B,A取决于B。大多数开发A的人都会通过包装系统获得B。因此,它们只能编译A。但是,我们应该允许开发人员分别或一起编译A和B(并安装)。 这是一个建议: └── Repo1 ├── CMakeLists.txt (1) ├── A │ ├── CMakeLists.txt (2) │ ├── include │ │ ├── aaa.h │ │ ├── aaaa.h │ │ └── CMakeLists.txt (3) │ └── src │ ├── aaa.cpp │ ├── aaaa.cpp │ └── CMakeLists.txt (4) ├── B │ ├── CMakeLists.txt (2) …

3
二进制树在存储分层数据中是否有特定目的?它们的规范用法是什么?
我了解二叉树的结构以及如何遍历它们。但是,我正在努力实现它们在程序和编程中的实际用途,目的。当我想到分层数据的“现实生活”示例时,几乎可以肯定他们有两个以上的子级。例如,在家谱中,一位母亲可能经常有两个以上的孩子。 由于对数组和列表的处理速度更快,“二叉树”真的只对存储线性相关的数据有用吗?或者,它们在存储分层数据中是否有特定目的?如果是这样,那么二叉树的应用实例有哪些。一个节点最多有两个孩子的数据是什么?


1
将Grails应用程序迁移到Scala Play / Spray
我们有一个中等大小的Grails Web应用程序,它在PostgreSQL和使用HTML的GSP上使用GORM / Hibernate,还提供了一些REST API。我们正在对Scala进行标准化,并希望将此应用程序迁移到Play或Spray,并使用Slick访问现有数据库。 Nimble当前用于身份验证/授权和用户/角色/等。管理。 为了逐步进行迁移,避免大规模迁移,我们可以采取哪些方法? 它们都是JVM语言,有没有办法避免将它们当作独立的Web应用程序在独立的端口上运行?

3
单元测试比赛
我的雇主每月举行一次单元测试日比赛。一整天专门用于编写单元测试-显然,我们每个月都要进行更多测试,但这是一整天-竞赛的“优胜者”将获得奖励。但是,我们发现很难确定谁是赢家。 我们为每个测试用例分配点。因此,如果您编写了这样的单元测试... for (int i = 0; i < 100; i++) { assertTrue(i*i, square(i)); } 您将获得100分。显然,这是一个简单的示例,但是它演示了为每个测试用例分配“点”的问题。 我们主要是一家Java&Javascript商店。因此,我建议将经过测试的代码分支数量作为度量标准。我们可以轻松地通过代码覆盖率工具(例如EclEmma)来计算测试的分支。但是,不确定如何通过Selenium测试以及如何在Javascript源代码覆盖方面做到这一点(有什么想法吗?) 有谁对我们如何更好地确定本次比赛的获胜者有任何建议? 编辑 我知道如何编写单元测试,我知道如何编写有效的单元测试,不需要帮助确定要测试的内容。我无法控制这场比赛-比赛将继续进行。因此,我要么添加一些输入以使其更好,要么继续进行测试游戏(是的,我进行游戏。当然,我进行游戏。有奖品可以赢得) 编辑 这个问题在这里显然是不重复的,但它包含有关如何找到好的测试用例有用的信息,它没有提供任何有用的指标来评估的竞争。

2
您如何对ETL和报告项目进行单元测试\使用TDD方法?
ETL项目是使用诸如SSIS,PowerCenter等ETL(提取-转换-加载)工具创建的项目。 这些通常涉及从外部源读取数据,将其加载到暂存数据库,执行某些转换并将其加载到最终数据库。 一个简单的例子是使用SSIS来读取教师使用SSIS提供的excel文件并将其加载到数据库中。然后编写存储过程或更多SSIS包以计算每个学生的成绩并将该数据加载到数据集市\仓库中 然后,您在集市上构建存储过程以生成输出,报告工具(SSRS \ Excel \ etc)使用该输出来生成可视化。 我试图了解在这种情况下如何执行TDD和适当的单元测试。ETL的测试主要是确保登台表中加载的数据与源中数据的正确子集匹配。因此,对其进行测试将导致实现ETL的迷你版本。报告SP的输出取决于表本身中的数据,因此即使没有创建包含清理的测试数据的数据库,也没有维护的噩梦就无法拥有稳定的输出数据集。 例: 冲刺1:学生表包含姓名,年龄,年级 您为此表创建测试数据,并基于该表进行单元测试 冲刺2:性别字段添加到表中。 现在,如果刷新学生字段中的数据以填充性别属性,则由于数据已更改,因此测试用例将无效。如果您不这样做,就无法创建需要性别列的测试用例
12 unit-testing  sql  tdd 

2
为什么“拉链”会忽略该系列的悬空尾巴?
C#,Scala,Haskell,Lisp和Python具有相同的zip行为:如果一个集合较长,则尾部将被忽略。 也可能会引发异常,但是我没有听说使用这种方法的任何语言。 这让我感到困惑。有人知道这样做的原因zip吗?我猜对于新语言来说,是这样做的,因为其他语言都是这样做的。但是,根本原因是什么? 我在这里问的是事实性的,基于历史的问题,而不是有人是否喜欢它,或者这是好是坏的方法。 更新:如果有人问我该怎么做,我会说-引发异常,这与对数组建立索引非常相似(尽管“旧”语言做了各种魔术,如何处理越界索引,UB,扩展数组,等等)。

4
提出有关文件名编码的要求
我正在编写需求规范,而在措辞部分需求方面存在两难选择。 场景:我们从网站下载文件,并且下载的文件需要附加到我们拥有的CM工具中的项目中。下载的文件包含的名称可以是ASCII,ISO-8859-1,日语等。 在下面的措词中,“非ASCII”是否涵盖所有情况? 下载的文件名可能包含非ASCII字符,对此文件的处理不会使应用程序崩溃

7
记录器在参数列表中的位置应该是什么[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 在我的代码中,我通过构造函数的参数列表为许多类注入了记录器 我注意到我将其随机放置:有时它是列表中的第一个,有时是最后一个,有时是介于两者之间 你有什么喜好吗?我的直觉说,在这种情况下,一致性是有用的,而我个人的偏好是将其放在首位,这样在丢失时更容易被注意到,而在丢失时更容易跳过。

2
为什么C仍属于高级语言类别?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 许多有关C编程语言的教科书都说C是一种高级编程语言,但是许多在线辅导老师都说C也是一种中级编程语言。为什么会这样呢?

1
登录到文件还是数据库表?
我正在开发一个使用MS SQL来处理各种数据的Web应用程序:包括用户,用户帐户,用户许可证,许可证价格,发票。 我需要记录用户对系统的实时使用情况,并将其用于每月计费:例如,每当用户获得特定页面/ URL时就记录一次,并在月底根据所获取的页面数向用户计费。 是否应该将这些日志事件写入MS SQL数据库的表中? 是否应将这些日志事件写入非SQL的仅追加日志文件? 我应该为每个用户将这些日志事件写入不同的日志文件吗? 这不是一个特别庞大的网站:例如,最多10,000个用户,每个用户平均每天进行5个可记录事件=> 50,000个事件/天= 30个事件/分钟= 18,000,000个事件/年。 我问是因为这两种选择似乎都是可行的,而且我看不出是否有明显的优势。 与计费事件相关的数据很简单,例如: 用户ID(SQL中与Users表的外键关系) 日期和时间 计费页面的URL 我对这个问题的回答如下: 将日志写入数据库表的一些好处: 关系完整性:例如,记录的事件与有效的用户ID相关联(通过将用户ID定义为表之间的外键) 易于阅读的账单:例如SELECT COUNT GROUP BY,获得每个用户的日志事件数的计数 写入日志文件的一些好处: 性能更容易:SQL较少使用,例如仅用于用户登录事件,而大多数仅用于读取 易于管理:通过移动旧日志文件而不是通过从数据库中删除/存档,例如在年底时更易于归档旧数据 如果我的答案有误,请告诉我;或夸大某事的重要性;或忘记了一些重要的考虑。 和/或,如果与我的答案不同,请告诉我您的答案是什么。

2
通过将期望超类型的子类对象作为参数传递来覆盖方法
我只是在学习Java,而不是一名实践的程序员。 我要遵循的书说,重写方法时,参数类型必须相同,但是返回类型可以是多态兼容的。 我的问题是为什么传递给重写方法的参数不能不是预期的超类型的子类类型? 在重载方法中,可以保证在对象上定义了我对对象调用的任何方法。 有关建议的重复项的注意事项: 第一个建议似乎是关于类层次结构以及在何处放置功能。我的问题更集中于为什么存在语言限制。 在第二个建议,说明如何做我问什么,而不是为什么它做的方式。我的问题集中在为什么。

2
在Web应用程序的客户端上存储5000个元素
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 我刚刚对ASP.Net开发人员进行了电话面试,在初步介绍之后,面试官问我第一个技术问题: “如何在Web应用程序中为每个用户在客户端存储5000个元素”。 我的回答开始于 每个元素的平均大小是多少?我们真的必须在客户端存储这么多的数据吗?我们不能将其保留在数据库中,并以某种方式将其链接到用户会话/客户端ID 。 他的回答是“不,您告诉我如何将其存储在客户端,考虑到每个元素都是一个包含大约8个字段的记录,包括int / string和一个普通的表行”。 我说:“可以将它们保留在会话中,但是由于会话是在服务器端为每个用户维护的,因此可能会变得昂贵,或者另一种选择是将大量数据存储在cookie中”,我还说我不是确定是否可以在Cookie中存储大量数据。我提到有HTML5存储选项,但我还没有使用它。由于它基于SQLite,因此理论上可以存储那么多数据。 那是面试官有些讽刺地说的地方,因此您在Web开发方面拥有3年的经验,并终止了面试。 我想知道,我做错了什么?还是在客户端存储数据方面我真的缺少一些基本知识。

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.