软件工程

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

5
非连续数组性能好吗?
在C#中,当用户创建一个List<byte>并向其中添加字节时,它有可能用完空间并需要分配更多空间。它分配前一个数组的大小的两倍(或其他倍数),复制字节并丢弃对旧数组的引用。我知道该列表成倍增长,因为每次分配都很昂贵,这将其限制在O(log n)分配范围内,10每次仅添加额外的项就会导致O(n)分配。 但是,对于大型阵列,可能会浪费大量空间,可能几乎是阵列的一半。为了减少内存,我写了一个类似的类NonContiguousArrayList,List<byte>如果列表中的内存少于4MB,它将用作后备存储,然后它会NonContiguousArrayList随着大小的增加分配额外的4MB字节数组。 与List<byte>这些阵列不同,它们是非连续的,因此周围没有数据复制,只有额外的4M分配。查找项目时,将索引除以4M以获得包含该项目的数组的索引,然后对4M取模以获取数组内的索引。 您能指出这种方法的问题吗?这是我的清单: 不连续的数组没有缓存局部性,这会导致性能下降。但是,在4M的块大小下,似乎将有足够的位置进行良好的缓存。 访问一个项目不是那么简单,存在一个间接的附加级别。这会优化吗?会导致缓存问题吗? 由于达到4M限制后线性增长,因此您可以分配比平时更多的分配(例如,对于1GB内存,最多可以分配250个分配)。4M之后不会复制任何额外的内存,但是我不确定额外的分配是否比复制大块内存更昂贵。
12 c# 

2
我应该如何处理记录器故障?
在公司的一些应用程序中,我们使用自定义记录器。它相当健壮,尽管将来我们可能会用NLog之类的东西来代替它。记录器的任务之一是记录应用程序中遇到的任何异常。 我一直担心的一个问题是,记录器中的异常处理允许出现静默故障。也就是说,如果未针对给定的异常编写日志(由于记录器中的错误),那么我应该如何处理该异常并(以某种方式)将异常记录到记录器本身中? 假设WriteLog函数引发异常。我应该尝试多次调用该函数还是直到不引发异常之前?我是否应该尝试使用记录器编写引发的异常(这很可能会导致异常完全消失……)?除了第一次实现自定义记录器时,我很幸运没有遇到这种情况。另一方面,我目前无法知道记录器是否未能记录应用程序异常(由于其自身的异常)。 我已经尝试过在线和在一些SE网站上进行搜索,但是到目前为止,由于所有帖子都处理记录器中的错误(但不记录潜在的异常以及如何记录它们)或记录器外部的异常,到目前为止,这种方法是徒劳的。

4
为什么Prolog在命令式编程中不如SQL流行的历史先例?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 似乎编写声明式 SQL在命令式编程中很受欢迎。但是,编写声明式代码 似乎也Prolog可以节省很多复杂性,但这并不是很常见。 对于这种明显的优先于Prolog的SQL,是否有历史的先例? 如果原因是命令式语言缺乏本机支持,那么是否有可能回答为什么语言创建者最初对本机支持没有帮助Prolog呢? 提供一些具体示例: 示例1: 评估贷款申请可能只需要输入几行代码Prolog,就像SELECT/JOIN查询只需要输入几行代码一样SQL,但似乎好处不如SQL。 示例2 这是Prolog中的另一个示例问题和解决方案。以下约束逻辑程序代表约翰作为老师的历史的简化数据集: teaches(john, hardware, T) :- 1990 ≤ T, T < 1999. teaches(john, software, T) :- 1999 ≤ T, T < 2005. teaches(john, logic, T) :- 2005 ≤ T, T ≤ 2012. rank(john, instructor, T) :- 1990 ≤ T, …

5
可以想象教一台机器如何按照定义的规范进行编程吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 我的一个没有编程知识的朋友问我这个问题,我发现它很有趣。 我认为这是不可能的,因为这将需要真正先进的人工智能,该人工智能能够分析问题的文本,考虑解决方案并对其进行编程。对我而言,仅仅考虑一台能够编写简单计算器的机器就显得非常先进。 但是也许我错了,我想知道您对此有何看法,是否知道有关该主题的任何文章/研究,是否已经存在,或者是否有可能选择规格并获取机器可以对此“规范”进行自我编程?

1
是否有任何值得注意的C扩展名包括其行为与机器字长无关的整数类型
与其他一些语言相比,C的一个有趣特征是它的许多数据类型基于目标体系结构的字长,而不是用绝对术语指定。虽然这允许该语言用于在某些类型可能有困难的机器上编写代码,但是这使得设计将在不同体系结构上一致运行的代码变得非常困难。考虑以下代码: uint16_t ffff16 = 0xFFFF; int64_t who_knows = ffff16 * ffff16; 在int16位(许多小型微控制器仍然适用)的体系结构上,此代码将使用定义良好的行为将值分配为1。在int64位机器上,它将再次使用定义良好的行为分配值4294836225。在int32位机器上,它可能会分配-131071的值(我不知道这是实现定义的还是未定义的行为)。即使代码只使用名义上称为“固定大小”类型的内容,该标准也要求当今使用的两种不同类型的编译器将产生两种不同的结果,而当今许多流行的编译器将产生三分之一。 这个特定的示例有些人为的,因为我不希望在现实世界的代码中将两个16位值的乘积直接分配给一个64位值,但是它被选择作为一个简短的示例来展示整数的三种方式促销可能与固定大小的无符号类型进行交互。在现实世界中,有必要根据数学整数算术规则对无符号类型的数学进行运算;在其他情况下,有必要根据模数运算的规则进行无符号类型运算;而在某些实际情况下,实际情况并非如此。没关系。诸如校验和之类的许多现实世界代码都依赖于uint32_t算术包装mod2³²,并且能够执行任意uint16_t 算术和获得的结果至少被定义为准确的mod 65536(与触发未定义行为相反)。 尽管这种情况显然似乎是不希望的(并且随着64位处理成为许多用途的规范,这种情况将变得越来越多),但据我所观察到的C标准委员会更喜欢引入已在某些著名产品中使用的语言功能。环境,而不是“从头开始”发明它们。C语言是否有任何显着扩展,这些扩展允许代码不仅指定如何存储类型,而且还指定在涉及可能晋升的场景中其应如何表现?我至少可以看到编译器扩展解决此类问题的三种方式: 通过添加一条指令,该指令将指示编译器将某些“基本”整数类型强制为一定大小。 通过添加一条指令,该指令将指示编译器评估各种升级方案,就像计算机的类型具有特定的大小一样,而与目标体系结构上类型的实际大小无关。 通过允许声明具有特定特征的类型(例如,声明一个类型应表现为mod-65536环绕的代数环,而不管其底层字长如何,并且不应隐式转换为其他类型;将a加到a wrap32上int应产生a类型的结果(wrap32无论是否int大于16位),而将a wrap32直接添加到a wrap16应该是非法的(因为两个都不能转换为另一个)。 我自己的选择是第三个选择,因为它甚至可以使具有异常字长的机器也可以使用很多代码,这些代码希望变量像“二次幂”一样“自动换行”。编译器可能必须添加位屏蔽指令以使该类型具有适当的性能,但是如果代码需要包装mod 65536的类型,则最好让编译器在需要它的机器上生成此类屏蔽,而不是使源代码杂乱无章。或者在需要掩蔽的机器上根本无法使用此类代码。我很好奇,但是,是否有任何通用扩展可以通过上述任何一种方式,或者通过我没有想到的某种方式来实现可移植的行为。 为了澄清我在找什么,有几件事;最为显着地: 尽管可以通过多种方式来编写代码,以确保所需的语义(例如,定义宏以对特定大小的无符号操作数执行数学运算,以产生明确包装或不包装的结果),或至少防止不希望的情况语义(例如,有条件地定义一个类型wrap32_t是uint32_t在编译器,其中一个uint32_t也不会得到提升,而这一数字是更好地为需要的代码wrap32_t到一些机器上该类型将得到提升,而不是有它运行并产生虚假行为失败编译)如果有任何一种编写代码的方式对将来的语言扩展最有利,那么使用该方式将比设计自己的方法更好。 对于如何扩展语言以解决许多整数大小的问题,我有一些很扎实的想法,允许代码在具有不同字长的机器上产生相同的语义,但是在我花大量时间编写它们之前,我想知道已经朝这个方向做了什么努力。 绝不希望我鄙视C标准委员会或他们所做的工作;但是,我希望在几年后,有必要使代码在“自然”升级类型为32位以及64位的计算机上正确工作。我认为,对语言进行一些适度的扩展(比C99 nnd C14之间的许多其他更改更适度),不仅可以提供一种有效使用64位体系结构的简洁方法,而且在讨价还价中还可以促进与该标准历来向后弯腰以支持“不寻常字长”的机器(例如,使具有12位的机器char可以运行期望uint32_t包装mod2³²]。根据未来扩展的方向,我还希望可以定义宏,这些宏将使今天编写的代码可在默认整数类型表现为“预期”的当今编译器上使用,也可在未来整数使用的编译器上使用类型将默认具有不同的行为,但是在哪里可以提供所需的行为。

2
作为后端开发人员,我们应该学习软件测试吗?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 作为初级开发人员,我在一家为航空业开发软件的公司中工作。我们有一个测试团队,所以我没有学习测试软件的动力。我的朋友正在一家小型公司工作,担任后端开发人员。他们的团队没有任何特定的测试团队,他们自己进行测试。后端开发人员应该了解测试软件吗?
12 testing  backend 

5
为什么功能程序在编译成功与正确性之间有关联?
自从我第一次使用LINQ以来,我已经趋向于函数式编程已有4年了。最近,我写了一些纯函数式C#代码,并且第一手注意到我所读到的有关函数程序的内容-一旦编译,它们就趋于正确。 我试图指出为什么会这样,但是我没有成功。 一种猜测是,在应用OO主体时,您会拥有一个功能程序中不存在的“抽象层”,并且该抽象层使得在实现错误的情况下对象之间的契约可能正确。 有没有人考虑过这一点,并提出了函数式编程中编译成功与程序正确性之间相关性的根本抽象原因?

1
iOS / OSX开源项目的命名约定
并非总是如此,但在大多数情况下,您会发现iOS或Mac OS X开源项目,其名称以作者姓氏和名字的首字母开头。如果项目要由Nick Leblanc创作,则该项目将被读取为NLMyProject。 例子: 符文·马德森(Rune Madsen)的RMSwipeTableViewCell, Ezequiel Becerra的EBCardCollectionViewLayout, SDiPhoneVersion塞巴斯蒂安Dobrincu, Leo Natan的LNNotificationsUI。 那是哪里来的 是否有人首先以这种方式编写的,然后其他人都遵循? 即使在《苹果指南》中,我也找不到任何相关信息。那个成语写在任何地方吗?

3
什么是“解除代表权”?
只是在这里遇到了这个词: http://www.codemesh.io/codemesh2014/viktor-klang “我们将演示Flow API(提升的表示形式),以及将提升的表示形式转换为执行表示形式的可插入方式-Flow Materialization。” 谷歌搜索没有太大帮助。

3
在代码中生成Excel(xlsx)文件的良好设计模式是什么?
有关更多信息,请参见底部的我的更新。 有时,我有一些项目必须将某些数据输出为Excel文件(xlsx格式)。该过程通常是: 用户单击我的应用程序中的一些按钮 我的代码运行数据库查询并以某种方式处理结果 我的代码使用Excel com互操作库或某些第三方库(例如Aspose.Cells)生成* .xlsx文件 我可以轻松地找到有关如何在线执行此操作的代码示例,但是我正在寻找一种更强大的方法来执行此操作。我希望我的代码遵循一些设计原则,以确保我的代码可维护且易于理解。 这是我最初尝试生成xlsx文件的样子: var wb = new Workbook(); var ws = wb.Worksheets[0]; ws.Cells[0, 0].Value = "Header"; ws.Cells[1, 0].Value = "Row 1"; ws.Cells[2, 0].Value = "Row 2"; ws.Cells[3, 0].Value = "Row 3"; wb.Save(path); 优点:不多。它可以工作,所以很好。 缺点: 单元格引用是经过硬编码的,因此在我的代码中到处都是乱七八糟的数字。 如果不更新许多单元格引用,则很难添加或删除列和行。 我需要学习一些第三方库。一些库的使用方式与其他库一样,但是仍然存在问题。我有一个问题,com互操作库使用基于1的单元格引用,而Aspose.Cells使用基于0的单元格引用。 这是一种解决上面列出的缺点的解决方案。我想将数据表当作自己的对象,可以在不深入了解单元操作和不干扰其他单元格引用的情况下随意移动和更改数据。这是一些伪代码: var headers = new Block(new string[] …

4
将原始字节写入文件是否有危险?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 我正在解决Pearls编程中的一个问题-具体来说,是一个程序的实现,该程序对最多包含10,000,000个整数的文件进行排序(第1栏,问题3)。由于这本书没有指定数据应如何存储在文件中,因此我正在考虑将整数存储为原始字节(还有其他一些约束使原始字节成为不错的选择)。我以前从未在如此低的水平上工作过,所以我想知道是否有什么危险值得我注意。例如,当我将原始字节写入文件时,是否需要担心意外使用某种文件结束序列? 编辑: 我现在意识到我的问题有多广泛。我的意思确实是更具灾难性的问题,例如意外覆盖磁盘上的其他文件。抱歉,我本来不清楚。
12 low-level  byte 

1
Web开发的GIT工作流程
很久以前,我与之合作的Web开发人员小团队开始使用git进行Web开发。那时我们只是致力于直接登台或掌握,然后在两者之间频繁合并。总比没有好,但也很混乱。 不久之前,我们采用了gitflow工作流程。尽管它肯定比以前出现的混乱更好,但它似乎有些繁琐且过于释放/面向里程碑。我的开发人员经常要求我弄清楚它应该如何工作,什么应该合并而不应该合并。一般而言,它似乎不适合用于Web开发工作,在Web开发工作中,我们经常部署代码,而没有跟踪特定的发布里程碑。 根据朋友最近的建议,我已经开始关注GitHub Flow。在这里阅读Scott Chacon的帖子,可以很好地解决这一难题: 那么,为什么不在GitHub上使用git-flow?好吧,主要的问题是我们一直都在部署。git-flow过程主要围绕“发行版”设计。我们实际上没有“版本”,因为我们每天都会部署到生产中,通常一天要部署几次。 FWIW,我也在Atlassian的网站上看到了这种很好的工作流汇总:https ://www.atlassian.com/git/workflows#!workflow-feature-branch 但是,它们看起来都像是在一个小型团队中,对于Web开发而言是错误的选择,并且它们又针对主要的应用程序发布而不是频繁/每日发布。 这是关于SE的一个问题,要求比较git-flow和github-flow /programming/18188492/what-are-the-pros-and-cons-of-git-flow-vs-github -流 一般而言,这是一个很好的答案,但是正如我在meta.programmers.SE下方的评论中提到的那样,这似乎表明有关最佳通用工作流程实践的问题属于此处,我希望除了git-flow和github以外,还提供更多可能的答案-flow,而特定于Web开发。因此,我认为这里值得提出一个新问题。 这样一来,对于一个小型Web开发团队来说,您发现最佳/首选的基于git的工作流程是什么?是github-flow还是其他东西?

4
为什么Microsoft仍在Office产品中附带VBA,而不是直接集成.NET?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 我知道可以从您的VBA代码中调用.NET代码,但是为什么VBA继续存在?我能想到的唯一原因是遗产。 我只需要排序一个Scripting.Dictionary,所需的代码量就令人恐惧。 IDE看起来像Visual Studio2003。其中有许多小细节,使您发疯(就像更改行并由于某些编译错误而收到警告)。或者,如果您打开多个电子表格,则该电子表格会混入“ VBAProject”中,这确实令人困惑。 整个模块/类模块/表单的划分实际上并不是那么糟糕,但是我每次都会以直接在表单中编写逻辑,或者拥有一个可以处理所有事情的巨大模块来结束。 为什么我不能按Alt + F11并用C#编程?
12 .net  vba 

1
为什么Haskell函子在其目标类别中仅具有派生类型?
在Haskell中,Functor类型类函子的定义如下(例如,参见Haskell Wiki): class Functor (f :: * -> *) where fmap :: (a -> b) -> f a -> f b 据我了解(请纠正我,如果我错了),这样的仿函数只能作为目标类别使用类型构造一个类别构成,例如[],Maybe等等。另一方面,人们可能会想到有任何类别的函子作为函子的目标,例如所有Haskell类型的类别。例如,Int可以是函子的目标类别中的对象,而不仅仅是Maybe Intor [Int]。 限制Haskell函子的动机是什么?
12 haskell 

10
开源编程语言能否生存?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 一位朋友写了一种编程语言。它的语法让人联想到SGML。他为此编写了一个解释器和一个IDE。他和他的同事在内部将其用作服务器端语言。它也可以用来编写命令行工具。 他希望将其提供给公众,以期人们会购买使用许可证。他想保留自己表达语言实现的代码,因为其中包含相当多的知识产权。 我一直告诉他,封闭式编程语言的日子已经一去不复返了。我说:“请查看所有主要语言:绝大多数语言都是开源的。如果您希望公司以外的任何人都对自己构建的内容给予关注,那么您也将必须开源。” 我是在给他提供很好的建议吗,还是您需要付费使用专有语言的空间? 后来 丹问:“ ...您能否也请您解释一下如何封闭源语言?” 我说:“ @ Den,您说得很对。我想我的朋友想避免的情况是,Microsoft编写了类似Java的语言,将其称为J ++,然后就其Java风格与Sun展开了诉讼。 。如何保护语法和编程方法,以免被实施可能使您倒闭的公司所劫持?”

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.