软件工程

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


10
指针在C语言中保存的数据的“类型”是什么?
我知道指针保存地址。我知道,指针的类型基于它们指向的数据的“类型”而被“一般地”知道。但是,指针仍然是变量,它们所持有的地址必须具有数据“类型”。根据我的信息,地址为十六进制格式。但是,我仍然不知道该十六进制是什么“数据”类型。(请注意,我知道十六进制是什么,但是10CBA20例如,当您说这是一个字符串吗?整数吗?是什么?当我想访问该地址并对其进行操作..本身时,我需要知道其类型。这这就是为什么我问。)
30 c  pointers 

10
假设有一群马,我如何找到所有独角兽的平均角长?
上面的问题是我在遗留代码中遇到的一个常见问题的抽象示例,或更准确地说,是以前解决该问题的尝试所导致的问题。 我可以想到至少一种旨在解决此问题的.NET框架方法,例如该Enumerable.OfType<T>方法。但是,您最终最终在运行时询问对象的类型这一事实与我不对。 除了问每匹马:“你是独角兽吗?” 还想到以下方法: 尝试获取非独角兽角的长度时引发异常(暴露了不适用于每匹马的功能) 返回一个非独角兽号角长度的默认值或魔术值(需要在所有想要对一组全都是非独角兽的马进行角统计的代码中添加默认检查) 消除继承,并在马上创建一个单独的对象,该对象告诉您马是否为独角兽(这可能会将同一问题推下一层) 我觉得最好用“不回答”来回答。但是,您如何解决这个问题?如果取决于这个问题,您的决定的背景是什么? 对于这个问题是否仍然存在于功能代码中(或者也许仅存在于支持可变性的功能语言中),我也会感兴趣。 这被标记为以下问题的可能重复: 如何避免向下转换? 该问题的答案假设一个人拥有一个HornMeasurer,必须进行所有的号角测量。但这是对基于平等原则而形成的代码库的强加,即每个人都应该可以自由地测量马的角。 缺少a时HornMeasurer,可接受的答案的方法反映了上面列出的基于异常的方法。 关于马和独角兽都是马,还是独角兽是马的神奇亚种,评论中也有些困惑。两种可能性都应该考虑-也许一个比另一个更可取吗?

4
为什么.equals()在Java中的类中时,为什么.compareTo()在接口中?
我想知道为什么类中有类似方法的同时.compareTo()在Comparable接口.equals中Object。在我看来,为什么.compareTo()没有这样的方法似乎是武断的Object类中。 要使用.compareTo(),您可以实现Comparable接口并根据需要实现.compareTo()方法。对于该.equals()方法,您只需在类中重写该方法,因为所有类都从Object该类继承。 我的问题是,为什么.compareTo()在您实现的接口中而不是在像这样的类中实现这样的方法Object?同样,为什么要.equals()在类中Object而不是在某些接口中实现该方法?

6
Java中的动态代码评估-聪明还是草率?
我正在尝试为我的应用程序在Java中创建一个灵活的ACL框架。 许多ACL框架都建立在规则白名单上,其中规则的形式为owner:action:resource。例如, “ JOHN可以查看资源FOOBAR-1” “ MARY可以查看资源FOOBAR-1” “ MARY可以编辑资源FOOBAR-1” 这很有吸引力,因为规则可以轻松地序列化/持久化到数据库。但是我的应用程序具有复杂的业务逻辑。例如, “部门1中具有5年以上资历的所有用户都可以查看资源FOOBAR-1,否则未经授权” “部门2中的所有用户,如果日期是2016年3月15日之后,则可以查看资源FOOBAR-2,否则未经授权” 乍一想,设计一个可以处理无限复杂规则的数据库模式将是一场噩梦。因此,似乎我需要将它们“烘焙”到编译的应用程序中,为每个用户评估它们,然后根据评估结果生成owner:action:resource规则。 我想避免将逻辑烘焙到已编译的应用程序中。 因此,我正在考虑以谓词:action:resource的形式表示规则,其中谓词是确定是否允许用户的布尔表达式。该谓词将是Java的Rhino引擎可以评估的JavaScript表达式的字符串。例如, return user.getDept() == 1 && user.seniority > 5; 这样,可以轻松地将谓词保存到数据库中。 这很聪明吗?这是草率的吗?这是花哨的吗?这是过度设计的吗?这样安全吗(显然,Java可以将Rhino引擎沙箱化)。

3
适用于多个活动版本的Git工作流程,同时处理修补程序
我正在尝试选择最适合我们产品的Git工作流程。以下是参数: 我们一年会发布一些主要版本,最多可以说10个 我们同时有多个版本的产品处于活动状态(有些人使用v10.1,有些人使用v11.2,依此类推) 我们需要能够同时处理多个发行版(因此我们可以处理v12.1,但是当我们到达发行版末尾时,我们将同时开始处理v12.2)。 发现严重错误后,我们需要能够修复版本 到目前为止,这是我认为它可以工作的方式: 使用单个远程仓库 从master创建分支12.1 根据12.1创建要素分支,提交并合并回12.1,然后按入 一旦我们需要开始开发将来的版本,请基于12.1创建一个新的分支12.2。 从那时起,在使用12.1的功能时,从12.1创建分支,提交更改,然后合并到12.1和12.2中, 如果使用12.2的功能,请从12.2创建分支,提交更改,然后仅合并到12.2, 版本12.1完成后,将其合并到master和tag master分支中,并带有12.1 如果需要修补程序,请从需要该修补程序的最早的发行分支创建修补程序分支,提交更改,然后合并回该发行版和可能受影响的将来发行版的所有发行分支;如果最新的稳定版本分支受到影响,请将其合并到master。 我有一些担忧: 我不确定将修补程序从旧分支合并到新分支是否会很顺利,尤其是在存在许多重叠更改的情况下;在看起来有冲突的情况下,在每个分支中手动进行热修复会更聪明吗? 我看到的工作流模型似乎并没有使发行分支保持活跃,一旦完成,发行就被合并到主版本中,被标记并删除了。我的问题是,如果我拥有的只是master中的标签,那么我就不怎么管理发行版的状态,似乎更容易在分支中进行修补,然后有了发行版,我可以随时返回具有最新的修补程序(甚至可以在发行版中标记该修补程序)。不知道有什么办法可以使我回到master内,并以某种方式获取已应用修补程序的发行版副本并更新该标签。 考虑到我已经指定的要求,我对我可能忽略的事情或完成事情的更好方法表示了赞赏。

4
为什么在C ++中不隐式转换`void *`?
在C语言中,不需要将a强制转换void *为任何其他指针类型,因此始终可以安全地对其进行提升。但是,在C ++中并非如此。例如, int *a = malloc(sizeof(int)); 在C语言中有效,但在C ++中无效。(请注意:我知道您不应该malloc在C ++中使用,或者在这种情况下new,应该使用智能指针和/或STL;纯粹出于好奇而问)。为什么C ++标准不允许这种隐式转换,而C标准呢?

5
如果您仍然需要检查条件,则分支预测如何工作?
我正在从https://stackoverflow.com/q/11227809/555690阅读有关分支预测的流行答案,这使我感到困惑: 如果您猜对了,它将继续进行。 如果您猜错了,机长会停下来,后退并大喊大叫,以拨动开关。然后,它可以沿着其他路径重新启动。 如果您每次都猜对了,火车将永远不会停止。 如果您经常猜错,火车将花费大量时间停止,备份和重新启动。 但这不是我所能得到的:要知道您的猜测是对还是错,无论如何都必须进行条件检查。那么,如果您仍在进行相同的条件检查,那么分支预测甚至如何工作? 我要说的是,分支预测是否与完全没有分支预测完全相同,因为无论如何您都在执行相同的条件检查?(显然我错了,但我不明白)

7
即使我知道该方法无法返回错误的输入,我也应该验证方法调用的返回值吗?
我想知道我是否应该通过验证方法调用的返回值是否符合我的期望来进行防御,即使我知道我正在调用的方法将满足此类期望也是如此。 给予 User getUser(Int id) { User temp = new User(id); temp.setName("John"); return temp; } 我应该做吗 void myMethod() { User user = getUser(1234); System.out.println(user.getName()); } 要么 void myMethod() { User user = getUser(1234); // Validating Preconditions.checkNotNull(user, "User can not be null."); Preconditions.checkNotNull(user.getName(), "User's name can not be null."); System.out.println(user.getName()); } …

4
当难以或无法获得硬件设置来重现错误时,如何有效地排除故障或测试新代码?
我在一家中型公司(拥有150名员工,约有10名规模的工程团队)工作,我的大多数项目都涉及与实验室设备(示波器,光谱分析仪等)的接口,以实现半自动化测试应用。我遇到了几种不同的情况,由于我不再或从来没有可用的硬件设置,因此无法有效地排除故障或测试新代码。 示例1:使用台式型传感器独立运行10-20个“老化”过程的设置-我能够获得一个这样的传感器进行测试,并且偶尔可以花一秒钟来模拟与之连接的所有方面多个设备(搜索,连接,流式传输等)。 最终出现了一个错误(最终最终归结于设备固件和驱动程序中),仅用一个单元就很难准确地再现该错误,但是当同时使用10-20个此类设备时,该错误接近“显示停止器”的水平。这仍未解决,仍在进行中。 示例2:需要昂贵的光谱分析仪作为其核心组件的测试。该设备相当老旧,是一家制造商遗留下来的,后者被一家较大的公司收购,并且基本上已经解散,并且它的唯一文档是冗长的(且内容不丰富的)文档,翻译起来似乎不好。在最初的开发过程中,我能够将设备保持在桌面上,但现在在24/7多周的测试中,无论是在物理上还是在计划中都将其捆绑在一起。 当错误显示出与设备相关或无关的错误时,我经常需要麻烦测试应用程序外部的代码并将其装入,或者盲目编写代码并尝试在两次运行之间的某个测试时间内进行压缩,程序逻辑要求OSA和其余测试硬件都安装到位。 我想我的问题是我应该如何处理?我可能会花一些时间来开发设备模拟器,但是弄清楚开发估算值将使它比大多数人想像的更多。它也可能无法准确地重现所有问题,而且很少有人看到同一设备在这里两次使用过。我可以在单元测试方面变得更好...等等...我也可以大声地谈论这个问题,并让其他人理解将需要暂时的延迟,这不只是研究和开发的头痛,而是通常被认为是在开玩笑当投入制造业时。

9
是否只有在动态类型化语言(如Python)中才有可能的设计模式?
我读过一个相关的问题,在动态语言(如Python)中是否有不需要的设计模式?并记得Wikiquote.org上的这句话 动态类型的妙处在于它使您可以表达任何可计算的内容。而类型系统则不是-类型系统通常是可决定的,它们将您限制为一个子集。支持静态类型系统的人说:“很好,足够好;您要编写的所有有趣程序都将作为类型使用。” 但这很荒谬—一旦有了类型系统,您甚至都不知道那里有什么有趣的程序。 ---软件工程电台第140集:Gilad Bracha的Newspeak和可插拔类型 我想知道,是否有有用的设计模式或策略使用引号的表述“不能作为类型工作”?

14
列表可用时,是否有理由使用数组?[关闭]
List<T>在C#中,似乎可以完成数组可以做的所有事情,并且还可以完成更多工作,并且在内存和性能上也与数组一样高效。 那么,为什么我要使用数组呢? 我显然不是在问API或其他外部约束(即Main函数)需要我使用数组的情况……我只是在问关于在自己的代码中创建新数据结构的问题。
30 c#  data-types 

6
“云计算”与“客户端-服务器”有何区别?
今天,他在观看一家新的“云计算”公司首席执行官在金融电视节目中描述他的公司时说,“云计算优于老式的客户端-服务器计算”。 现在我很困惑。有人可以解释一下“云计算”相对于客户端-服务器的含义吗? 据我了解,云计算更多是一种网络服务模型,因此我不拥有或维护物理硬件。“云”是所有后端的东西。但是我仍然可能有一个与该“云”环境通信的应用程序。而且,如果我运行一个网站时,会呈现一个用户填写的表单,按页面上的一个按钮,然后返回由Web服务器生成的一些报告,这与“云”计算是一样的吗?并且您是否不将我的Web浏览器视为“客户端”? 请注意,我的问题是针对“客户端-服务器”的“云计算”概念。 抱歉,如果这不是该网站的适当问题;这是Stack世界中最接近的一个,这是我第一次来。我是个老手,从70年代后期的大型机时代开始编程。


11
哪些因素应该影响我如何确定何时与朋友一起放弃一个小项目?[关闭]
最近我发现自己处在困境中。现在已经与一个编程伙伴一起玩了将近8个月的游戏。我们都是从去年8月左右开始学习编程的新手,他是CS的二年级学生,我是一名IT贸易技术支持人员,并且是一位自学成才的程序员,拥有大量的书籍和在线订阅。 我一直看到的问题是,当我们写出一段代码时,它常常会被黑在一起,会有很多失败,如果这对我们中的一个人来说是一个全新的概念,那就是天真的解决方案。很好,我们正在学习,我希望我们的两个代码在第一遍或第二遍都被一起破解。当涉及到实际修复和重构那些被黑在一起的行为时,就会出现问题。 我的伴侣将坚持自己刚凑齐的行为,公然拒绝看到任何错误,因为它开始起作用。即使从结构上声称接近完美,即使它具有注释以及适当命名的方法和字段,我什至都无法尝试使用。无论我多么努力,我都无法让他看到明显的明显缺陷,这些缺陷将阻止行为的任何进一步更改或扩展,而又不会完全破坏行为,而与行为如此紧密耦合的所有事物也可能属于同一类。被黑客入侵的解决方案将永远保持被黑客入侵,深思熟虑的设计会像最初构思和测试时那样保持原样。 我花了很多时间来照顾新代码,就像我自己编写代码一样,我不知道该怎么做。我的伴侣今晚输了它,并明确表示,无论是什么,基准,常规做法,无可辩驳的证明,他的代码都将保持其最初的用法。即使已经写了整本关于您为什么要避免做某事的书,他也会拒绝承认其有效性,声称这只是别人的意见。 我对我们的项目有既得利益,但是我不确定是否可以继续与我的合作伙伴一起工作。我似乎有三个选择。 不再关心编译后的代码库功能,而只是尝试维护和解析几乎没有发展的行为。希望一旦事情开始严重破裂,他将看到并尝试做更多的事情,而不是仅仅对根本存在缺陷的设计施加创可贴。 继续对十年前其他能力更强的人提出的问题进行无休止的争论。 停止对该项目进行编程,放弃我的代码将近10,000行,并花费大量的时间进行设计工作,然后尝试自己寻找一个新项目。 我可以采取哪种方法来确定是否值得与这个人继续进行此项目?还是哪些因素会影响我的决定?我们已经编写了很多代码,除非有必要,否则我不想放弃。

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.