软件工程

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

2
是否可以在Java中捕获StackOverflowError?
我曾经以为不是,但是昨天我不得不这样做。这是一个使用Akka(JVM的参与者系统实现)来处理异步作业的应用程序。其中一位参与者执行了一些PDF操作,并且由于该库存在错误,因此有时会死于StackOverflowError。 第二个方面是,如果捕获到任何JVM致命错误(例如,StackOverflowError),则将Akka配置为关闭其整个actor系统。 第三个方面是该参与者系统被嵌入到Web应用程序中(出于WTF-ish,传统,原因),因此当参与者系统关闭时,Web应用程序就不会被关闭。最终结果是,在StackOverflowError我们的工作处理应用程序上,该应用程序变成了一个空的Web应用程序。 作为快速解决方案,我不得不赶上了StackOverflowError被抛出的问题,以便不会破坏actor系统的线程池。这使我认为也许有时可以捕获此类错误,尤其是在这种情况下?当有一个线程池处理任意任务时?与A不同,OutOfMemoryError我无法想象A如何StackOverflowError使应用程序处于不一致状态。在发生此类错误后将清除堆栈,因此计算可以正常进行。但是也许我错过了一些重要的事情。 另外,请注意,我一开始就是要修复错误(事实上,几天前我已经在同一应用程序中修复了SOE),但是我真的不知道什么时候可能会出现这种情况。 为什么最好重新启动JVM进程而不是捕获StackOverflowError,将作业标记为失败,然后继续我的业务? 有什么令人信服的理由永远不赶上国有企业?除了“最佳实践”,这是一个模糊的术语,什么也没告诉我。

2
程序员在购买计算机时应寻求哪些规格?或者,我应该买什么计算机?[关闭]
我希望购买一台专为编程设计的新计算机。 我想自己为学习体验构建它,但也愿意购买它。 基本上,我已经下载了许多专用于编程的文件,它们太大了,以至于a)我的计算机容量已满,b)我4岁的计算机速度非常慢。 具体来说,我喜欢数据库(Oracle / PostGreSQL,Mongo,Hadoop)和Java,但是喜欢学习所有可能的语言。

7
我应该担心面试过程中给出的程序设计作业过度工程吗?[关闭]
最近,我对一家公司进行了电话采访。在电话采访之后,我被告知要完成一个简短的编程任务(一个小程序;应该不超过三个小时)。我仅被指示直接完成作业并上交代码。我被赋予了完全自由地使用自己希望使用的任何语言的权限,并且没有确切地告诉我如何上交代码。 我立即计划将其投放到Github上,为其编写测试套件,使用Travis-CI(公共Github存储库的免费连续集成)运行测试套件,并使用CMake构建Travis-CI的Linux makefile。这样,不仅可以证明我了解如何使用Git,CMake,Travis-CI以及如何编写测试,而且还可以直接链接到Travis-CI页面,以便他们可以看到测试的输出。我认为这会使面试官更加方便。 由于我非常了解这些技术,因此基本上不会增加​​分配时间。 但是,我有点担心对于一个相对简单的任务执行所有这些操作会看起来很糟糕。尽管这对我来说根本不会增加太多时间,但我不希望他们认为我花太多时间在本应简单的事情上。

4
最终在内部抛出异常
诸如Fortify之类的静态代码分析器会在一个finally块内抛出异常时说“抱怨” Using a throw statement inside a finally block breaks the logical progression through the try-catch-finally。通常我同意这一点。但是最近我遇到了以下代码: SomeFileWriter writer = null; try { //init the writer //write into the file } catch (...) { //exception handling } finally { if (writer!= null) writer.close(); } 现在,如果writer无法正确关闭,则该writer.close()方法将引发异常。应该抛出异常,因为(很可能是)写入后未保存文件。 我可以声明一个额外的变量,如果关闭时出错,则进行设置,writer并在finally块之后引发异常。但是这段代码可以正常工作,我不确定是否要更改它。 在finally块内引发异常的缺点是什么?

7
函数式编程是否忽略了“关于将系统分解为模块所用的准则”(数据隐藏)所带来的好处?
我第一次读过一篇经典的文章,名为《关于将系统分解为模块的标准》。这对我来说很有意义,并且可能是OOP所基于的那些文章之一。结论: 我们试图通过这些示例来证明,根据流程图将系统分解为模块几乎总是不正确的。...然后每个模块都被设计为对其他模块隐藏这样的决定 以我未受过教育和缺乏经验的观点,函数式编程与本文完全相反。我的理解是函数式编程使数据流变得惯用了。数据从一个函数传递到另一个函数,每个函数都密切了解数据并在此过程中“更改”它。而且我想我已经看过Rich Hickey的演讲,他在演讲中谈到数据隐藏是如何被高估或不必要的,但我不确定。 首先,我想知道我的评估是否正确。FP范式和本文在哲学上是否不一致? 假设他们不同意,FP如何“弥补”缺乏数据隐藏的能力?也许他们牺牲了数据隐藏,但获得了X,Y和Z。我想知道为什么X,Y和Z比数据隐藏更有益的原因。 或者,假设他们不同意,也许FP认为数据隐藏很糟糕。如果是这样,为什么会认为数据隐藏不好? 假设他们同意,我想知道什么是FP数据隐藏实现。很明显在OOP中看到了这一点。您可以拥有一个private班级以外的人无法访问的字段。在FP中,没有明显的比喻。 我觉得还有其他问题要问,但我不知道我要问。也可以随意回答。 更新资料 我发现尼尔·福特(Neal Ford)的演讲中有一个非常相关的幻灯片。我将屏幕截图嵌入此处:

5
不要为不可变对象声明接口
不要为不可变对象声明接口 [编辑]所涉及的对象代表数据传输对象(DTO)或纯旧数据(POD) 这是一个合理的指导方针吗? 到目前为止,我经常为不可变(无法更改数据)的密封类创建接口。我一直在小心谨慎,不要在我关心不变性的任何地方使用该接口。 不幸的是,界面开始渗透代码(这不仅仅是我担心的代码)。您最终要通过一个接口,然后又想将其传递给某些代码,而这些代码确实想假设要传递给它的东西是不可变的。 由于这个问题,我正在考虑永远不要为不可变对象声明接口。 这可能会对单元测试产生影响,但是除此之外,这似乎是一个合理的指南吗? 还是我应该使用另一种模式来避免出现“扩展接口”问题? (我之所以使用这些不可变的对象,有几个原因:主要是出于线程安全,因为我编写了许多多线程代码;还因为这意味着我可以避免将防御性的对象副本传递给方法。代码变得更加简单在很多情况下,当您知道某事物是不可变的时,如果您已经获得了接口,那么您就不会知道这一点。事实上,如果您不提供通过接口引用的对象的防御性副本,通常情况下您甚至无法克隆操作或序列化的任何方式...) [编辑] 由于我想使对象不可变的原因,为了提供更多上下文,请参阅Eric Lippert的这篇博客文章: http://blogs.msdn.com/b/ericlippert/archive/tags/immutability/ 我还应该指出,我在这里使用一些较低级别的概念,例如在多线程作业队列中正在操纵/传递的项目。这些本质上是DTO。 约书亚·布洛赫(Joshua Bloch)也在他的《有效的Java》一书中建议使用不可变对象。 跟进 谢谢您的反馈。我已经决定继续使用该指导原则,以适用于DTO及其同类。到目前为止,它运行良好,但是只有一个星期了……看起来还不错。 我还想问一些与此有关的其他问题;尤其是我所说的“深层或浅层不变性”(我从深层和浅层克隆中窃取的术语)-但这是另一个问题。
27 c#  immutability 


1
如何选择使用域事件还是让应用程序层协调一切
我正在迈入域驱动设计的第一步,购买了蓝皮书和其他所有书籍,我发现自己看到三种实现特定解决方案的方法。作为记录:我没有使用CQRS或事件源。 假设有一个用户请求进入了应用程序服务层。出于某种原因,该请求的业务逻辑分为实体上的方法和域服务上的方法。我应该如何去调用那些方法? 到目前为止,我收集的选项有: 让应用程序服务调用这两种方法 使用方法注入/双重调度将域服务注入到实体中,让实体来做,然后让它调用域服务的方法(或者反之,让域服务在实体上调用方法) 在实体方法中引发一个域事件,该事件的处理程序调用域服务。(我正在谈论的域事件是:http : //www.udidahan.com/2009/06/14/domain-events-salvation/) 我认为这些都是可行的,但我无法在它们之间进行选择。我已经考虑了很长时间了,直到现在我再也看不到这三者之间的语义差异了。您知道什么时候使用什么准则吗?

9
在临时解决方法的方法名称中包含错误编号是否被认为是不好的做法?
我的高级同事阻止我进行代码审查,因为他希望我将方法命名为“ PerformSqlClient216147Workaround”,因为这是某些缺陷的解决方法。现在,我的方法名称建议类似于PerformRightExpressionCast,它倾向于描述该方法的实际作用。他的论点是这样的:“这种方法仅在这种情况下用作解决方法,而在其他地方则没有。” 在临时解决方法的方法名称中包含错误号是否被视为不良做法?

5
别人可以为我的开源算法申请专利吗?[关闭]
我编写了一个递归搜索算法来查找体素数据结构的边界,以便更有效地呈现它。我环顾四周,或者它是一种简单明了的技术,没有人为它申请专利,或者它是新颖的,而且以前没有人这样做。 它在GitHub上公开“发布”并受GPL保护。我想向其他人展示它,看看是否可以改进... 我担心尽管我已经撰写并发布了该书,但有人可能会尝试为同一想法申请专利。 我是安全的吗?是否受到开放源代码软件的保护?还是我必须像大手笔和专利巨魔一样保护自己? 我相信软件专利是邪恶的,并且为了编写出最好的软件,很多人需要看到它。不过,我担心这可能只是关于如何编写软件的幼稚观点,我对其他人的想法感到好奇。

3
哪种字符串搜索算法实际上是最快的?
我一直被困在最快的字符串搜索算法上一段时间,听到了很多意见,但是最后我不确定。 我听到有人说最快的算法是Boyer-Moore,有人说Knuth-Morris-Pratt实际上更快。 我一直在寻找它们两者的复杂性,但是它们看起来大致相同O(n+m)。我发现在最坏的情况下,博耶·摩尔O(nm)要比具有O(m + 2 * n)的克努斯·莫里斯·普拉特复杂。其中,n =文本长度,m =模式长度。 据我所知,如果我使用加利尔定律,博耶-摩尔的情况将是最糟的。 我的问题,总的来说,这实际上是最快的字符串搜索算法(此问题包括所有可能的字符串算法,而不仅仅是Boyer-Moore和Knuth-Morris-Pratt)。 编辑:由于这个答案 我要寻找的是: 鉴于文本T和图形P我必须找到所有的出场P在T。 P和T的长度也来自[1,2 000 000],程序必须在0.15秒内运行。 我知道KMP和Rabin-Karp足以在该问题上获得100%的分数,但是我想尝试实施Boyer-Moore。哪种模式搜索最合适?

2
在Android开发中使用ORM是否有意义?
在Android开发中使用ORM是否有意义,还是针对UI和DB层之间更紧密的耦合而优化了框架? 背景:我刚刚开始进行Android开发,而我的第一个直觉(来自.net背景)是寻找一个小型的对象关系映射器以及其他有助于减少样板块的工具(例如POJOs + OrmLite + Lombok)。 但是,在开发第一个玩具应用程序时,我偶然发现了一个UI类,该类明确需要数据库游标:AlphabetIndexer。这让我怀疑Android库是否不适合UI和DB层的严格分离,如果我尝试在所有地方使用POJO(而不是直接访问数据库),我会错过许多有用的,省时的功能)。 澄清:我很清楚总体上使用ORM的优势,我特别感兴趣的是Android类库与之一起发挥的作用。



9
让赋值运算符返回值有什么好处?
我正在开发一种语言,打算取代Javascript和PHP。(我看不出有任何问题。这两种语言都不具有庞大的安装基础。) 我要更改的一件事是将赋值运算符转换为赋值命令,从而取消了使用返回值的功能。 x=1; /* Assignment. */ if (x==1) {} /* Comparison. */ x==1; /* Error or warning, I've not decided yet. */ if (x=1) {} /* Error. */ 我知道这将意味着C员工如此钟爱的单行功能将不再起作用。我发现(几乎没有我个人经验的证据),这种情况在绝大多数情况下确实是比较操作。 还是?赋值运算符的返回值是否有任何实际用途,无法轻易重写?(对于具有这种概念的任何语言。)

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.