软件工程

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

2
为什么Go对abs(0)有特殊情况
我在玩Go,发现数学包中的abs函数这个有趣的代码: http://golang.org/src/pkg/math/abs.go 14 func abs(x float64) float64 { 15 switch { 16 case x < 0: 17 return -x 18 case x == 0: 19 return 0 // return correctly abs(-0) 20 } 21 return x 22 } 为什么我们需要x == 0的特殊情况?如果删除第18和19行会怎样?
9 go 

4
为什么要避免形式继承?
我记得学习VB4并将一个按钮拖动到窗体上,双击该按钮,然后在刚刚被我神奇地祝福的事件处理程序中键入代码。来自QBASIC,我为“ VB”中的“ V”而感到激动,这是自切面包以来最好的视觉设计师。 当然,您可以通过编程方式完成所有这些操作,但是“ V”的魔力是如此吸引人,您只能忍不住拖动该按钮。我们被鼓励走那条路。 但是几年前,我开始学习C#和.net框架,并且对我以为我知道的一切刚刚消失的方式着迷。VB6中发生了很多神奇的事情,.net完全揭开了它的神秘面纱:以构造函数和InitializeComponents方法为例。在后者中,您将找到从工具箱中拖动的所有控件实例,已注册的所有事件以及在设计器中设置的属性。 很好...我想。只是,我感觉我不“拥有”正在发生的事情,我只能通过设计者修改的这段代码使我烦恼不已。每次将一个表示“确定”的按钮从一种形式复制到另一种形式(有时连同其兄弟“取消”)时,您实际上是在复制代码,这是一种罪过吗?教皇说,干,别重复。 除了客观存在的宗教和思想流派之外,我们是否不应该从基本表单中获取表单,并让“确定”按钮(及其所有朋友)都在基本表单上生活?像a这样的东西FormBase衍生出a DialogFormBase; 立即创建所有类...通过键入代码。根据实例的类的创建方式创建按钮(即,构造函数的enum参数确定要创建的按钮),将控件布置在拆分面板和流布局面板的内部,并按如下方式插入表单Content适用于主要内容面板。这不是ASP.net对母版页和内容占位符的作用吗?当我需要一个新的“母版页”时,我会派生一个表单,但是这个新的“母版页”仍然派生自基本表单类,因此整个应用程序的视觉效果是一致的。 对我来说,这是很多更多的代码重用比什么都重要,我曾经在的WinForms设计师做的,它甚至不是辛苦,代码不与200线方法混乱,我无法控制,我可以将评论放在我喜欢的位置,它们不会被设计师覆盖。我想这只是模式和体系结构的问题,这就是带我进入此链接的地方:能够共享通用功能的Windows窗体的最佳设计,我在那里发现,除了那里的答案外,我确切地表明了我的意思。这样做,但它建议对形式的继承,因为设计师的考虑。那是我不了解的部分。出于代码结构方面的考虑,尤其是在形式和控件继承方面,我认为没有理由要避免,除非这样做会破坏设计人员。 我们不能都只是懒惰,所以我缺少哪一部分?

5
提交拉取请求会构成接受贡献者许可协议吗?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 4年前关闭。 一些软件项目具有“ 贡献者许可协议”。例如,该协议可以将第三方贡献的版权分配给原始项目创建者。在github上提交Pull Request 是否会构成接受这样的协议?

4
Perl中的编程风格
我使用Java工作,因此基本上我在编码过程中使用OOP范例。我即将开始在Perl中工作,我想知道Perl开发人员遵循的范式是什么。在Wiki中,它提到它支持许多范例,但是由于它是一种脚本语言,因此我不确定我是否理解这一点。 所以我的问题是:是Perl中Java惯用语言中我熟悉的面向对象模式,还是我需要对设计风格进行重大更改才能编写有效的Perl? 注意:这不是批评Perl的问题。我实际上必须在Perl中工作,并且想了解我编程的当前方式将如何改变。

4
非确定性资源管理是抽象的泄漏吗?
据我所知,资源管理有两种普遍形式:确定性破坏和显式破坏。前者的示例是C ++析构函数和智能指针或Perl的DESTROY子例程,而后者的示例将是Ruby的块至管理资源范例或.NET的IDispose接口。 较新的语言似乎选择后者,这可能是使用非引用计数类型的垃圾收集系统的副作用。 我的问题是:鉴于智能指针或引用计数垃圾收集系统的析构函数(几乎是同一件事)允许隐式和透明的资源销毁,它比依赖于显式的非确定性类型的抽象性泄漏少吗?符号? 我将举一个具体的例子。如果您有一个超类的三个C ++子类,则其中一个实现可能不需要任何特定的销毁。也许它以另一种方式发挥了魔力。它不需要任何特殊的销毁是无关紧要的-所有子类仍然以相同的方式使用。 另一个示例使用Ruby块。两个子类需要释放资源,因此,即使其他特定子类可能不需要它,因为它们不需要特殊的销毁,所以超类会选择在构造函数中使用块的接口。 后者是否泄漏了资源破坏的实施细节,而前者却没有? 编辑:比方说,将Ruby与Perl进行比较可能更公平,因为其中一个具有确定性的销毁能力,而另一个则没有,但是它们都被垃圾回收了。

3
一个很好的C可变长度数组示例[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 这个问题在SO上引起了不小的反响,所以我决定在那里删除它,然后在这里尝试。如果您认为它也不适合此处,请至少对如何找到我所追求的示例提出建议... 您能举个例子吗,使用C99 VLA相对于当前的标准堆(使用C ++ RAII机制)提供了真正的优势? 我遵循的示例应: 与使用堆相比,可轻松实现(可能达到10%)的性能优势。 没有一个好的解决方法,它根本不需要整个数组。 实际受益于使用动态尺寸,而不是固定的最大尺寸。 在正常使用情况下,不太可能导致堆栈溢出。 足够强大,足以吸引需要性能的开发人员在C ++项目中包含C99源文件。 在上下文中添加了一些说明:我的意思是C99所指的VLA,但不包括在标准C ++中:int array[n]这里n是变量。在一个用例示例中,我胜过其他标准(C90,C ++ 11)提供的替代方案: int array[MAXSIZE]; // C stack array with compile time constant size int *array = calloc(n, sizeof int); // C heap array with manual free int *array = new int[n]; // …
9 c++  c  stack  heap 

3
有关方法参数类型,返回类型和属性类型的具体性的规则
前一段时间,我读到一种关于方法参数类型,返回类型和属性类型的具体性的“经验法则”,但我只是不记得了。 它说了一些有关使返回类型尽可能具体,而参数类型尽可能抽象的事情……反之亦然。 我不知道这实际上是一个好建议还是坏建议,因此,如果您对此有自己的想法,请发表评论。 干杯。


1
在Clojure中访问`ref`的历史记录
ref的文档显示了:max-history选项,并指出“ refs根据需要动态地累积历史记录,以处理读取需求。” 我可以看到REPL有历史记录,但是我看不到如何找到ref的先前值: user=> (def the-world (ref "hello" :min-history 10)) #'user/the-world user=> (do (dosync (ref-set the-world "better")) @the-world) "better" user=> (let [exclamator (fn [x] (str x "!"))] (dosync (alter the-world exclamator) (alter the-world exclamator) (alter the-world exclamator)) @the-world) "better!!!" user=> (ref-history-count the-world) 2 大概世界的值是“ hello”,“ better”和“ better !!!”。我如何访问该历史记录? 如果无法访问该历史记录,是否有一个数据类型保留其值的历史记录,以便以后查询?还是这就是为什么创建原子数据库的原因?
9 clojure  stm 

2
发现图周期-简单说明
可以请一些人帮我理解如何用外行术语在图中找到周期吗? 我读过其他问题,例如“ 这一个”以及一些Wikipedia页面,但是它们似乎很快就陷入了数学术语中。 我在Java中有一个图形模型,对节点进行建模以及在“入”和“出”边缘进行建模-该模型知道节点仅在一个方向上连接,这使我能够找到叶节点作为起点,我的计划是以便从每个叶节点的每个“步行”中返回图形,并保留我在路线上找到的所有其他节点的列表。如果我在任何时候都在列表中看到了东西,那我就会知道在图中找到了一个循环。但是,这感觉有点简单。 我确定这是一个已解决的问题,如果可以用简单的术语来解释,那就太好了。 -高手
9 graph 

2
如何结合“命令”和“复合”来模拟时间延迟?
作为一项学习练习(我不在学校,只是一个试图学习新东西的老家伙),我正在尝试编写一个包含传播延迟的逻辑门模拟。用户还应该能够将门组合在一起以创建更高级别的对象。 我想将设计模式应用于我的问题,但是我很难过。 我正在阅读Head First设计模式,并且我看到Command模式是一种通过延迟来模拟通过电路的电脉冲的好方法。我还看到Composite模式是模拟嵌套单元的好方法。我只是不知道如何混合两者。 换句话说,当我循环通过门时,我看到门“ x”应该开火。它具有15纳秒的延迟,因此我创建了一个距当前游戏时间15 ns的时间戳的命令。调度员在哪里?在晚餐的示例中,命令为“ Order”,女服务员和厨师分别发送命令并可以选择引入延迟。如果我有一个“综合”门,它也有自己的调度程序吗?我是否需要使用Singleton来管理队列? 我阅读了可以找到的内容,但仍然需要朝着正确的方向努力: /programming/2015549/using-command-design-pattern /programming/12016314/client-server-command-design-pattern-with-variable-delays /programming/10560892/composite-of-commands-design-pattern /programming/8874705/how-can-i-calculate-propagation-delay-through-series-of-combinational-circuits-u

3
为多个(内部)项目构建字符串翻译数据库
在我们公司,我们有一个现有的转换ms-sql表,该表存储这样的字符串: Id | Key | Language | Value 1 | hello-world | nl-BE | Hallo Wereld 2 | hello-world | en-GB | Hello World 系统中有3种语言,我希望将来会增长到大约10种 该表由多个非常不同的项目(大约60个项目,主要是网站/ Web应用程序和某些Web服务)读取,每个项目均打开与翻译数据库的数据库连接,并缓存翻译内容 前端开发人员的反馈是,我们的UIto输入或修改翻译的最大弊端是他们不知道哪个项目使用什么字符串。 他们有时会修改字符串,却不知道它们会破坏7个项目。 现在,他们只需要键入类似内容this.Translate("Hello World"),系统就会处理其余的工作。 我当然可以强迫他们采用类似的方法,this.Translate("Hello World","AwesomeApplication1")但是似乎在许多项目中都需要进行大量的重构。 您将如何提供此解决方案?作为开发人员,您将如何为翻译提供“项目名称”?您如何将其存储在数据库中? 重要说明:翻译的重用是集中式数据库的全部内容,因此,将翻译范围限定为一个项目 1|hello-world|nl-BE|Hallo Wereld|MyAwesomeApplicatoin1 5|hello-world|nl-BE|Hallo Wereld!|MyAwesomeApplicatoin2 并不是真正的通缉选项。 我更喜欢这样的东西: 1|hello-world|nl-BE|Hallo Wereld|MyAwesomeApplicatoin1,MyAwesomeApplicatoin2 或等同于仅将名称放在表中的外键。 更新 到目前为止,基于规范化数据库的建议,我提出了类似以下内容: //this allows me to …
9 c#  resources 

1
Rebol是一种功能编程语言吗?
我遇到了Rebol,我对此很纳闷。 我从这里遇到以下脚本: use [feed questions answers][ feed: load-xml/dom http://stackoverflow.com/feeds/tag/rebol questions: map-each entry feed/get-by-tag <entry> [ find/match entry/get <id> "http://stackoverflow.com/q/" ] answers: make block! length? questions foreach question questions [ question: load-xml/dom join http://stackoverflow.com/feeds/question/ question foreach entry next question/get-by-tag <entry> [append answers entry/tree] ] insert clear feed/find-element <entry> answers feed/flatten ] …

1
在格式字符串中使用“ {}”被认为是Pythonic吗?
我才知道你会写 '{}{}'.format(string_a, string_b) 代替 '{0}{1}'.format(string_a, string_b) 在Python中,即,当您希望事物按顺序逐一排列时,可以省略字符串格式参数的数字。 这被认为是Pythonic吗? 注意:“ Pythonic”是Python程序员中常用的术语,表示惯用的Python代码。在Python文化中,对于样式问题,尤其是对于像这样的非常具体的问题,人们倾向于达成明确的共识,因为该语言的明确设计理念是:“应该有一个-最好只有一个-显而易见的方式。” 这是从“ Python的禅宗”一书中引用的,这是一组格言,在定义什么是“ Pythonic”方面有很长的路要走,并且包含在Python的每个发行版中(在任何Python解释器命令行中,都import this可以看到它)。

6
如何对编码器进行单元测试?
我有这样的事情: public byte[] EncodeMyObject(MyObject obj) 我一直在这样的单元测试: byte[] expectedResults = new byte[3]{ 0x01, 0x02, 0xFF }; Assert.IsEqual(expectedResults, EncodeMyObject(myObject)); 编辑:我见过的两种建议是: 1)使用硬编码的期望值,如上面的示例。 2)使用解码器解码编码的字节数组并比较输入/输出对象。 我在方法1中看到的问题是它非常脆弱,并且需要很多硬编码值。 方法2的问题在于测试编码器取决于解码器是否正常工作。如果编码器/解码器在同一位置均被损坏,则测试可能会产生误报。 这些可能是测试此类方法的唯一方法。如果是这样,那很好。我在问这个问题,看看是否有针对这种测试的更好的策略。我无法透露我正在使用的特定编码器的内部。我通常问的是您将如何解决这类问题,我不认为内部问题很重要。假定给定的输入对象将始终产生相同的输出字节数组。

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.