软件工程

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

7
所有安全威胁是否都由软件错误触发?
我听说过的大多数安全威胁是由于软件中的错误引起的(例如,未正确检查所有输入的完整性,堆栈溢出等)。因此,如果我们排除所有社交黑客攻击,是否都是由于漏洞引起的安全威胁?换句话说,如果没有错误,是否就不会有安全威胁(再次,排除诸如公开密码之类的人类错误)?还是可以通过非漏洞引起的方式利用系统?
13 security  bug  hacking 

2
通过类构造所有代码并编译为类(如Java)的优缺点
编辑:与Java不同,我的语言允许多重继承。 我已经开始设计和开发自己的编程语言,用于教育,娱乐和可能有用的目的。 首先,我决定将其基于Java。 这意味着所有代码都将以类的形式编写,并且代码会编译为类,这些类由VM加载。 但是,我排除了诸如接口和抽象类之类的功能,因为我发现不需要它们。他们似乎在强制范式,我希望我的语言不要这样做。但我想将这些类保留为编译单元,因为实现起来似乎很方便,熟悉,而且我只是喜欢这个想法。 然后,我注意到我基本上只剩下一个模块系统,在该系统中,类可以用作“命名空间”,使用static指令提供常量和函数,或用作需要实例化的对象的模板(类的“实际”目的)其他语言)。 现在我不禁要问:将类用作编译单元有什么好处和坏处? 另外,对于我的设计的任何一般性评论也将不胜感激。可以在以下网站找到有关我的语言的丰富信息:http : //www.yannbane.com/2012/12/kava.html。

3
是否已对任何编程语言的语法进行了可用性测试?
想要改善这篇文章吗?提供此问题的详细答案,包括引文和为什么您的答案正确的解释。答案不够详细的答案可能会被编辑或删除。 在发布给公众之前,任何编程语言的语法都经过可用性测试吗?如果是,执行了哪些测试,结果是什么,以及测试结果对语言的设计产生了什么影响?

4
将共享数据封装在软件管道中的良好实施策略
我正在努力重构现有Web服务的某些方面。实现服务API的方式是通过具有一种“处理管道”,其中有按顺序执行的任务。毫不奇怪,以后的任务可能需要由以前的任务计算的信息,当前完成此操作的方法是将字段添加到“管道状态”类中。 我一直在思考(并希望?),比在管道步骤之间共享信息的更好方法要好于拥有一个具有成千上万个字段的数据对象,其中某些字段对某些处理步骤有意义,而对另一些处理步骤却没有意义。使该类成为线程安全类将是一个巨大的痛苦(我不知道它是否可能实现),无法推断其不变性(很可能没有任何原因)。 我翻阅了《四人帮》设计模式书以找到一些灵感,但我觉得那儿没有解决的办法(Memento的想法有些相同,但不完全相同)。我也在网上看过,但是第二次搜索“管道”或“工作流”时,您就会被Unix管道信息或专有工作流引擎和框架所淹没。 我的问题是-您将如何处理记录软件处理管道执行状态的问题,以便以后的任务可以使用以前的任务计算的信息?我猜想与Unix管道的主要区别在于,您不仅在乎前一项任务的输出。 根据要求,使用一些伪代码来说明我的用例: “管道上下文”对象具有许多字段,不同的管道步骤可以填充/读取这些字段: public class PipelineCtx { ... // fields public Foo getFoo() { return this.foo; } public void setFoo(Foo aFoo) { this.foo = aFoo; } public Bar getBar() { return this.bar; } public void setBar(Bar aBar) { this.bar = aBar; } ... // more methods } …

3
使用模板时,如何处理越来越长的编译时间?
我使用Visual Studio 2012,在某些情况下,我们将模板参数添加到“ just”类中​​以引入“接缝点”,以便在单元测试中可以将这些部分替换为模拟对象。 您通常如何在C ++中引入接缝点:使用接口和/或通过使用模板参数,还基于某些条件与隐式接口进行混合?提出此问题的原因之一还在于,当有时编译单个C ++文件(包括模板文件,还可能包括其他模板)时,会导致在开发人员机器上生成大约5-10秒的目标文件。 。 据我所知,由于模板包含模型,VS编译器在编译模板方面也不是特别快(实际上,您在每个间接使用它的文件中都包含了模板的定义,并且每次修改时都可能重新实例化该模板)与模板无关的内容)(在进行增量编译时),编译时间可能会出现问题。 使用模板时,处理增量(且不仅是)编译时间的方法是什么(除了更好/更快的编译器:-)外)。
13 c++  tdd  templates 

1
Scala作为通用编程语言
在Garcia等人的论文“针对通用编程的语言支持的扩展比较研究”中。给出了通用编程的编程语言功能的有趣比较: 简要解释术语: 任何人都可以在此框架内测试Scala对通用编程的支持吗?即,如果可能的话,在第一张表中添加一列,并附上说明。


1
包装第三方代码是否是对用户进行单元测试的唯一解决方案?
我正在进行单元测试,并且在我的一个类中,我需要从一种方法中发送邮件,因此使用构造函数注入,我将注入Zend_MailZend框架中的类的实例。 现在有人认为,如果一个库足够稳定并且不会经常更改,那么就无需对其进行包装。因此,假设这Zend_Mail是稳定的并且不会改变并且完全满足我的需求,那么我就不需要包装器了。 现在看一下我的课程Logger,该课程取决于Zend_Mail: class Logger{ private $mailer; function __construct(Zend_Mail $mail){ $this->mail=$mail; } function toBeTestedFunction(){ //Some code $this->mail->setTo('some value'); $this->mail->setSubject('some value'); $this->mail->setBody('some value'); $this->mail->send(); //Some } } 但是,单元测试要求我一次测试一个组件,因此我需要模拟Zend_Mail该类。另外,我违反了依赖倒置原则,因为我的Logger课程现在依赖于具体而非抽象。 现在,我如何Logger在不进行包装的情况下进行隔离测试Zend_Mail? 该代码在PHP中,但不一定必须提供答案。这更多的是设计问题,而不是特定于语言的功能

2
内联代码注释的最佳方法是什么?
我们正在对已有20年历史的旧代码库进行一些重构,并且我正在与我的同事讨论代码中的注释格式(plsql,java)。 没有默认的注释格式,但是在大多数情况下,人们会在注释中执行以下操作: // date (year, year-month, yyyy-mm-dd, dd/mm/yyyy), (author id, author name, author nickname) and comment 我想要的将来和过去评论的建议格式是: // {yyyy-mm-dd}, unique_author_company_id, comment 我的同事说,我们只需要评论,并且必须将所有过去和将来的评论重新格式化为这种格式: // comment 我的论点: 我说出于维护原因,知道何时以及谁进行了更改非常重要(即使此信息在SCM中也是如此)。 该代码是有效的,因此有历史。 因为没有更改日期,如果不打开SCM工具并搜索较长的对象历史记录,就无法知道何时进行更改。 因为作者非常重要,所以改变作者比改变作者更可信 敏捷性原因,无需打开和浏览SCM工具 人们会更害怕更改某人15年前所做的事情,而不是最近创建或更改的事情。 等等 我同事的论点: 历史在SCM中 开发人员不得直接在代码中了解代码的历史记录 软件包的长度为15,000行,而且非结构化的注释使这些软件包更难以理解 您认为最好的方法是什么?还是您有更好的方法来解决此问题?

5
如何最好地管理公司机密研究代码的开放源代码发布?
我公司(简称为Acme Technology)拥有大约一千个源文件库,这些文件最初来自其Acme Labs研究小组,在一个开发小组中孵化了几年,最近已提供给少数客户。非公开。Acme已准备好向开源社区发布大约75%的代码。其余25%将在以后发布,但是目前,要么尚未准备好供客户使用,要么包含与未来创新相关的代码,他们需要将这些创新保持在竞争对手的控制之下。 目前,该代码已使用#ifdefs格式化,该代码库允许相同的代码库与预生产平台一起使用,一旦开源,该研究平台将可供大学研究人员和更广泛的商业客户使用,同时可用于实验和原型设计以及与未来平台的向前兼容性测试。对于我们小组的经济(和理智)而言,保持单一代码库被认为是至关重要的,因为他们很难同时维护两个副本。 当前库中的文件如下所示: > // Copyright 2012 (C) Acme Technology, All Rights Reserved. > // Very large, often varied and restrictive copyright license in English and French, > // sometimes also embedded in make files and shell scripts with varied > // comment styles. > > > ... …

1
C ++ 11支持高阶列表功能
大多数函数式编程语言(如Common Lisp的,计划/球拍,Clojure中,Haskell中,斯卡拉,ocaml的,SML)支持列出了一些常见的高阶功能,如map,filter,takeWhile,dropWhile,foldl,foldr(见如Common Lisp的,计划/球拍, Clojure并排参考表,Haskell,Scala,OCaml和SML文档。) C ++ 11是否在列表上具有等效的标准方法或函数?例如,考虑以下Haskell代码段: let xs = [1, 2, 3, 4, 5] let ys = map (\x -> x * x) xs 如何在现代标准C ++中表达第二个表达式? std::list<int> xs = ... // Initialize the list in some way. std::list<int> ys = ??? // How to translate the Haskell expression? 上面提到的其他高阶函数呢? …

6
使用敏捷方法重写软件
假设您必须使用敏捷方法重写整个应用程序,您将如何做? 我猜您可以根据当前系统的行为编写大量用户案例。然后以小的迭代形式实现它们。但这并不意味着我们具有UP FRONT的要求? 另外,什么时候开始发布?敏捷说我们应该早并且经常发布,但是在完全重写完成之前发布并没有多大意义。

5
与构造函数相反的函数的正确术语是什么-从数据类型中解包值?
编辑:我改一下这个问题。显然,我引起了一些混乱,因为我没有意识到在OOP中使用析构函数一词是因为它们完全不同-它是在销毁对象时调用的函数。在函数式编程中,我们(尽量)避免发生可变状态,因此没有这种等效状态。(我在问题中添加了适当的标签。) 相反,我已经看到用于解开值的记录字段(尤其是用于newtypes的单值数据类型)有时称为destructor或deconstructor。例如,让我们(在Haskell中): newtype Wrap = Wrap { unwrap :: Int } 这Wrap是构造函数,unwrap是什么? 问题是: 我们如何unwrap在函数式编程中调用?解构器?破坏者?或其他术语? 并澄清一下,这个/其他术语是否适用于其他功能语言,还是仅在Haskell中使用? 或许,在非功能性语言中,对此是否有通用的术语? 我看过两个词,例如: ...通常,一个人为这些提供聪明的构造函数和析构函数以简化与它们的合作。... 在Haskell Wiki上,或 ...这里的一般主题是融合构造函数- 像...这样的解构函数对 在Haskell Wikibook上(这里的含义可能更笼统),或者 newtype DList a = DL { unDL :: [a] -> [a] } 该unDL功能是我们的解构,从而消除了DL构造。... 在现实世界中的Haskell。

3
如果我在Java循环内或循环外声明变量,会有所不同吗?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 2年前关闭。 可能重复: 您在哪里声明变量?方法的顶部或何时需要它们? 如果我在Java循环内或循环外声明变量,会有所不同吗? 这是 for(int i = 0; i < 1000; i++) { int temp = doSomething(); someMethod(temp); } 等于这个(关于内存使用)? int temp = 0; for(int i = 0; i < 1000; i++) { temp = doSomething(); someMethod(temp); } 如果临时变量例如是ArrayList,该怎么办? for(int i = 0; i < 1000; …
13 java  variables  loops 

8
您是否应该承诺提供不确定是否可实现的功能?
在HN的一篇文章中,我遇到了以下建议: 即使不确定,也请始终对客户/用户说“是”。90%的时间,您会找到一种方法。10%的时间,您会回去道歉。以小价钱支付个人的主要成长 但是我一直认为,在对客户/用户做出任何形式的承诺之前,应该先进行可行性分析,以使它们在任何时候都不会被误导。那么,在什么情况下上述建议应适用?

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.