软件工程

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

3
如何在数据中表达微妙的关系?
“ A”与“ B”和“ C”有关。在这种情况下,我如何证明“ B”和“ C”也可能相关? 例: 以下是有关百老汇最近一部戏剧的一些头条新闻: 大卫·马梅特(David Mamet)的格伦加里(Glengarry)格伦·罗斯(Glen Ross),由阿尔·帕西诺(Al Pacino)主演,在百老汇开幕 Al Pacino在“ Glengarry Glen Ross”中:评论家们怎么看? 阿尔·帕西诺(Al Pacino)在百老汇(Broadway turn)赢得了平淡的评论 剧院评论:Glengarry Glen Ross正在努力推销明星 Glengarry Glen Ross;嘿,谁杀死了Klieg灯? 问题: 对这些记录进行模糊字符串匹配将建立一些关系,但不会建立其他关系,即使人类读者可以从更大的数据集中从上下文中选择它们。 我如何找到暗示#3与#4相关的关系?它们都可以很容易地连接到#1,但不能互相连接。 这种数据或结构是否有(可查询的)名称?我在寻找哪种算法? 目标: 给定1,000个标题,系统会自动提示这5个项目可能都是同一件事。 老实说,我编写程序已经很久了,我不知如何正确表达这个问题。(如果有道理,我不知道不知道)。 这是一个个人项目,我正在用Python编写它。在此先感谢您的任何帮助,建议和指示!

7
头文件实际上好吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 我发现头文件在浏览C ++源文件时很有用,因为它们给出了类中所有函数和数据成员的“摘要”。为什么这么多其他语言(例如Ruby,Python,Java等)没有这样的功能?这是C ++的详细信息派上用场的地方吗?
20 c++ 

5
为什么现代图书馆不使用OOP
我是初学者级C ++程序员,但是我对语言的概念非常了解。当我开始学习外部C ++库(例如SDL,OpenGL)(也许还有其他东西)时,令我惊讶的是,我发现它们根本不使用C ++概念。 例如,SDL和OpenGL都不使用类或异常,而倾向于使用函数和错误代码。在OpenGL中,我看到过诸如glVertex2f之类的函数,该函数需要2个float变量作为输入,并且作为模板可能会更好。而且,这些库有时使用marcos,而使用宏函数似乎是一个坏习惯,这是一个普遍的共识。 总而言之,它们似乎更多地是用C风格而不是C ++风格编写的。但是它们是完全不同的语言,不是吗? 问题是:为什么现代图书馆没有利用它们所写语言的优势?

4
为什么在JVM上固定堆大小?
谁能向我解释为什么JVM(我没有检查太多,但是我从未见过这样的情况)为什么需要以固定的堆大小运行?我知道在一个简单的连续堆上实现起来比较容易,但是Sun JVM已有十多年的历史了,因此我希望他们有时间改进它。 需要在启动时定义程序的最大内存大小似乎是在1960年代完成的,然后与OS虚拟内存管理的交互很差(GC检索交换出的数据,无法确定Java进程需要多少内存)真正从OS端使用,浪费了大量VM空间(我知道,您不在乎您喜欢的48位计算机...)。我还猜想,在JVM(EE应用程序服务器,OSGi)内部构建小型操作系统的各种可悲尝试至少部分归咎于这种情况,因为在系统上运行多个Java进程总是会浪费资源,因为您必须给他们每个人可能需要使用的内存。 出乎意料的是,Google并没有像我所期望的那样引起愤怒,但是它们可能只是埋葬在数以百万计的人中,他们发现了固定的堆大小并只是接受了一个事实。
20 java 


4
如果客户端的高级程度仍然不足以使用REST API,那么对“可发现性”的需求是什么?
我看过的各种讲​​座以及我在REST上扫描的教程似乎都在强调一种称为“可发现性”的东西。据我有限的理解,该术语似乎意味着客户应该能够http://URL-自动获得其可以做的事情的清单。 我难以理解的是-“软件客户”不是人类。它们只是程序,没有直观的知识来理解与所提供的链接的确切关系。只有人可以访问网站并理解所显示的文本和链接并对其进行操作。 那么,当访问此类可发现URL的客户端代码实际上无法对其进行任何操作时,除非客户端的人工开发人员实际尝试了所提供的资源,可发现性的意义何在?这看起来与在《文档》手册中定义可用功能集完全一样,只是方向不同,实际上需要为开发人员进行更多工作。为什么第二种预定义可以在实际REST资源外部的文档中完成的工作的方法被认为是次等的呢?
20 rest  api  hateoas 

7
“反向移植”一词有相反含义吗?
据我了解,术语“反向移植”用于描述在将来的版本中应用的修补程序,该版本也移植到了先前的版本中。维基百科的定义如下: 反向移植是对软件进行某些修改(补丁)并将其应用于比其最初创建的版本更早的软件的操作。它构成了软件开发过程中维护步骤的一部分。 例如: 在V2.0中发现并修复了问题。移植了相同的修补程序并将其应用于V1.5。 在相反方向进行操作时,该术语是什么? 在V1.5中发现并修复了该问题。移植了相同的修补程序并将其应用于V2.0。 术语“反向移植”是否仍然适用?还是有诸如“转发”之类的术语(听起来很像“端口转发”)?

5
关联,聚合和组合的用途是什么?
我研究了很多关于封装的理论以及实现封装的三种技术,即关联,聚合和组合。 我发现的是: 封装形式 封装是一种将类中的字段设为私有并通过公共方法提供对字段的访问的技术。如果某个字段被声明为私有,那么该类之外的任何人都无法访问该字段,从而将这些字段隐藏在该类中。因此,封装也称为数据隐藏。 封装可以描述为一种保护性屏障,可以防止该代码和数据被该类外部定义的其他代码随机访问。通过接口严格控制对数据和代码的访问。 封装的主要好处是能够修改我们已实现的代码,而不会破坏其他使用我们代码的人的代码。通过此功能,封装使我们的代码具有可维护性,灵活性和可扩展性。 协会 关联是一种关系,其中所有对象都有其自己的生命周期,并且没有所有者。让我们以老师和学生为例。多个学生可以与一个老师联系,一个学生可以与多个老师联系,但是对象之间没有所有权,并且都有自己的生命周期。两者都可以独立创建和删除。 聚合 聚合是协会的一种特殊形式,其中所有对象都有其自己的生命周期,但是有所有权,子对象不能属于另一个父对象。让我们以一个系和一个老师为例。一个老师不能属于多个部门,但是如果我们删除该部门,则该教师对象不会被销毁。我们可以将其视为“具有”关系。 组成 组合还是聚集的一种特殊形式,我们可以称其为“死亡”关系。这是一种很强的聚合。子对象没有生命周期,如果删除父对象,则所有子对象也将被删除。让我们再次以房屋与房间之间的关系为例。房屋可以包含多个房间,但是没有一个房间的独立生活,任何房间都不能属于两个不同的房屋。如果我们删除房屋,房间将被自动删除。 问题是: 现在这些都是真实的例子。我正在寻找有关如何在实际的类代码中使用这些技术的描述。我的意思是,使用三种不同的封装技术有什么意义,如何实现这些技术以及如何选择适用的技术。

3
Clojure是否具有延续/协程/等?
我开始使用Python进行编程,但对协程和闭包之类的概念确实感到困惑。 现在,我认为我在某种程度上是认识他们的,但是我从来没有感受到过“启蒙”的时刻,所以我选择学习Clojure。我买了斯图尔特·哈洛韦(Stuart Halloway)的书,它很好,但是当我查看索引时,并没有像协程或延续这样的词。我用谷歌搜索,但也没有。 所以,我的问题是: Clojure是否具有连续性或协程来执行诸如ping应答之类的任务而没有堆栈溢出? Python示例(尽管标准Python不支持此对称协程的全功能版本): def ping(): while 1: print "ping" function to switching to pong def pong(): while 1: function to switching to ping print "pong"

1
决策树与神经网络
此问题是从Stack Overflow 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 7年前。 我正在实现一种机器学习结构,以尝试预测诸如银行等金融系统上的欺诈行为。这意味着可以使用许多不同的数据来训练模型。卡号,持卡人姓名,金额,国家等... 我在确定哪种结构最适合此问题时遇到了麻烦。我对决策树有一些经验,但是目前我开始质疑神经网络是否可以更好地解决此类问题。另外,如果有其他任何最佳方法,请随时启发我。 每个结构的优缺点是什么,哪种结构最适合该问题? 我也不确定这个事实,但是我认为决策树在执行速度方面比神经网络有很大的优势。这很重要,因为速度也是该项目的关键因素。


3
单元测试C ++:要测试什么?
TL; DR 编写好的,有用的测试很困难,并且在C ++中代价很高。您是否有经验的开发人员可以就什么以及何时进行测试分享您的理论依据? 很长的故事 我曾经做过测试驱动的开发,实际上是整个团队,但对我们来说效果不佳。我们有很多测试,但是它们似乎从来没有覆盖我们有实际错误和回归的情况-通常是在单元交互时发生的,而不是因为它们孤立的行为而发生。 这通常很难在单元级别进行测试,以至于我们停止了TDD测试(组件确实可以加快开发速度),而花了更多时间增加集成测试的覆盖范围。尽管小型单元测试从未捕获任何实际的错误,并且基本上只是维护开销,但集成测试确实值得付出努力。 现在,我继承了一个新项目,并且想知道如何进行测试。它是本机C ++ / OpenGL应用程序,因此集成测试并不是真正的选择。但是C ++中的单元测试比Java中的要难一些(您必须显式地制作东西virtual),并且该程序不是很面向对象的,所以我无法模拟/存根一些东西。 我不想为了编写测试而仅仅为了编写一些测试而拆开并OO化整个过程。所以我问你:我应该为测试写什么?例如: 我希望经常更改的函数/类? 难以手动测试的函数/类? 已经易于测试的功能/类? 我开始研究一些受人尊敬的C ++代码库,以了解它们如何进行测试。现在,我正在研究Chromium源代码,但发现很难从代码中提取其测试依据。如果有人有一个很好的例子或关于C ++用户(委员会,书籍作者,Google,Facebook,Microsoft等人的看法)如何发表文章的帖子,那将特别有帮助。 更新资料 自编写此书以来,我一直在这个网站和网络上进行搜索。找到了一些好东西: 什么时候不进行单元测试? /programming/109432/what-not-to-test-when-it-comes-to-unit-testing http://junit.sourceforge.net/doc/faq/faq.htm#best 可悲的是,所有这些都是以Java / C#为中心的。用Java / C#编写大量测试不是一个大问题,因此收益通常超过了成本。 但是正如我上面所写,在C ++中要困难得多。尤其是如果您的代码库不是那么OO,那么您就必须认真弄乱事情,以获得良好的单元测试覆盖率。例如:我继承的应用程序具有一个Graphics名称空间,该名称空间是OpenGL之上的薄层。为了测试任何实体(它们都直接使用其功能),我必须将其变成一个接口和一个类,并将其注入所有实体中。那只是一个例子。 因此,在回答这个问题时,请记住,我必须在编写测试方面投入大量资金。

1
为什么C库使用同名的宏和函数?
我正在阅读PJ Plauger的“标准C库”,这真的很有趣。该书不仅说明了如何使用该库,而且还说明了其实现方法。 我已经阅读完本ctype.h节,并且在标头中将函数声明为两个宏AND函数。例如 int isdigit(int); 但是也 #define isdigit(c) (_Ctype[(int)(c)] & _DI) 我不明白为什么两者都使用? 另外,如果我尝试重新创建自己的自定义ctype标头和实现,则只有删除宏(注释中的注释),我才能成功编译。 书中并没有真正解释这方面。有人可以解释一下吗?
20 c  naming  functions  macros 

13
为什么操作系统会在C和C ++中做底层工作?为什么不只是C ++?
在Windows的Wikipedia页面上,它指出Windows是用Assembly语言编写的,用于引导加载程序和任务切换器,以及C 和 C ++语言的内核例程。 IIRC,您可以从extern "C"'d块调用C ++函数。我可以将C用于内核函数,这样纯C应用程序就可以使用它们(诸如此类printf),但是如果它们只能包装在一个extern "C "块中,那么为什么要用C语言编写代码?

4
如何组织个人Git存储库?
我正在建立一个GitHub帐户,并计划将我作为一些近期iOS项目的一部分开发的库免费提供给其他iOS开发人员使用。 我目前大部分代码都没有异地备份,因此,我最初以为我会将所有个人项目或至少所有iOS项目上载到私有GitHub托管的存储库中。但是,我有很多项目,其中很多都是低价值的(即从书本改写而来的学习经验)。GitHub不仅由私有存储库收取费用,而且似乎没有任何分层组织存储库的方法。 我是否缺少某些东西,可以让我使用具有层次结构的git存储库,并在需要时/根据我目前的SVN方式检出碎片? GitHub(或像BitBucket这样的竞争对手)是否具有某些我缺少的项目组织功能? 如果失败了,处理这种情况的普遍接受的“ Git方式”是什么(丢弃不打算发布的项目,将其离线存储,以某种方式将它们捆绑在一起,等等,等等)? 据我所知,我的选择是: 将库放到GitHub上,继续为所有其他项目托管我自己的SVN,使用非VCS解决方案进行异地备份(崩溃), 将我计划在GitHub上发布的库和软件(分别作为公共和私人版本)放置,继续为我不太关心的项目托管我自己的SVN,并且仅可能重新访问以刷新关于如何实现XYZ的记忆,决定如果我的房屋爆裂(双声),我愿意注销它们, 将所有内容放到[GitHub和/或BitBucket]上,通过搜索我需要的内容/在我的[GitHub和/或BitBucket]帐户中维护一些脱机指针集来处理一些可笑的存储库(三重问题)

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.