软件工程

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

9
我可以安全地忽略网络中的字节顺序吗?
我正在开发服务器-客户端应用程序,其中客户端将在Windows上运行,服务器可能在Linux上运行。也许以后再将客户端移植到Mac和Linux,但还没有。 如今,所有家用计算机都在低端字节序上运行。我用Google搜索了一会儿,但是我真的找不到运行在big-endian上的设备列表。据我所知,有些摩托罗拉芯片仍使用大端字节序,也许还有一些手机(我不打算将应用程序移植到智能手机上,所以这对我来说无关紧要)。那么,为什么我会重新安排每一个整数,每次短,每一个浮动的字节双,等等,对阅读和写作的时候我已经知道,关于小端两种,服务器和客户端运行? 那只是不必要的工作。因此,我的问题是:我可以安全地忽略字节序,而只发送低字节序数据吗?缺点是什么?

2
使用where条件vs Continue保护子句过滤foreach循环
我已经看到一些程序员使用此: foreach (var item in items) { if (item.Field != null) continue; if (item.State != ItemStates.Deleted) continue; // code } 而不是我通常使用的位置: foreach (var item in items.Where(i => i.Field != null && i.State != ItemStates.Deleted)) { // code } 我什至看到了两者的结合。我真的很喜欢“继续”的可读性,尤其是在更复杂的条件下。性能上甚至有差异吗?通过数据库查询,我假设会有。常规列表呢?

3
如何诊断异步/等待死锁?
我正在使用大量使用异步/等待的新代码库。我团队中的大多数人对于异步/等待也是相当陌生的。我们通常倾向于遵循Microsoft指定的最佳实践,但是通常需要我们的上下文来传递异步调用并使用不支持的库ConfigureAwait(false)。 结合所有这些内容,我们每周都会遇到文章中描述的异步死锁。它们不会在单元测试期间显示,因为我们的模拟数据源(通常通过Task.FromResult)不足以触发死锁。因此,在运行时或集成测试期间,某些服务调用只会吃到午餐,再也不会返回。那会杀死服务器,并且通常使事情变得一团糟。 问题在于,要跟踪错误的出处(通常只是一直不完全同步),通常涉及手动代码检查,这很耗时且无法自动化。 诊断死锁的更好方法是什么?
24 c#  debugging  async 

9
依赖注入:我应该使用框架吗?
我最近在一个Python项目中工作,我们在其中进行了大量依赖注入(因为必须使该应用程序可测试),但是我们没有使用任何框架。有时手动连接所有依赖项可能有点乏味,但总体来说效果很好。 当必须在多个位置创建对象时,我们只需一个函数(有时是该对象的类方法)即可创建生产实例。每当我们需要该对象时,都会调用此函数。 在测试中,我们做同样的事情:如果多次需要创建对象的“测试版本”(即由模拟对象支持的真实实例),我们就有一个函数来创建此“测试版本”类,用于测试。 就像我说的那样,总体来说效果很好。 我现在正在进入一个新的Java项目,并且我们正在决定是使用DI框架还是手动进行DI(例如上一个项目)。 请说明使用DI框架的工作方式会有所不同,以及以什么方式比手动“原始”依赖项注入更好或更坏。 编辑:我也想补充一个问题:您是否亲眼目睹了没有框架的手动执行DI的任何“专业级”项目?

6
迭代器模式-为什么不公开内部表示很重要?
我正在阅读C#设计模式要点。我目前正在阅读有关迭代器模式的信息。 我完全了解如何实现,但不了解重要性或看不到用例。书中给出了一个示例,其中有人需要获取对象列表。他们可以通过公开公共财产(例如IList<T>或)来做到这一点Array。 这本书写道 问题是这两个类的内部表示都暴露给外部项目。 内部代表什么?事实是array或IList<T>?我真的不明白为什么这对消费者(程序员称呼这)是一件坏事…… 然后,这本书说这种模式通过公开其GetEnumerator功能而起作用,因此我们可以GetEnumerator()以此方式调用和公开“列表”。 我认为这种模式在某些情况下(与所有模式一样)都有位置,但是我看不到何时何地。

8
在代码审查期间编写测试是否有益?
我的一个同事提出了一个我发现很有趣的想法。 假设我们不做TDD,那么由进行审核的人员在代码审阅期间编写测试是否有益? 对于这个问题,假定这是一个纯粹的学术项目,因此没有生命危险。而且该团队是4个人。每个人都知道该语言,并且熟悉所使用的所有工具/库/框架,并且可以编写测试。因此,基本上不是高级全职首席忍者工程师,而是体面的编码人员的人。 我发现的优点: 鼓励在审阅期间对代码有更深入的了解,以编写有意义的测试。 然后,您可以添加由正在测试的代码的作者进行的那些测试的代码审查。 我发现的缺点: 代码编写和测试之间的反馈循环不断增长。 编辑:我知道它不能在“正常”的Web应用程序上正常工作。我想到的是一个极端的案例,在该案例中,您需要实施复杂,科学的算法,这些算法都需要注意细节。让我们假设实现自己的图形库,NLP等。我想知道我们正在编写的代码是否与数据库隔离,并且这样很难理解却不会增加控制级别,而另一个需要了解源代码的人代码并进行有意义的测试,从而使整个过程不太容易受到那些不太明显的bug的影响,这些bug不会使应用程序崩溃,但最终会使您的结果混乱?

5
我对显式强制转换运算符的使用是否合理?
我有一个大对象: class BigObject{ public int Id {get;set;} public string FieldA {get;set;} // ... public string FieldZ {get;set;} } 还有一个专门的,类似于DTO的对象: class SmallObject{ public int Id {get;set;} public EnumType Type {get;set;} public string FieldC {get;set;} public string FieldN {get;set;} } 我个人发现了将BigObject显式转换为SmallObject的概念-知道这是一种单向丢失数据的操作-非常直观且易读: var small = (SmallObject) bigOne; passSmallObjectToSomeone(small); 它使用显式运算符实现: public static explicit operator …

2
合并具有最少比较数的两个排序数组的算法
给定两个大小为n和m的类型为T的排序数组a,b。我正在寻找一种将两个数组合并为一个新数组(最大大小为n + m)的算法。 如果比较便宜的话,这很简单。只需从具有最低第一个元素的数组中取出,直到完全遍历一个或两个数组,然后添加其余元素即可。像这样的东西/programming/5958169/how-to-merge-two-sorted-arrays-into-a-sorted-array 但是,当比较两个元素时,情况的改变要比将元素从源数组复制到目标数组要贵得多。例如,您可能具有大的任意精度整数或字符串组成的数组,其中比较可能会非常昂贵。只需假设创建数组和复制元素是免费的,而唯一花​​费的就是比较元素。 在这种情况下,您希望使用最少数量的元素比较合并两个数组。这里有一些示例,您应该可以比简单的合并算法做得更好: a = [1,2,3,4, ... 1000] b = [1001,1002,1003,1004, ... 2000] 要么 a = [1,2,3,4, ... 1000] b = [0,100,200, ... 1000] 在某些情况下,简单合并算法将是最佳选择,例如 a = [1,3,5,7,9,....,999] b = [2,4,6,8,10,....,1000] 因此,理想情况下,算法应该适当地降级并在阵列交错或至少不会明显恶化的情况下执行最多n + m-1个比较。 对于大小差异较大的列表,应该做得很好的一件事是使用二进制搜索将较小数组的元素插入较大数组。但是,如果两个列表的大小相同且交织在一起,则不会优雅地降低性能。 元素唯一可用的是(总计)排序功能,因此任何使比较便宜的方案都是不可能的。 有任何想法吗? 我在Scala中提出了这一点。我认为比较次数是最佳的,但是我无法证明这一点。至少它比我在文献中发现的要简单得多。 而且自原始帖子以来,我写了一篇有关其工作原理的博客文章。

6
怎么称呼不是RESTful的HTTP API?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 您如何称呼基于HTTP的API,该API使用URI命名资源,并使用HTTP动词(PUT,POST,DELETE,GET ...)来操纵这些资源? 根据Roy Fielding的抱怨,它不是REST,因为没有超媒体。 在我的团队内部,每个人都将其称为“ REST API”。我称其为“类似REST”,但它不是描述性的,其含义还很模糊。我对此非常困惑,因为关于REST存在巨大分歧。我不想参加火焰大战,只是使用正确的用语。
24 terminology  rest  api  http 

3
日历/计划算法
我面临一个不确定的方法。我必须为员工生成日历,每个员工都有特定的工作限制(有些是个人的,有些是普通的) 我正在使用的是: 我有医生 每个医生每周必须工作5天。 每个医生每周必须工作1晚 与其他医生相比,每位医生必须工作等量的夜晚(或尽可能接近) 每个医生在周四晚上和周日晚上的工作量必须与其他医生相同(或尽可能接近) 有些医生不能在某些白天/夜晚工作(由用户输入) 一些医生想在某些白天/夜晚工作(由用户输入) 一些医生希望某些天/夜不工作(由用户输入) 有问题的用户是处理日历的人,我正在尝试构建一个解决方案,该解决方案将自动生成一个遵循所有约束的日历。解决的方法是对每个医生进行大设置输入“添加医生”和“添加约束”,然后输入“生成日历”按钮。对于用户而言,这确实是基本的。 我的问题 : 我不确定如何生成实际计划,我一直在阅读有关神经网络,遗传算法等的信息,它们似乎都是正确的解决方案,但实际上并非如此。 当我查看GA时,要让他们找到具有给定总体的解决方案(我的问题),但是起始总体必须已经服从给定的一组约束,然后可以对其进行优化。在那种情况下,我的起始人口已经是解决方案。我不需要对其进行“优化”。没关系,一个人连续工作3个星期一晚上,只要实际上是正确的,而其他人也工作相同的数量,就意味着其他人也将在某个时间点工作3个星期一晚上,这很好。这让我觉得GA的功能对我来说太“先进”了,因为我的问题已经从GA的起点解决了。 但是话又说回来,GA真的真的像是为此而生的,所以我可能无法正确理解它? 无论如何,因为我从未使用过GA(或神经网络,或任何种类的东西),所以我想确保在从事像这样的学习过程之前,我会选择正确的方法。 我的问题 : 对于像我这样的问题,您认为什么是好的方法/算法/技术?加油站?神经网络?还有其他完全不同的东西吗? 我全神贯注,并在需要时提供更多详细信息,但我想我已经很清楚了:)

5
在哪种情况下,'uint'和'short'数据类型比标准int(32)更合适?
我了解它们可以代表的能力和价值观的差异,但似乎人们总是在使用Int32,无论它是否合适。似乎没有人使用无符号版本(uint),尽管很多时候它更适合使用,因为它描述的值不能为负(也许代表数据库记录的ID)。同样,似乎没有人使用short/Int16该值所需的容量。 客观地说,在那里的情况下最好是使用uint或short/Int16如果是这样,这是他们?
24 c# 

4
系统地选择编程语言
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 我正在寻找一种选择语言的方法。我不是在征求有关语言的意见。我的任务是将我们商店的当前语言与其他可用语言进行比较。我们是一家网站开发商店。 我们的CEO希望获得一份关于所有可用的基于Web的语言的完整白皮书,这些语言是它们的派生语言(例如,jsp来自Java,而Java来自c / c ++)。我还需要创建一个矩阵,其中包含特定语言的所有关键因素以及该特定语言的不足之处。语言是受平台限制的吗,是为功能编程,过程还是面向对象设计的,还是可以与任何编程范例一起使用? 我还需要掌握较少技术性的信息,例如给定语言的人才库的规模以及该人才库中位数的薪水。市场将如何看待我们的选择? 我们开始寻找一位顾问来帮助我们理解所有这些事情,但是我们发现大多数顾问都来自开发背景,而且通常答案似乎是“ xxx是最好的语言,因为它是我所用的语言。在过去n年中使用最多,并且从未让我失望。您可以在前端添加yyy并使用zzz库” 我对这项任务感到不知所措,并且鉴于我们的首席执行官正在寻找的东西,我觉得最好的做法是在学术界寻找并雇用没有实际开发经验的教授来“教”我们关于所有可能的语言。 还有其他人必须进行此练习吗?如果可以的话,您可以分享过去用于该过程的步骤和/或方法吗?

3
用于物品运输的3d包装算法
我收到了一个建立运输估计量的任务,该估计量建议在尽可能少的盒子上最好地容纳商品: 有一组已知的矩形框大小 盒子里有很多随意的矩形物品要包装 最好使用的盒子越少越好。因为运送两个盒子1x1x1比一个盒子1x2x1贵得多。这应该是这里的优先事项。 还应该对其进行优化,以尽可能使用较小的盒子作为第二优先级。(例如:如果在一个较大的框与两个较小的框之间进行选择,则应选择较大的框) 物品可以旋转以适合盒子,但是旋转必须至少限制为45°的增量(在我的研究中,似乎有些配置允许45度旋转才能更好地将矩形盒子容纳在更大的矩形盒子中) ,以90°旋转为标准。 盒子有重量限制,物品具有任意重量(例如:大小为1x1x1的物品可能比其他2x2x2物品重) 我进行了一些研究,找到了一些关于装箱和背包问题的抽象算法,并带有以下一些蛮力变化,类似于最佳拟合算法: 在“要包装的物品”列表上按递减的顺序对物品进行排序(从大到大) 对于此列表中的每个项目: 选择“二手箱”列表上的较小箱子,该箱子有足够的剩余体积和重量限制以适合该物品(我在这里使用“适合”表示适合尺寸和重量) 如果没有这样的盒子,请从已知的可能的盒子尺寸中创建一个新的盒子,该盒子是可以容纳物品尺寸和重量的最小尺寸,并将其添加到“二手盒子”列表中。 如果一个盒子适合该物品(使用下面的拟合功能),则将其添加到“此盒子的物品”列表中,并将其从“适合盒子的物品”列表中删除,在盒子内标记其相对3d位置。 从2.1开始重复,直到“要包装的物品”列表上没有适合的物品。 上面步骤2中使用的拟合检查功能: 检查包装箱的剩余容量是否适合项目的容量。如果不是,则返回false。 检查“盒子物品”重量加上当前物品重量的总和是否小于或等于盒子重量限制。如果不是,则返回false。 检查“框的项目”列表,以选择第一个具有最小Y分量并且具有足够空间用于该项目的宽度,深度和高度的框坐标,同时将其他项目视为不可用的空间。 如果该项目不适合其当前方向,请以6种可能的旋转方式之一进行旋转,为简单起见,不假设旋转45度。(旋转会导致尺寸已被测试的尺寸可以跳过。例如:将盒子旋转180°会得到与原始位置相同的尺寸,因为所有盒子和物品的相对面尺寸都相同,因此可以忽略。) 如果没有将商品以所有可能的方式旋转回其原始方向,请从步骤3重新尝试。 如果尝试了所有旋转但没有找到合适的旋转,则将当前坐标视为不可用的空间。 如果没有可用空间检查,则返回false。否则,请从步骤3再试一次。 我想知道在给定的限制条件下是否可以找到解决我问题的最佳方法。 这似乎在理论上可行,但我还没有在代码上尝试过。我想知道我是朝着正确的方向走,还是有更好,更高效的方法来做到这一点。 参考会很棒。 编辑: 我发现一些有趣的第三方API可以满足我的要求,但是必须断开连接,因此我将无法访问它们。 一些例子是: http://v2.3dbinpacking.com/demo/main http://www.packit4me.com/api 编辑2: 一个实际的要解决的问题的示例是: 我有4个尺寸为WxHxD的盒子:10x12x18、12x16x24、16x20x30、24x32x40 我有4个项目的订单,分别是大小为6x8x10、2x 22x14x30和1x 22x4x20的1个项目 如何使用尽可能少的盒子,尽可能小的盒子和尽可能少的可用空间将这些物品装入一个或多个大小的盒子中?


9
为什么没有真正的“仅日期”数据类型?
我不得不为真正“只是一天”的数据集使用DateTime值而感到非常荒唐。生日是最常见的例子,但这总是在业务应用程序中出现。 我已经习惯于将“仅日期”记录的“时间”部分设置为“中午”(这避免了无论时区如何更改日期)。这似乎是一种hack,我将永远从初级开发人员那里找到解决此问题的错误。 时间总是相对于固定点的。4PM是子午线或正午后4个小时。太阳的最高传播点是可观察到的,它使我们能够建立坐标系。自1970年1月1日起,中午(安特子午线)前3个小时,中午后2小时(1441899402938毫秒)。对于在笛卡尔世界中成长的人们来说,这是第二自然。 但是我们的日历早于笛卡尔。我的论点是,可以更恰当地将其视为应用了模函数的枚举。星期一跟随星期日,依此类推,直到周日跟随星期六。没有正负,它是模数或绝对值。 同样,重复多年。每隔365天(或大约365天)对我来说有几天特别的日子:生日,周年纪念日,孩子们的生日等。业务调度应用程序每隔7天,每月的第一个星期二等等都有大量的会议示例。我们可以将其映射到浮点数,实际上将其映射到所述浮点数可以解决很多旧方法确实很难解决的问题,但这并不意味着它是唯一的方法。 意识到并理解使用DateTimes存储日期的“圆角方孔”性质使您成为更好的程序员。 在定义Date类时,是否有明确打算用作计划应用程序的应用程序中有值,还是“将所有时间设置为中午”是最佳方法?使用DateTime并将Time组件设置为Noon可能会有什么问题?这样的方法可以解决时区偏移吗?我使用过MomentJS,但我认为那是更好的Date类。

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.