软件工程

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

6
每个字两位的幂是否“方便”?如果是,那是为什么呢?
我发现有几个消息来源声称二进制字中的2的幂(例如,每字节8位)是“好事”或“便利”。我找不到任何资料指出原因。 从什么是为什么字节是八位的历史?我们读了批准的答案: 二进制计算机激励设计人员将大小的幂乘以2。 好吧,为什么呢?在同一问题中,但在该问题的评论字段中,我发现: 开玩笑的最后一句话是吗?12位字节不方便,因为它不是2的幂。-robjb 再次,没有理由... 2的幂次幂,地址计算要简单得多,这要用小罐中的原始晶体管制作逻辑电路时很重要-Mike 由于字节是最小的可寻址单元,因此没有太大意义。尽管对此评论有很多支持。也许我错过了一些东西。 从维基百科: 8位的事实上的标准是2的方便乘方,允许1字节的值从0到255 这会很方便,因为...? 为了清楚起见,这大约是每个字节的位数(例如8或6,等等),而不是每个字节的值数(例如2 8或2 6等)。由于混乱,我还指出这与Word大小无关。 我对历史原因不太感兴趣。这些已经在其他地方得到了很好的解释(请参阅链接)。 关于SO的相关问题:https : //stackoverflow.com/questions/1606827/why-is-number-of-bits-always-a-power-of-two
11 hardware  byte  bit 

7
从C中学到了哪些高级语言无法学习的原理?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 3年前关闭。 我相信C是学习编程背后原理的好语言。对于那些与高级语言(如Ruby)“相去甚远”的低级语言,您打算学什么?
11 c  low-level 

3
如何设计REST API来处理非CRUD操作?
我正在尝试将一组基于SOAP的服务转换为RESTful API。 我首先通过分析操作名称来识别资源,然后获得了资源Subscription。 当我需要更新订阅的状态时,不能直接向POST服务器发送请求,因为我没有直接访问资源的权限,但是我需要调用一些RPC样式的操作来更新其属性。此外,仅且仅当我将订阅状态更改为“活动”时,才需要对外部服务的附加调用。 在这些情况下,处理基础操作的最佳实践是什么? 我想出的解决方案是使用查询参数,这样,如果我需要调用激活服务,则可以使用以下方法: POST /subscriptions/{subscriptionid}/?activate=true 考虑到我不能直接更新我的订阅对象字段,是否有最佳实践来处理这种转换? 更新1: 我可以在POST请求的正文中放入一些值,例如“ state”:“ active” 并检查我的服务中要触发的正确操作。

1
洋葱架构与3层架构
我看到洋葱架构仅比BL负责在DAL(或DAL的接口)上调用方法进行CRUD的3层架构有所益处。洋葱具有更好的关注点分离,可测试性,可维护性,并且更清洁。 那么,洋葱架构在各个方面是否确实更好,并且3层架构只是做事的一种旧方法,或者在某些情况下,我更喜欢使用3层架构,如果这样-哪个?

2
依靠传递依赖项还是显式声明它们更好吗?
我有一个这样的项目结构: My Project - Other Team's Project -Third Party Dependency My Project需要Other Team's Project到功能,都My Project和Other Team's Project要求Third Party Dependency运作。我们正在使用依赖项管理系统来管理这些。 从设计的角度来看,以My Project传递为基础更好Third Party Dependency吗?或者是更好地为双方My Project和Other Team's Project双方明确宣布,他们使用Third Party Dependency? 其他一些事情: 两个项目都必须具有的相同版本Third Party Dependency。 它不能保证,如果Other Team's Project被更新时My Project将进行测试,以确保没有中断,因为它们是由不同的团队进行管理。

4
在功能分支上工作时应提高代码质量吗
我真的很喜欢这篇文章,它使代码/营地处于比您发现的状态更好的状态 -在现实世界中,保持代码整洁似乎是一种实用的方法。 我也非常喜欢要素分支,它是一种独立开发要素的方法,这样,如果您不喜欢它,就可以轻松地将其合并等。 但是,如果我在功能分支上工作,并且发现一些难看的代码,是否应该解决它? 感觉有很多缺点需要解决: 当我将分支合并回去时,差异将变得混乱,变量重命名或函数提取会变得混乱 如果放弃了该功能,则必须选择清除提交(根据其附近的代码如何进行混乱的合并而改变可能有效或无效),重新执行或放弃它。 另一方面,如果我在文件中时不执行此操作,那么很明显,我会在合并分支的几天之内忘记执行此操作。 我被警告说这是基于观点的(我认为标题仅包含事实should),但是我觉得有一个答案(肯定有人使用这两种方法,所以他们必须有答案)。此外,有关的问题development methodologies都是话题,我认为它们需要一定的意见。

3
应该如何设计“员工”类?
我正在尝试创建一个用于管理员工的程序。但是,我无法弄清楚如何设计Employee课程。我的目标是能够使用Employee对象在数据库上创建和操作员工数据。 我想到的基本实现就是这样一个简单的实现: class Employee { // Employee data (let's say, dozens of properties). Employee() {} Create() {} Update() {} Delete() {} } 使用此实现,我遇到了几个问题。 该ID雇员是由数据库给出的,所以如果我使用描述的新雇员的对象,不会有ID存储然而,当代表现有员工的对象将有一个ID。因此,我有一个属性,它有时描述对象,有时却不描述(这可能表明我们违反了SRP?因为我们使用同一类来表示新员工和现有员工...)。 该Create方法应该在数据库上创建一个雇员,而Update和Delete应该作用于现有雇员(再次,SRP ...)。 “创建”方法应具有哪些参数?所有员工数据或Employee对象的数十个参数? 班级应该是一成不变的吗? 会如何Update工作?是否需要属性并更新数据库?还是需要两个对象-一个“旧”对象和一个“新”对象,并使用它们之间的差异更新数据库?(我认为答案与该类的可变性有关)。 建设者的责任是什么?它需要什么参数?它会使用id参数从数据库中获取员工数据并填充属性吗? 因此,如您所见,我的头有些乱,我非常困惑。您能否帮助我了解此类课程的外观? 请注意,我只是为了了解通常如何设计这种经常使用的类而不想发表意见。

4
作为程序员,我如何加快对业务规则的采用和理解?
我已经有一段时间了。我离那里最好的还很远。(当我独自坐在这个房间里时,我想知道自己是否是这里最好的。)但是,我开始了解自己的工具,并且我已经相信自己的推理和学习能力。 开始新工作时,我始终相信,只要我知道该语言,就可以学习该代码库。如果不是我所知道的语言或框架,我相信我可以掌握足以学习的概念(只需阅读文档)。这是我们作为程序员的技能技能的一部分,我为能够达到这一标准而感到自豪。 尽管如此,所有这些-我的主要弱点之一是为正在工作的客户快速学习和内部化业务规则-无论我是有薪雇员还是承包商。我对代码库很满意,但是特定业务的业务规则和流程似乎总是需要我一段时间才能完全理解。(例如,这可能是重写企业应用程序时的绊脚石。) 作为开发人员,快速有效地吸收业务规则和流程的最佳方法是什么?是否可能没有主题专家,或者仅仅具有与客户,公司或企业的多年经验?

2
git push force分支是错误的吗?
当我在功能分支上工作时,我倾向于在使用我的工作进行审查并将其集成到主分支之前,使用交互式rebase清理分支中的提交。 在开发功能期间,我想将我的中间工作推送到远程存储库作为备份措施。即,当我的硬盘崩溃时,我不想丢失整个功能分支。 但是,这导致这样一个事实,即git push --force在重新设置基准之后,我经常不得不对远程存储库执行“ a” 操作,这种操作通常不被接受。或如链接的github页面所说: 由于更改提交历史记录可能会使使用存储库的其他所有人感到困难,因此,当您已经将其推送到存储库时,对提交进行重新基准设置是不明智的做法。 是否有解决这一冲突的(通常被接受的)政策? 为什么这不是git的“重订黄金法则”那么重要吗? 我在这里的问题是要寻求一种解决方案,以解决要在远程存储库中备份您的工作和重新部署工作之间的冲突,而另一个问题试图否认存在冲突,并问为什么有些人认为冲突根本存在,并因此问为什么不强制变基是“必要的”?
11 git 


4
语言设计师将如何决定或证明某个特定功能正常工作?
我对语言设计感兴趣,总的来说,我可以轻松地推断出广为人知的功能(例如继承,多态性,委托,lambda,捕获,垃圾回收,异常,泛型,方差,反射等),它们在特定的语言,可能的实现方式,限制等。 在过去的几个月中,我开始阅读Rust的知识,Rust具有一个所有权系统,该系统通过强制对象生存期为静态可验证的来确保内存安全和确定性资源管理。从普通用户的角度来看,我几乎可以立即使用该系统。 但是,从语言设计师的角度来看,我花了一段时间才意识到为什么Rust中的事物确实是这样。我无法立即理解所有权系统受到某些限制的原因,直到我强迫自己提出一些案例,如果这些系统不具备这些方面,就会侵犯系统的完整性。 我的主要问题与Rust及其所有权没有任何关系-但如有需要,可以随时在评论/答案中使用它作为示例。 语言设计师在设计新功能时,会使用什么方法或过程来确定该功能正常工作? “新”是指它不是已经用现有语言测试过的东西(因此,大部分工作已由其他设计师完成)。“正常工作”是指该功能可以正确解决预期的问题,并且具有防弹功能。“合理地防弹”是指不能用该语言或该语言的特定子集(例如,没有“不安全”代码的子集)编写任何会破坏功能完整性的代码。 从某种意义上说,这是一个反复试验的过程,即您提出了一种简单形式的功能,然后尝试找到方法来对其加以违反,如果成功违反了它,则对其进行修补,然后重复进行?然后,当您无法想到任何其他可能的违规时,您希望什么都没有了,可以称之为一天? 还是有一种正式的方法(从字面上的数学意义上)实际证明您的功能有效,然后使用该证据从一开始就确信该功能正确(或基本上正确)? (我应该提一下,我具有工程学背景,而不是计算机科学。因此,如果我错过了CS人士显而易见的东西,请随时指出。)

3
为什么语言相对于块的显式标记为什么要缩进?
我正在学习Haskell,并且正在寻找一种自动缩进工具。我看上去并不多,并且了解到在Haskell中(与Python中一样),缩进表示一个块。结果,我猜想不可能创建一个像C系列其他语言一样强大的自动格式化工具,该工具使用显式标记,例如{}(大括号)或begin end关键字。 我不介意为了缩进而强制执行缩进的语言,但是我无法理解强制缩进和具有一些显式标记所带来的好处,以便自动化工具可以理解哪个块属于哪个块。 如果缩进标记的优先选择是使代码看起来更好,那么我仍然不了解其优势。假定制表符和空格在不同的编辑器和不同的字体(例如,单空格字体看起来更整齐)中以不同的方式表示,那么期望程序员像样地呈现代码是不可行的。可以考虑当前文本编辑器的工具将更适合于正确设置代码格式。 语言设计师为什么会选择缩进而不是显式的块标记?

2
具有两个相同优先级的二进制运算符的语言,左关联和右关联
是否有任何编程(或脚本)语言(或某些特定领域的语言)具有两个二进制运算符,opl并且opr具有相同的优先级(opl左关联和opr右关联)? (我找不到这样的示例,但是我正在尝试编写一些足以解析这种奇怪情况的解析器) 如何解析x opl y opr z或x opr y opl z形式的表达式?更一般地说,甚至还有更多的操作数?


1
从原点向外产生最大边数为3的边和顶点的算法
我正在为一个网站创建2D游戏,在该网站上,宇宙可以变得非常大(基本上是无限大)。最初,宇宙由6个与原点(0,0)等距离的恒星组成。我的任务是能够生成更多的恒星,这些恒星将具有相互连接的“路径”(边缘)。如何设计满足以下限制的算法: 恒星是向外随机产生的。(例如,新星的(x,y)坐标将在所有方向上从(0,0)缓慢向外移动,最好采用螺旋格式) 边缘不会交叉。 尽管应该有一些差异,但新星不应与其他星相距太远或太近。(例如必须有一个最小半径) 星星/点的倍数不得超过3。 鉴于所有这些都将存储在数据库中,该算法不会太昂贵。换句话说,我很想达到O(n)的复杂度(我不知道这是否可行)。 本质上,我要寻找的是一个螺旋状的星系,其中的恒星是图形上的点,恒星之间的行进由这些恒星之间的边缘描绘。 我需要解决的特定步骤是: 在尚未重合3的其他恒星附近随机产生一个点。 查找尚未有多重度3且不会产生边缘冲突的第一颗恒星。 如果星形距离最小x单位,则在两点之间创建一条边。 我尝试寻找解决方案,但是我的数学技能(以及关于图论的知识)需要大量工作。此外,将不胜感激与此问题有关的任何资源/链接。 这是我在想的一些伪代码,但是我不确定这是否还能奏效,并且我确定在经过10,000次等运算后,它的性能将无法令人满意。 newStar = randomly generated (x, y) within radius of last star from origin while(newStar has not been connected): for (star in the known universe): if(distance between newStar and star > x units): if(star has < 3 multiplicity): …

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.