软件工程

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

1
跳过列表如何工作?
对于家庭作业,我需要了解跳过列表的工作原理。 我已经编程了2年多了(我知道实际上并没有那么长),我什至从未听说过跳过列表。 我查看了所有可以找到的指南,但我仍然几乎不了解它们的工作原理。我什至在“代码审查”中搜索了一个示例实现,但只发现了一个审查。甚至还不是一个完整的实现。我查看了本课程提供的示例实现,这绝对是残酷的。在缺乏适当的方法和单字母变量名称之间,我不知道它是如何工作的。 跳过列表如何工作?要了解更高级的数据结构是否需要了解跳过列表?

1
为什么Haskell在没有单态性限制的情况下无法避免重复评估?
前几天,我刚学完了youahaskell,并且试图理解Haskell Wiki中描述的“单态限制” 。我想我了解MR如何防止重复评估,但是我看不出为什么用更直接的方法无法避免重复评估。 我想到的具体示例是Wiki使用的示例: f xs = (len,len) where len = genericLength xs 哪里genericLength是类型Num a => [b] -> a。 显然,genericLength xs只需计算一次即可求值(len,len),因为它是具有相同参数的相同函数。我们不需要f知道任何调用即可知道这一点。那么,为什么Haskell不能在不引入MR之类的规则的情况下进行此优化? 那个Wiki页面上的讨论告诉我,它与Num类型类而不是具体类型有关,但是即使这样,在编译时纯函数是否返回相同的值也不应该很明显- -并因此使用相同的Num具体类型-两次给相同的参数?

2
什么时候应该使用C#的隐式类型转换运算符?
在C#中,我们可以像这样重载隐式转换运算符(来自MSDN的示例): struct Digit { /* ... */ public static implicit operator byte(Digit d) // implicit digit to byte conversion operator { /* ... */ } } 因此,我们可以拥有一个类型,一个自定义值类型,将自己神奇地转换为另一种(不相关的)类型,从而使观众感到困惑(直到他们凝视到后台并看到隐式转换操作符为止)。 我不喜欢让任何阅读我的代码的人迷惑不解。我认为没有很多人这样做。 问题是,隐式类型转换运算符的用例是什么,它们不会使我的代码更难理解?
14 c#  operators 

6
如何处理比平均冲刺差50%的速度?
如果我正确理解Scrum,这就是我确定团队在下一个冲刺中可以从事的工作的方式: 我平均了过去几个冲刺的完成点数。 这个量是我们的平均速度。在下一个冲刺中,我们要讲很多故事。 这是一个平均数,因此,如果历史重演,则此冲刺是我们承担的故事点过多的可能性为50%,而我们承担的故事点过多的可能性为50%。 在50%的情况下,我们承担了太多的故事要点,我们可以: 无法完成冲刺。这意味着我们将有一半时间无法实现冲刺承诺。 额外工作以赶上。问题在于,棘轮只有一种方式。我们将完成冲刺,完成的故事点数将反映出这一点。由于我们总是会结束,所以随着时间的流逝,我们的平均水平将趋于上升,直到我们总是完成大量的故事点并熬夜。 我对平均速度和冲刺承诺的理解正确吗? 如果是这样,对于落后于平均水平的50%的冲刺,我们应该怎么做? 如果没有,我怎么了?

1
API密钥-输入内容或标题
目前正在研究API,只是想就应该在哪里传输API密钥的最佳位置收集意见。我知道这不应该放在URL中,这样就留下了请求标头或消息正文。 如果将其放在标头中,则可以提出一种可以在所有服务中使用的通用方法,但是我得到的规范希望它在正文中(例如,包含在JSON字符串中) POST正文中的序列化对象)。
14 api 

2
可选/也许类型在动态语言中有用吗?
Optional在静态类型的语言中以明显的方式很有用,但是我想知道它是否在动态语言中也有用。通常,没有编译器告诉您“嘿,您将其Optional<String>用作String”,因此您仍然必须在运行时发现错误。我有一个静态的打字背景,从我的角度看,我看不到Optional使用动态语言打字的好处。


2
DMA控制器如何工作?
摘自Andrew S. Tanenbaum(第5.1.4节,现代操作系统中的直接内存访问),Herbert Bos,2014年, 为了简化说明,我们假定CPU通过连接CPU,内存和I / O设备的单个系统总线访问所有设备和内存,如图5-4所示。 为了解释DMA的工作原理,让我们首先看一下不使用DMA时如何进行磁盘读取。 首先,磁盘控制器逐位从驱动器逐位顺序读取该块(一个或多个扇区),直到整个块都在控制器的内部缓冲区中为止。 接下来,它计算校验和以验证没有发生读取错误。然后,控制器引起中断。操作系统开始运行时,它可以通过执行循环从控制器缓冲区一次读取一个字节或一个字的磁盘块,每次迭代都从控制器设备寄存器中读取一个字节或一个字并将其存储在主存储器中。 问:在第二步中 数据不是从“控制器的缓冲区 ”传输到主存储器吗?为什么既说“ 来自控制器的缓冲区 ” 又说“ 来自控制器设备寄存器 ”? 在第二步中,控制器可以将数据从其缓冲区传输到主存储器,而不会中断cpu,也无需再次涉及OS吗? 使用DMA时,过程不同。 首先,CPU通过设置其寄存器来对DMA控制器进行编程,以使其知道在何处传输(图5-4中的步骤1)。 它还向磁盘控制器发出命令,告诉它将数据从磁盘读入其内部缓冲区并验证校验和。 当有效数据位于磁盘控制器的缓冲区中时,DMA可以开始。DMA控制器通过在总线上向磁盘控制器发出读取请求来启动传输(步骤2)。此读取请求看起来与其他任何读取请求一样,并且磁盘控制器不知道(或不在乎)它是来自CPU还是来自DMA控制器。通常,要写入的内存地址在总线的地址线上,因此,当磁盘控制器从其内部缓冲区中提取下一个字时,它便知道将其写入哪里。写入内存是另一个标准的总线周期(步骤3)。 写入完成后,磁盘控制器也会通过总线将确认信号发送到DMA控制器(步骤4)。然后,DMA控制器增加要使用的存储器地址,并减少字节数。如果字节计数仍大于0,则重复步骤2至4,直到计数达到0。 那时,DMA控制器中断CPU,以告知传输现在已完成。操作系统启动时,不必将磁盘块复制到内存;它已经在那里。 问:在第二步中,DMA控制器请求磁盘控制器将数据从磁盘控制器的缓冲区传输到主内存。第一步,CPU向磁盘控制器发出命令,告诉它将数据从磁盘读入其内部缓冲区。同时,当磁盘控制器完成将数据从磁盘传输到磁盘控制器的缓冲区时,CPU是否还可以告知磁盘控制器将数据从磁盘控制器的缓冲区传输到主内存,因此不需要DMA控制器告诉磁盘控制器将数据从磁盘控制器的缓冲区传输到主存储器?(我不明白为什么我们需要一个DMA控制器在磁盘和主内存之间进行数据传输,所以我想我错过了理解报价的重要内容)。 设备的设备控制器控制该设备并在该设备上执行操作。DMA控制器在什么设备上控制和执行操作? 谢谢!


2
我应该如何注释一个类在Java中是不可变的?
最近,我偶然发现了不可变对象的实用性,例如,如果将元素传递给构造函数并且类应该是不可变的,那么如果它们本身不是不可变的,则必须复制这些元素。 这需要对我的项目进行大量检查或了解,因为如果我有 public A(B foo) 而且B不是一成不变的,A我必须复制B。现在想象一下B似乎是不变的,但是它本身在构造函数中具有可变的类,依此类推。 如果类在Java中是不可变的,是否有记录的标准或最佳实践?看来@immutableJavadoc中没有关键字。 该@Immutable注解似乎有什么东西对汽车类生成完全不同的,而不是标准的Java的一部分。

3
我的值检查器函数需要同时返回布尔值和消息
我有一个值检查功能,类似于信用卡号检查功能,它以字符串形式传递,并且需要检查该值的格式正确。 如果格式正确,则需要返回true。 如果格式不正确,则需要返回false,并告诉我们该值出了什么问题。 问题是,实现此目标的最佳方法是什么? 以下是一些解决方案: 1.使用整数/枚举返回码表示含义: String[] returnCodeLookup = [ "Value contains wrong number of characters, should contain 10 characters", "Value should end with 1", "Value should be a multiple of 3" ] private int valueChecker(String value) { /*check value*/ return returnCode; } rc = checkValue(valueToBeChecked); if rc == 0 …

2
我应该在数据库中将电子邮件地址保留为纯文本格式吗?
每个人都很清楚(我希望),存储密码而至少不加盐/散列是一个糟糕的主意。 电子邮件呢?假设您保留了订阅电子邮件地址,如果您对其进行了正确的加密,则可能无法向用户发送电子邮件。另一方面,如果您不对其进行加密并且数据库被盗,则所有用户都可能面临潜在的垃圾邮件风险。 这个问题不是关于特定法律的问题(尽管可能会给出,但仍然取决于国家/地区),也不是关于加密数据库本身。

1
配对编程是否消除了极限编程(XP)项目中的代码审查需求?
在一个极端的编程项目中,程序员大部分时间都会进行配对编程。 由于这些对也轮换使用,也就是说,您将程序与不同的人配对,并且具有集体所有权感,因此经常对源代码进行检查和更新。 这样的话,是否需要代码审查?我的意思是,停止编程,实际上只是进行代码审查。

2
这是一个好模式吗:用一系列lambda代替长函数?
我最近遇到以下情况。 class A{ public: void calculate(T inputs); } 首先,A表示物理世界中的一个对象,这是不将类拆分的有力论据。现在,calculate()事实证明它是一个相当长且复杂的功能。我认为它有三种可能的结构: 写成一堵墙-优势-所有信息都集中在一个地方 private在类中编写实用程序函数,并在calculate主体中使用它们-缺点-类的其余部分不了解/不在意/不了解这些方法 编写calculate以下方式: void A::calculate(T inputs){ auto lambda1 = () [] {}; auto lambda2 = () [] {}; auto lambda3 = () [] {}; lambda1(inputs.first_logical_chunk); lambda2(inputs.second_logical_chunk); lambda3(inputs.third_logical_chunk); } 可以认为这是好事还是坏事?这种方法有什么问题吗?总而言之,当我再次面临同样的情况时,我是否应该将此视为一种好方法? 编辑: class A{ ... public: // Reconfiguration of the algorithm. void set_colour(double …
14 c++11  lambda 

3
是否有任何机制可使编程语言更稳定(兼容)以进行更改?
有大量的编程语言。他们中的一些人长大后变得非常受欢迎。人们越来越多地使用这种语言。此类语言的创建者(或创始组织/社区)可能会尝试实施更改以使语言更好。但是有时由于向后兼容性而很难进行一些更改,并且这种丑陋的东西已经在该语言中存在多年了,并为许多用户所使用。 在语言设计阶段是否有任何架构原则或步骤可以帮助使其更稳定,以使语言设计人员不会害怕破坏向后兼容性?

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.