软件工程

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

1
使用Python进行鸭子输入,数据验证和断言编程
关于鸭子打字: 通过惯用性地不测试方法和函数体中的自变量类型,依靠文档,清晰的代码和测试来确保正确使用,可以帮助进行鸭子键入。 关于论证验证(EAFP:比宽恕更容易获得宽恕)。来自这里的改编示例: ...被认为是更pythonic的: def my_method(self, key): try: value = self.a_dict[member] except TypeError: # do something else 这意味着使用您的代码的其他任何人都不必使用真正的字典或子类-他们可以使用实现映射接口的任何对象。 不幸的是,实际上并不是那么简单。如果上述示例中的member可能是整数怎么办?整数是不可变的-因此将它们用作字典键是完全合理的。但是,它们也用于索引序列类型对象。如果member恰好是整数,则示例二可以让列表,字符串以及字典通过。 关于断言编程: 断言是检查程序内部状态是否符合程序员期望的一种系统方法,目的是捕获错误。特别是,它们非常适合捕获编写代码时做出的错误假设,或捕获其他程序员滥用接口的情况。此外,通过使程序员的假设显而易见,它们可以在一定程度上充当内联文档。(“显式优于隐式。”) 提到的概念有时会发生冲突,因此在选择是否完全不进行任何数据验证,进行强力验证或使用断言时,我会依靠以下因素: 强力验证。通过强力验证,我的意思是引发自定义Exception(ApiError例如)。如果我的函数/方法是公共API的一部分,则最好验证参数以显示有关意外类型的良好错误消息。通过检查类型,我并不是指仅使用isinstance,而是通过的对象是否支持所需的接口(鸭子输入)。当我记录API并指定期望的类型并且用户可能想以意外方式使用我的函数时,在检查这些假设时,我会感到更加安全。我通常使用isinstance,如果以后要支持其他类型或鸭子,则可以更改验证逻辑。 断言编程。如果我的代码是新的,我会使用很多断言。您对此有何建议?以后是否从代码中删除断言? 如果我的函数/方法不是API的一部分,而是将其某些参数传递给我未编写,研究或测试的其他代码,则我会根据被调用的接口执行很多断言。我的逻辑背后-最好在我的代码中失败,然后在堆栈跟踪中加深10个级别,出现难以理解的错误,这迫使进行大量调试,然后无论如何都将断言添加到我的代码中。 断言,关于何时使用或不使用类型/值验证的评论和建议?很抱歉,问题不是最好的表述。 例如,考虑以下函数,其中Customer是SQLAlchemy声明性模型: def add_customer(self, customer): """Save new customer into the database. @param customer: Customer instance, whose id is None @return: merged into global session customer …

3
带有Queue和ZeroMQ IPC的Python多处理
我正在忙着使用ZeroMQ编写Python应用程序,并实现ZGuide中描述的Majordomo模式的变体。 我有一个经纪人,作为一组工人和客户之间的中介。我想对传入的每个请求进行大量日志记录,但是我不希望经纪人浪费时间这样做。代理应将该日志记录请求传递给其他对象。 我想到了两种方法: 创建仅用于日志记录的工作程序并使用ZeroMQ IPC传输 与队列一起使用多处理 我不确定哪一个更好或更快速。第一个选项确实允许我使用我已经用于普通工作程序的当前工作程序基类,但是第二个选项似乎可以更快地实现。 我想就以上内容或其他解决方案提出建议或意见。

2
是否对编程语言运行时的内存消耗进行了比较研究,并将其与表达能力和生产错误率相关联?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 6年前关闭。 关于使用一种或多种语言构建的应用程序的运行时性能,有许多比较研究并可以在线获得。有些是由公司推动的,有些是学术的,有些只是个人的实验报告。 在编程语言及其工具的副作用方面,我们也得到了相当多的比较研究,例如: 建立时间 后期发现错误的可能性, 表达能力, 等等... 但是,最近,我对程序的内存消耗感到越来越沮丧,这比其他任何事情都重要。这可能来自以下事实:尽管摩尔定律在我们的工作上表现出色,但我们已经意识到其他瓶颈更为重要。这样,而且我不会经常这样更新硬件,而且我有一些“旧的”(阅读2005-2006 3.6GHz Pentium 4,具有4GB的内存),如今很难被其用于大型应用程序而无需要求我费很大的劲才能从中榨汁(例如,操作系统,UI,服务和守护程序的调整,选择用于任务或其他用途的应用程序...)。老实说,有时我看到最无辜的程序使用的内存时会发火top或procexp哭泣。 我可以通过坚持上述方向来解决这个问题,并且本质上是要限制自己和我使用的程序(出于这个原因,我对cli程序非常热爱,我想),但是我也不得不思考也许我们做错了。 满足现代需求的现代工具 当然,高级语言可以说是更好的选择,并证明它们值得承担沉重的负担。当时,出于很多原因(或合理预期),在许多工具链中做出了一些设计选择。共享的库,内存模型,预处理器,类型系统等。但是使用我们的现代硬件,某些库可能比另一些库更可行,我很想阅读一些对此事的认真研究。 因此,我的问题是,基准游戏和其他游戏是否有侧重于比较语言的基本运行时内存消耗? 甚至更进一步,是否有一些研究将此与其他参数进行交叉引用(类似于本文所做的,例如,对于其他标准,也基于基准博弈)?

7
我相信我应该混合使用C和C ++代码。这是一个问题,如何纠正?
背景/场景 我开始纯粹用C语言编写CLI应用程序(我的第一个适当的C或C ++程序不是“ Hello World”或其变体)。大约在中途,我正在处理用户输入(字符串数组)的“字符串”,然后发现了C ++字符串流对象。我看到我可以使用这些代码保存代码,因此我在应用程序中使用了它们。这意味着我已将文件扩展名更改为.cpp,现在使用g++而不是编译应用程序gcc。因此,基于此,我可以说该应用程序从技术上讲是一个C ++应用程序(尽管90%以上的代码是用我称为C的代码编写的,因为鉴于我有限的经验,这两种语言之间存在很多交叉之处他们俩)。它是一个大约900行长的.cpp文件。 重要因素 我希望该程序免费(如金钱形式),可以自由分发并可供所有人使用。我担心的是,有人会看一下代码,然后想出以下效果: 哦,看一下编码,太糟糕了,这个程序帮不了我 可能的话!另一个问题是代码高效(这是用于测试以太网连接性的程序)。代码中不应存在效率低下的部分,以至于它们可能严重阻碍应用程序或其输出的性能。但是,当寻求有关特定功能,方法,对象调用等的帮助时,我认为这是Stack Overflow的问题。 我的问题 (在我看来)混合了C和C ++,也许我不应该这样做。我应该用C ++重写所有内容(通过这种方式,我的意思是实现更多的C ++对象和方法,也许我已经用C风格编写了可以使用较新的C ++技术浓缩的内容),或者删除了使用字符串流对象和把这一切“带回” C代码?这里有正确的方法吗?我迷路了,需要一些指导如何使该应用程序在群众眼中保持“良好”,因此他们将使用它并从中受益。 代码-更新 这是代码的链接。大约有40%的评论,我几乎每行评论,直到我感到更加流利。在我链接到的副本中,我删除了几乎所有注释。我希望这不会使阅读变得困难。我希望没有人需要完全理解它。但是,如果我犯了致命的设计缺陷,我希望它们应该易于识别。我还应该提到,我正在编写几个Ubuntu台式机和笔记本电脑。我无意将代码移植到其他操作系统。
10 c++  c 

4
函数中内部作用域块的使用是否不好?
在某些(非常罕见)的情况下,存在以下风险: 重用不打算重用的变量(请参见示例1), 或使用一个变量代替另一个在语义上接近的变量(请参见示例2)。 范例1: var data = this.InitializeData(); if (this.IsConsistent(data, this.state)) { this.ETL.Process(data); // Alters original data in a way it couldn't be used any longer. } // ... foreach (var flow in data.Flows) { // This shouldn't happen: given that ETL possibly altered the contents of `data`, it is …

5
如何在多个if-else中处理标志
我似乎经常在我的代码和其他代码中看到这一点。似乎没有什么比这更糟糕的了,但是它看起来可以做得更好,这让我很烦。我猜想一个case语句可能更有意义,但是变量通常不是一个很好的类型,或者根本不能与case语句一起使用(取决于语言) If variable == A if (Flag == true) doFooA() else doFooA2 else if variable == B if (Flag == true) doFooB() else doFooB2 else if variable == C if (Flag == true) doFooC() else doFooC2 似乎有多种方法可以“分解”,例如2套if-elses,其中一组在Flag == true时处理。 是否有“好方法”将其分解,或者如果这种if-else算法发生,通常意味着您做错了什么?

6
您如何在Sprint Review中演示没有UI的软件?
我们基本上是根据Scrum进行敏捷软件开发。我们正在尝试进行冲刺审核,但发现很困难。我们的软件正在处理大量数据,而故事往往涉及围绕此更改各种规则。 在没有UI或可见的工作流更改的情况下,有哪些选项可用于演示sprint中发生的更改,但是更改是处理工作的微妙业务规则,可能需要10分钟甚至几小时的时间?
10 agile  scrum  sprint 

1
github README.md中应该包含哪些信息?
您希望在github自述文件中看到哪些信息? 一切都应该放在自述文件中吗?即 介绍 安装 版本号 用户指南 实作 测试中 相关资源 还是应该将某些内容放进自述文件(简介,安装,版本)中,而其他信息最好放在Github Wiki中?


2
属性正确命名以代表以数字开头的字符串
查看Windows上的某些相机元数据File Properties(还有其他一些内容),两个分别Properties称为Focal length和35mm焦距。 我正在开发将利用这两个功能的软件Properties。到目前为止,我已经为第一个创建了一个Property名称FocalLength,但是似乎无法为另一个找到合适的名称。 我已经考虑过_35MmFocalLength或ThirtyFiveMmFocalLength,但是我认为可能会有更好的建议。 有任何想法吗?

1
java.util软件包中用于堆栈的对象约束语言(OCL)
我即将参加考试,并且正在查看过去的论文,以期获得一些期望的想法。我对以下内容有些困惑,如果有人可以给出示例答案,我将不胜感激。 在OCL中为以下每个操作(包括在java.util包的Stack类中)写入前置条件和后置条件: (1)布尔型empty()-测试此堆栈是否为空 (2)E peek()-在不从堆栈中移除的情况下,查看此堆栈顶部的对象 (3)E pop()-删除此堆栈顶部的对象,并将该对象作为此操作的值返回 (4)E push(E item)-将一个项目推到此堆栈的顶部 这里E表示堆栈中元素的类型。 我的尝试如下: Boolean empty() pre: none post: self -> IsEmpty() = true //should this be result -> IsEmpty() = true because it returns a boolean value? E peek() pre: self -> NotEmpty() = true post: result = ??? // I …
10 design  languages  object  ocl 

2
无需框架或库,如何使用node.js提供内容?
我正在尝试学习node.js并创建一个Web应用程序,尽管我尽力仅使用node.js来创建它,但我仍然很难找到描述该过程的资源和示例。无需使用其他框架或库。 具体来说,如何在不使用硬编码字符串变量的情况下提供HTML和CSS内容,而仅使用node.js动态提供HTML和CSS文件?
10 node.js 

2
为什么在创建原型时不鼓励使用构造函数?
快速背景:在JavaScript中,每种对象类型的构造函数都有一个prototype属性。的prototype是指一个对象,各构造对象的用途如在其原型链中的下一步骤的。当您希望一种类型可以是另一种类型固有的类型时,可以将prototype子类型的设置为父类型的新实例。 例如: var Parent = function() { /* constructor business */ } Parent.prototype.parentProp = "some parent property"; var Child = function() { /* constructor business */ } Child.prototype = /*** !! Some prototype object goes here !! ***/ 我的问题询问上面的代码中应在“ Some prototype object goes here”位置添加哪些代码。我的第一个本能是构造父对象的实例(即new Parent()),但在评论“关于将这样的对象原型复制到另一个对象的安全方法吗?”的评论中。,一位用户写道: 不,请勿new bar()用于原型对象! (...这是我在许多答案和评论中都看到的一种观点,但这是我目前手头唯一的例子。) 另一种选择是Object.create(Parent.prototype)用作Child.prototype。据我所知,这还会创建一个新Parent实例,但不会运行Parent构造函数。 有人可以解释为什么从父类型生成原型对象时应避免运行构造函数的原因吗?是否会出现一些重大的技术问题(也许具有多个继承级别)?还是这种模式会误用构造函数,从而与一些典型的最佳实践相冲突(例如,在创建原型时运行构造函数违反了某些关注点分离)?

5
为多种出口类型设计健壮的体系结构?
我正在为即将设计的功能寻找图案或体系结构指导。基本上,这是一个具有多个导出目标的导出功能,我正在寻找一种方法,使之足够通用,以便在插入新的导出目标时不需要进行很多核心更改。通过导出目​​标,我只是指的是不同类型的输出,无论是PDF,PowerPoint演示文稿,Word文档,RSS等。我都有一组基本数据,以JSON和XML表示。此数据用于构造图像(使用任何数量或导出类型(例如,PNG,JPG,GIF等),图形,文本表示形式,表格等。 我正在尝试找到一种将所有渲染和布局抽象为某种渲染或布局引擎的方法,该引擎可以处理其他导出目标的添加。任何有关如何解决此问题的帮助/建议/资源将不胜感激。提前致谢。 对于我要实现的目标的图形表示。

1
有必要学习haskell语言扩展以进行生产
Haskell核心语言非常简单。来自面向对象的背景,主要困难是适应纯功能范式。 在学习“基础” Haskell时,我一直将语言扩展视为CS人士的玩具或作为该语言的未来版本的实验(例如from future import ???python)。 但是,当我开始研究诸如Yesod之类的Web框架时,我发现许多源文件需要3到4个扩展名。有些看起来很简单(StringOverload)。其他的确实令人生畏(GADT,Type Famillies,Template Haskell)。他们的文档链接到研究论文,这对于那些希望“仅仅”学习一个新图书馆的人来说是很恐怖的。 是否有必要学习GHC语言扩展才能在Haskell中发挥作用?如果您要雇用Haskell开发人员进行生产应用程序,您会要求获得这些知识吗?
10 haskell 

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.