软件工程

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

2
是否有“只问您需要”的界面原则?
我已经成长为使用一种设计和使用接口的原理,该原理基本上说:“只问您需要什么”。 例如,如果我有一堆可以删除的类型,我将创建一个Deletable接口: interface Deletable { void delete(); } 然后,我可以编写一个通用类: class Deleter<T extends Deletable> { void delete(T t) { t.delete(); } } 在代码的其他地方,我总是要求最小的责任来满足客户代码的需求。因此,如果我只需要删除一个File,我仍然会要求一个Deletable,而不是一个File。 这个原则是常识并且已经有公认的名称吗?有争议吗?在教科书中讨论过吗?

11
图像应该能够在OOP中调整大小吗?
我正在编写一个具有Image实体的应用程序,并且在确定每个任务应由谁负责方面已经遇到了麻烦。 首先我Image上课。它具有路径,宽度和其他属性。 然后,我创建了一个ImageRepository类,用于通过一个经过测试的方法来检索图像,例如:findAllImagesWithoutThumbnail()。 但是现在我还需要能够createThumbnail()。谁应该处理?我当时正在考虑开设一个ImageManager类,该类将是特定于应用程序的类(还可以选择第三方图像处理可重用的组件,而我并不是在重新发明轮子)。 还是让Image自身调整大小为0K ?还是让ImageRepository和ImageManager成为同一个类? 你怎么看?

2
关系数据库回归测试中的数据质量
我一直在研究开源的博物馆收藏管理Web应用程序,该应用程序将用于跟踪博物馆的加入,捐赠,借出或以其他方式获得的文物。 这涉及到设计和创建一个相当大的数据库(相对于我以前的经验),该数据库存储各种变化的信息(艺术品信息,更改的位置信息,个人联系信息,图片等),这些信息需要灵活且易于扩展。 我刚刚完成我的大学学位,并且我不是数据库设计方面的专业人士,所以我真的很想创建一个全面的测试套件,以确保我拥有的一切都可以正常使用。 我已阅读了有关数据库测试的内容,并遇到了几篇有关数据库的回归测试的文章,但我不完全了解这一切。通过阅读Dobbs博士的这篇文章,我了解到,我需要做的一种测试是验证数据库中的逻辑是否正确。因此,我将创建将某些数据插入数据库的测试,然后通过查询进行跟踪以确保我从数据库中获取了正确的数据(确保所有适当的触发器或视图都在工作)。 提到测试“数据质量”会引起混乱。在上面的文章中,作者提到您想通过测试验证以下内容: 列域值规则 列默认值规则 价值存在规则 行值规则 尺寸规则 这将涉及哪些类型的测试以及如何实施?这也是我第一次编写数据库测试套件,是否有关于如何/从何开始的良好指导,或者可以遵循的指导测试开发的任何流程?

2
单元测试:“如果您进行重构并且没有合作者,这是代码的味道”?
我正在阅读Roy Osherove撰写的《单元测试的艺术》。我在第7.2节“编写可维护的测试”中,作者对代码气味有此说明: 注意:当您重构内部状态以使其对外部测试可见时,是否可以将其视为代码异味(表示代码设计或逻辑中可能存在问题的迹象)?当您重构以暴露协作者时,这不是代码的味道。如果您要重构并且没有协作者,这是一种代码味道(因此您不需要存根或模拟任何东西)。 编辑:作者所说的“合作者”是依赖。他关于依赖项的一些示例是访问数据库或访问OS的文件系统的类。他在这里定义存根并开始使用“协作者”一词: 甲存根是用于现有的可控替换依赖性(或 合作者在系统中)。 作者没有此代码气味的示例,并且我在理解/描绘其外观时遇到困难。有人可以再解释一下,也许可以提供一个具体的例子?

4
对于成熟的团队来说,好的“完成的定义”是什么样的?
当查看各种来源的完成定义的示例时,它们通常包括以下几点: 代码完成 单元测试运行 同行评审或配对的代码 签入代码 文档更新 … 在我们的团队中,我们有一个类似的列表,但是没人看过,因为这些观点如此明显,以至于任何人都不会跳过这些步骤。因此,我们想知道这是否主要是团队过渡到敏捷过程的工具,以及我们是否不应该摆脱它。 另一方面,许多文献声称,所有高绩效团队对完成都有很强的定义。这种暗示我们可能会错过改进的机会。 那么,对成熟团队所做的明确定义的例子有哪些?它们通常包括哪些点?

6
如何获得更多编程经验
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我将要学习三年级的计算机科学,并且我已经读过Head First Java,Head First C,并且我目前正在阅读C ++,这是我最喜欢的语言,因为它对有经验的人具有良好的教学风格。我打算学习用QT制作软件,学习Objective-C(用于iPhone)或阅读Effective C ++。 我如何获得编程经验?我是否有参​​加开源项目的技能,还是需要学习php,mySQL或任何其他语言?我总的来说喜欢编程和计算机科学,尽管有些课程可能非常困难(理论计算机科学)。我也计划成为c ++的专家,但这不会很快发生。
9 c++  experience  qt 

4
如果从头开始设计易于使用TDD的新语言,会怎么样?
在使用某些最常见的语言(Java,C#,Java等)时,当您想要完全TDD代码时,有时似乎与该语言存在分歧。 例如,在Java和C#中,您将要模拟类的任何依赖关系,大多数模拟框架将建议您模拟接口而不是类。这通常意味着您有多个接口且只有一个实现(这种效果更加明显,因为TDD会迫使您编写大量较小的类)。让您正确模拟具体类的解决方案可以做一些事情,例如更改编译器或覆盖类加载器等,这很讨厌。 那么,如果从头开始设计一种对TDD来说很棒的语言,它将是什么样?可能是某种语言级别的方式来描述依赖项(而不是将接口传递给构造函数),并且能够不明确地分离类的接口?

4
分析内存使用情况:Java与C ++可以忽略不计?
用Java编写的整数对象的内存使用情况与用C ++编写的整数对象的内存使用情况如何比较\对比?差异可忽略不计吗?没有不同?有很大的不同吗?我猜是一样的,因为int是int而不管语言(?) 我之所以这样问,是因为我正在阅读了解何时知道程序的内存需求将阻止程序员解决给定问题的重要性。 让我着迷的是创建单个Java对象所需的内存量。以一个整数对象为例。如果我错了,请纠正我,但是Java整数对象需要24个字节的内存: 4个字节的int实例变量 16字节的开销(引用对象的类,垃圾收集信息和同步信息) 4字节的填充 再举一个例子,Java数组(作为对象实现)需要48个字节以上: 标头信息的24个字节 16个字节的对象开销 4个字节的长度 4个字节用于填充 加上存储值所需的内存 与使用C ++编写的相同代码相比,这些内存使用情况如何? 我过去对编写的C ++和Java程序的内存使用情况一无所知,但是现在,我开始学习算法,对计算机的资源有了更大的了解。

4
如果我不需要所有功能,则安装Visual Studio Ultimate会有不利之处吗?
微软今天在MSDN上发布了Visual Studio 2012的最终版本。我试图从决定这个版本比较页面安装哪个版本(我可以安装我想要自由任何版本)。我是一个单独的开发人员,主要使用C#和Python开发Web应用程序和控制台应用程序。Ultimate / Premium中的某些功能可能看起来很酷(例如UML和“历史调试”),但是我不需要或从未听说过的大多数功能。 一方面,如果我有朝一日想拥有这些功能,那就太好了。另一方面,对于某些软件产品,额外的功能导致高端版本变得更慢(1)并使用更多的内存,并且(2)UI更加混乱。 Visual Studio就是这种情况吗?

4
返回接口或类
假设我有一个方法 public List<User> GetBatchOfUsers(IEnumerable<int> userIDs) { List<User> users = new List<User>(); // some database stuff return users; } 我已经读过,返回一个接口(IList或者IEnumerable)比返回a 更好List。我听到的一些说法是,它隐藏了数据,并使API开发人员可以灵活地在以后更改数据的内部表示形式。 我只返回an的担心IEnumerable是您失去了功能,例如随机访问和Count属性。 我知道接受a IEnumerable作为参数是有意义的,因为它为用户提供了将数据发送到我的方法的最佳灵活性,这是方法操作的最低要求。 返回类型的最佳实践是什么?
9 c#  interfaces  class 

3
通常应该为REST服务开发一个客户端库来帮助防止API损坏吗?
我们有一个项目,将由同一团队开发UI代码,但使用与服务层(REST / Java)不同的语言(Python / Django)。每个层的代码存在于不同的代码存储库中,并且可以遵循不同的发布周期。我正在尝试提出一个过程,该过程将从UI层的角度防止/减少服务层中的更改。 我曾经考虑过在UI层级别编写集成测试,每当我们构建UI或服务层时(我们使用Jenkins作为我们的CI工具来构建两个Git仓库中的代码)时,我们都会运行集成测试。发生故障,则服务层中的某些内容中断,并且提交不被接受。 让服务层的开发人员为UI层中存在的REST服务创建并维护一个客户端库是否也是一个好主意(这是最佳实践吗?),只要REST中有重大更改,它们就会更新。他们的服务API?可以想象,我们将拥有UI代码所针对的静态类型的API的优势。如果客户端库API发生更改,则UI代码将无法编译(因此我们将尽快知道有重大更改)。我还将在构建UI或服务层时运行集成测试,以进一步验证UI和服务之间的集成是否仍然有效。
9 rest  django 

4
为启动外部EXE的类编写单元测试
我编写了一个C#类,用于启动EXE列表(不是我的一个-我必须运行的第三方EXE)并使其保持运行状态(偶尔检查以确保它仍在运行,如果没有,则启动它们) 。 我能够测试添加,删除等的基本逻辑。如何对保持EXE的实际工作进行单元测试? 我最初的想法是启动一些虚拟EXE,该EXE在1秒后关闭,然后使用它进行测试。这是否超出了单元测试的范围?

3
有什么理由不使用多个版本控制系统?
我正在一个项目中,该项目使用GIT作为主干,官方分支和大多数子项目/非官方分支的主要版本控制系统。因此,我想让自己的分支机构使用GIT,以允许其他社区使用他们所知道的系统访问我的分支机构。 但是,我正在研究项目的一部分,该部分与官方分支和非官方分支都重叠,以及一些永远不会进入主干的补丁-因此,我需要能够将我的补丁分开,以便将所有补丁都用于我的分支和选择性补丁将在树干中使用。这自然倾向于使用Mercurial队列。 有什么理由不能将Mercurial用于我自己的本地资源库,而是将全部内容推送到GIT和Mercurial托管资源库?或者更确切地说,有没有充分的理由不这样做,我敢肯定这是可能的。

9
printf-错误的来源?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我在代码中使用了大量的printf跟踪/记录功能,发现这是编程错误的根源。我总是发现插入运算符(<<)有点奇怪,但我开始认为通过使用它可以避免其中一些错误。 有人曾经有过类似的启示吗,或者我只是在这里抓住稻草? 一些带走点 我当前的思路是类型安全胜过使用printf的任何好处。真正的问题是格式字符串和使用非类型安全的可变参数函数。 也许我不会使用<<stl输出流变体,但我肯定会研究使用非常相似的类型安全机制。 许多跟踪/日志记录都是有条件的,但我希望始终运行代码以免遗漏测试中的错误,因为这是一个很少采用的分支。
9 c++ 

2
制作一个用户故事来删除一小部分现有功能是否合适?
对于已开发的应用程序区域,提出了从菜单中删除项目的请求。 我知道这是一件小事,但是您如何在Scrum中对待它呢?我习惯于使用用户故事来添加功能,而不是删除功能。 所以我的问题是:我是否应该为此创建一个用户故事,以某种方式与删除按钮有关?还是有更好的方法或处理此方法?
9 agile  scrum 

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.