软件工程

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

11
C ++编译器会删除/优化无用的括号吗?
请问代码 int a = ((1 + 2) + 3); // Easy to read 运行慢于 int a = 1 + 2 + 3; // (Barely) Not quite so easy to read 还是现代的编译器足够聪明,可以删除/优化“无用的”括号。 看起来似乎很少有优化方面的问题,但是选择C ++而不是C#/ Java / ...都是关于优化(IMHO)的。

1
为什么在python中编写Tkinter GUI时使用类
我主要使用python进行编程,并使用Tkinter编写了几个GUI,我见过的每个教程都建议为该GUI定义和使用一个类,但是我的GUI可以仅使用过程而完美运行,而无需使用类。 为什么要上课?在我看来,这似乎只是复杂性和不必要代码的额外一层。
19 python  gui  class 

8
在Java 7中打开字符串有什么好处?
当我开始用Java编程时,switch语句不带字符串的事实使我感到沮丧。然后,在使用Enums时,我意识到与它们相比,您所获得的好处而不是传递原始值-类型安全性(这使得重构更容易),同时也使其他开发人员更清楚。 我正在努力思考一种情况,在SE7中,我现在决定使用带有字符串而不是Enums作为输入的开关。如果通过打开整个字符串(例如,而不是部分匹配或正则表达式匹配)来实现它们,则似乎并没有提供更少的理由来更改代码。 借助IDE工具和编码的读写比率,我会比传递字符串值更快乐地自动生成一个额外的Enum。 他们作为程序员给我们带来什么好处?更少的样板? 似乎该功能并未让该语言大声疾呼。尽管可能有一个我忽略的用例。

5
调和矛盾的编程建议:在编码之前先进行工作并进行迭代与真正考虑
我是具有几年专业经验的中级程序员,并且已攻读硕士学位。在学习程序设计时,我经常听到两条看似矛盾的建议。 第一步建议是使某些东西快速工作,看看它是如何工作的(通过原型设计或非正式测试),改进版本,看看它如何工作,再加以改进……然后重复循环直到完成。 。这有时被称为“螺旋式发展”,或被表述为“早期释放,经常释放”。 第二条建议是:在编写任何代码之前,请认真考虑一下项目。 我在这两种方法上都取得了成功,我会说我同意每种哲学。 但是现在我开始处理我不知道如何完成的更复杂的项目(例如分布式应用程序和性能驱动的图形编程)。 我如何进行这些项目? 我是否只是开始编写一些东西并在进行过程中学习(平台/方法/语言/体系结构)-还是在我打开IDE之前不进行编码并进行大量研究/阅读? 如何协调这些相互矛盾的编程建议?

6
老程序员消失了。即将雇用另一位程序员。我该如何处理?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 在使用WordPress和BuddyPress为我花了一年多的时间为我工作的社交网络项目之后,我的程序员消失了,即使他在整个期间每周都得到报酬。是的,他还没有死,因为我使用电子邮件跟踪器进行确认并看到他打开了我的电子邮件,但是他没有回应。看来他找到了另一份工作。我不知道他为什么不能这么说。我什至还付了他未完成的工作预付款。 问题在于,我从来没有要求他编写过的大多数功能的完整文档。在过去的1年中,有很多功能,其中一些功能仍然无法修复。现在看来一切令人困惑。 我现在应该做的第一件事是什么?我该如何进行? 我想要做的第一件事就是找到另一个程序员,但是我想从头开始,将所有当前代码记录在案,以便任何程序员都可以毫无问题地使用所有功能。 那是我应该做的第一件事吗?如果是,我该怎么办? 此类文件所需的标准文档类型是什么?我可以让一名程序员来为所有代码做文档并修复错误,还是文档不是很重要? 另外,您认为让另一个“个人”程序员更好还是让一家为他们工作的程序员更好的公司,这样如果分配给我的项目的程序员消失了,另一个人可以代替他,而无需我的参与?我觉得这是我一开始应该采取的方法。

5
查找“ Granola Bar”状结构总质量的算法?
我是行星科学研究员,我正在研究的一个项目是土星环的N体模拟。这项特定研究的目的是观察粒子在其自身重力作用下会聚在一起,并测量其总质量与细胞中所有粒子的平均速度之间的关系。我们试图找出这是否可以解释卡西尼号航天器在土星夏至期间所做的一些观察,当时观察到大型结构在接近边缘的环上投下了阴影。以下是任何给定时间步长的屏幕截图。(每个粒子的直径为2 m,模拟单元本身的宽度约为700 m。) 我正在使用的代码已经在每个时间步上吐出了平均速度。我需要做的是找出一种方法来确定团块中的粒子质量,而不是它们之间的杂散粒子。我知道每个粒子的位置,质量,大小等,但是我不容易知道,例如,粒子30,000-40,000与102,000-105,000构成了一条对人眼来说很明显的链。 因此,我需要编写的算法必须是具有尽可能少的用户输入参数(用于可复制性和客观性)的代码,该参数将遍历所有粒子的位置,找出哪些粒子属于团块,然后计算质量 如果它可以针对“每个”丛集/链条(而不是单元格中的所有内容)做到这一点,那将是很好的,但是我认为我实际上并不需要将它们分开。 我唯一想到的是进行某种N 2距离计算,在该计算中,我将计算每个粒子之间的距离,例如,如果最接近的100个粒子在一定距离内,则该粒子将被视为粒子的一部分。簇。但这似乎很草率,我希望您的CS人员和程序员可能知道更优雅的解决方案? 使用“我的解决方案”进行编辑: 我要做的是采取一种最邻近/集群方法,并首先执行quick-n-dirty N 2实现。因此,取每个粒子,计算到所有其他粒子的距离,是否在一个簇中的阈值是在d距离内是否有N个粒子(不幸的是,必须先验设置两个参数,但是正如某些人所说的那样)回应/评论,我不会因为没有其中一些而逃脱。 然后,我通过不对距离进行排序而加快了速度,仅执行了N次搜索,并为d中的粒子增加了一个计数器,然后加快了6倍的速度。然后添加了“愚蠢的程序员树”(因为我知道几乎与树代码无关)。我瓜分模拟细胞成网格的一组数(最好的结果,当网格大小≈7 d)其中,主栅线与该单元格,一个网格由一半在偏移X和ÿ,和另外两个是通过胶版1/4 in± x和± y。然后,代码将粒子划分为网格,然后每个粒子N只需要计算到该单元格中其他粒子的距离即可。 从理论上讲,如果这是一棵真正的树,我应该得到N * log(N)的阶数,而不是N 2的速度。我介于两者之间,对于50,000粒子的子集,速度提高了17倍;对于150,000粒子的单元,速度提高了38倍。第一次12秒钟,第二次53秒钟,500,000个粒子的电池460秒钟。这些速度与代码向前运行1个模拟代码所花费的时间相当,因此在这一点上是合理的。哦,而且它是全线程的,因此它将占用尽可能多的处理器。

1
如何测试文件阅读器?
我正在一个具有几种文件格式的项目。某些格式由.xsds指定,其他格式由各自网站上的文档指定,而某些格式是自定义的内部格式,没有文档。姆哈哈哈哈哈 有什么问题? 我想测试我的文件阅读器,但是我不确定如何去做。应用程序的流程是这样的: file.___ ===> read by FileReader.java ===> which creates a Model object FileReader接口在哪里 public interface FileReader { public Model read(String filename); } 在Model拥有一批在读文件已填充属性。看起来像 public class Model { List<String> as; List<String> bs; boolean isAPain = true; // ... } 我尝试了什么? 我唯一的想法是为每种文件格式创建文件“生成器”。这些生成器基本上是生成器,它们接受一些变量(例如,要在文件中生成的注释数量),并输出一个样本文件,然后我将其读入并将结果Model与我最初用于生成文件的变量进行比较。 但是,这有一些问题: 它生成的文件看起来不像真实文件。生成器绝不了解上下文。 由于我是手动设置变量的生成器,因此很难识别生成器是否针对边缘情况生成了。这种方法仅比我创建十几个示例文件更好。 有没有更好的方法可以做到这一点? 编辑:将单元更改为集成,因为这实际上是我的意思。 EDIT2:这是我提到的边缘案例的示例。 每个文件代表一个由顶点和边组成的图形。这些顶点和边可以以不同的方式连接,因此: v1 …


12
方法重载除了语法糖之外吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 方法重载是一种多态吗?对我来说,似乎只是名称相同和参数不同的方法的区别。因此stuff(Thing t),stuff(Thing t, int n)就编译器和运行时而言,它们是完全不同的方法。 它在调用方方面产生了一种幻觉,即对相同类型的对象(即多态)的作用不同。但这只是一种幻想,因为实际上stuff(Thing t)和stuff(Thing t, int n)完全不同。 方法重载除了语法糖之外吗?我想念什么吗? 语法糖的一个常见定义是它纯粹是局部的。意思是将一段代码更改为“加糖的”等效代码,反之亦然,这涉及不影响程序整体结构的局部更改。而且我认为方法重载完全符合此标准。让我们看一个示例来演示: 考虑一个类: class Reader { public String read(Book b){ // .. translate the book to text } public String read(File b){ // .. translate the file to text } } 现在考虑使用该类的另一个类: /* might not be the …

7
模块化编程会影响计算时间吗?
每个人都说我应该使代码模块化,但是如果我使用更多的方法调用而不是更少但更大的方法,效率会降低吗?Java,C或C ++有什么区别? 我知道编辑,阅读和理解起来更容易,尤其是在小组中。那么,与代码整理优势相比,计算时间损失微不足道吗?
19 java  c++  c  efficiency 

4
如何在关系数据库驱动的应用程序中设计不好的数据库中创建更好的OO代码
我正在编写一个Java Web应用程序,该应用程序主要由一堆相似的页面组成,其中每个页面都有多个表和一个适用于这些表的过滤器。这些表上的数据来自SQL数据库。 我将myBatis用作ORM,在我的情况下,这可能不是最佳选择,因为数据库设计不良,而mybatis是面向数据库的工具。 我发现我正在编写很多重复的代码,因为由于数据库的不良设计,我不得不为类似的事情编写不同的查询,因为这些查询可能非常不同。也就是说,我无法轻松地将查询参数化。这会传播到我的代码中,而不是通过一个简单的循环来填充表中列上的行,我将代码改为: 得到一个数据(p1,...,pi); 得到B数据(p1,...,pi); 获得C数据(p1,...,pi); 获得D数据(p1,...,pi); ... 当我们有带有不同列的不同表时,这很快就会爆炸。 这也增加了我使用“ wicket”的复杂性,实际上是将对象映射到页面中的html元素。因此,我的Java代码成为了数据库和前端之间的适配器,这使我创建了许多布线,样板代码,并在其中混入了一些逻辑。 正确的解决方案是在ORM映射器上包裹一个额外层,该额外层为db提供一个更均匀的接口,还是有更好的方法来处理我正在编写的这些意大利面条式代码? 编辑:有关数据库的更多信息 该数据库主要保存电话信息。较差的设计包括: 具有人工ID作为主键的表与域知识无关。 没有唯一,触发器,检查或外键。 具有通用名称的字段,这些字段匹配不同记录的不同概念。 只能通过与其他具有不同条件的表交叉才能分类的记录。 应为数字或日期存储为字符串的列。 综上所述,到处都是凌乱/懒惰的设计。

3
MIT等与GPL兼容的许可证如何在GPL程序中使用而不受copyleft条款的约束?
我目前正在研究在商业环境中针对应用程序与GPL库链接的可能性和含义。 根据我对GPL的了解,只要在内部使用该应用程序,就没有义务发布其代码(即使将副本移至受控子公司)。 我不明白的是FAQ中的以下几点: 如果库是根据GPL(而非LGPL)发布的,是否意味着使用该库的任何软件都必须符合GPL或GPL兼容许可?是的,因为实际运行的软件包括该库。 如果我看一下与GPL兼容的许可证,其中一些许可证(如增强许可证)似乎没有强加代码的发布。使用它会造成一种情况,您可以遵守GPL许可,而不必遵守其公开代码的义务(这似乎不太可信)。 (注:Adobe Photoshop中的某些组件在boost下获得许可,我认为该代码不是按需提供的) 最合理的解释是我遗漏了一些东西……您能告诉我我哪里做错了吗?
19 licensing 

12
要为“ false”的布尔函数参数添加正确的注释?
从一些开源项目中,我收集了以下编码样式 void someFunction(bool forget); void ourFunction() { someFunction(false /* forget */); } 我一直对false这里的含义感到怀疑。它的意思是“忘记”,还是“忘记”是指它的相应参数(如上述情况),而“假”是要否定它? 哪种风格最常用,什么是避免歧义的最佳方法(或某些更好的方法)?

5
我不能只给我分配三个以上的错误,还是不能理解上千行的意大利面条代码,这是正常的吗?
我正在一个旧的代码库上工作,而这个代码库... 也不完美,而且环境也不一样。这不是我一生中见过的最糟糕的代码库,但是仍然存在很多问题:零单元测试;具有数千行代码的方法;对面向对象基本原理的误解;等等 维护代码很痛苦。 每次我必须调试一千行写得不好的方法,并且要重复使用变量时,我完全迷失了。 我所做的一些修改或重构在应用程序的其他位置引入了错误。 缺少任何文档,测试或可观察的体系结构,再加上名称不正确的方法,我觉得我已经填满了所有可用的工作内存。为了理解我应该修改的代码,我必须记住的所有其他内容都没有剩余的余地。 工作场所不断的打扰让我不安,并使我慢下来。 如果没有错误跟踪系统,我一次最多记不起两三个任务,而周末我会忘记所有这些任务。 我的同事似乎没有类似的问题。 他们设法比我快得多地调试写得不好的方法。 与引入我的代码库相比,它们引入的bug更少。 他们似乎很好地记住了更改代码所需的所有内容,即使它需要读取20个不同文件中的数千行代码。 他们似乎并没有受到电子邮件,电话铃响,周围聊天的人和其他向他们提问的人的干扰。 由于我们使用TFS,因此他们不想使用我们已经拥有的错误跟踪系统。他们宁愿只记住他们应该做的每一项任务。 为什么会这样?开发人员长时间使用写得不好的代码时,会获得某种特殊技能吗?我相对缺乏使用错误代码的经验是否会导致这些问题/感觉?我的记忆有问题吗?

5
使过去的项目保持其工作开发环境的有效方法?
我发现,每当我想运行一个过去的项目时,要花很长时间才能找到它,并且要重新设置一切才能运行它。 例如,我有在Linux中创建的python项目,它依赖于可轻松在Linux中安装的软件包,但是我不再拥有正在使用的Linux VM。我的其他一些项目依赖于其他变量,例如Web服务器配置,PATH变量,SDK,IDE,OS版本,设备等。 有人有解决此问题的有效方法吗?到目前为止,我只关心备份源代码,但是很难重建工作开发环境,也很难保持工作开发环境。

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.