软件工程

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

4
如何减少用较大的对象模型包装第三方库的手动工作?
就像2012年这个问题 的作者和2013年这个问题的作者一样,我有一个第三方库,需要对其进行包装以正确测试我的应用程序。最高答案指出: 您始终希望将第三方类型和方法包装在接口后面。这可能是乏味且痛苦的。有时,您可以编写代码生成器或使用工具来执行此操作。 就我而言,该库用于对象模型,因此具有大量的类和方法,这些类和方法需要包装才能使该策略成功。除了“繁琐而痛苦”之外,这也成为测试的硬障碍。 自提出这个问题以来的四年中,我知道隔离框架已经走了很长一段路。我的问题是:现在是否存在一种更简单的方法来实现完全包装第三方库的效果?我如何摆脱这一过程中的痛苦并减少手工工作? 我的问题不是我最初链接的问题的重复,因为我的问题是减少手工包装的工作。这些其他问题仅询问包装是否有意义,而不是如何减少工作量。

5
公共图书馆是个好主意吗?
我一直认为“公共库”是个好主意。我的意思是说,该库包含一些不同应用程序经常需要的通用功能。这样可以减少代码重复/冗余。 我最近读了一篇文章(现在找不到),说这实际上是个坏主意,甚至说这是“反模式” 虽然这种方法有好处。版本控制和变更管理意味着对使用此库的一组应用程序进行回归测试。 对于我的新(Golang)项目,我有些陷入困境。多年来,重复数据删除技术已深深扎根于我,但我觉得这次应该尝试一下。 在撰写本文时,我开始认为这种“通用库”方法是对体系结构进行浏览的结果?也许我的设计需要更多思考? 有兴趣听到想法。
16 design  go 

1
如何在UML活动图中表示嵌套动作?
这个问题是非常相似,这一个,但得到的答复不符合我的需求。它专注于特定的UML工具(Papyrus),而我的问题是关于UML的一般性问题。 我想在活动图中表示一个嵌套动作,但是我不知道执行此动作的常用方法是什么。这个想法是,存在一个与其他动作具有相同作用域的动作,但是执行起来更为复杂。我想展示有关其执行的更多详细信息,同时仍能够在其他级别上展示该操作。 在下面的示例(该活动图显示了某种“ 返乡 ”活动)中,嵌套动作位于该Pet the cat动作中。请注意,此图中还有另一个潜在错误,请参阅问题末尾的勘误表。 我已经使用了结构化节点,但是我不确定这是正确的方法,因此是一个问题。在状态图中,等效项将是复合状态,但是我只是找不到关于复合动作的任何信息。关于结构化节点,在阅读了一些有关它的文档后,我仍然没有真正知道应该如何使用它,因此,我可能完全不喜欢该图。 我也知道有可能用三叉戟符号来引用另一个子活动,如下图所示,但是它不符合我的需求,因为我希望所有信息都在同一张图表上(因此我可以打印它而不会丢失任何信息): 那么代表这种嵌套动作的标准方法是什么?按照标准,我指的是有效的UML,通常在大多数UML设计工具上都可以看到并且可行。 无关的勘误表:我的图表中有另一件事是错误的,进入同一动作(Scratch behind the ears)的箭头应先进入合并节点,然后再输入该动作。请参阅下面的评论,包括JOT的引用。
16 uml  modeling 

9
是否根据最佳实践检查冗余条件?
在过去的三年中,我一直在开发软件,但是最近我才意识到自己对良好实践的无知。这使我开始阅读《清洁代码》一书,这使我的生活变得更好,但我一直在努力了解一些编写程序的最佳方法。 我有一个Python程序,其中... 使用argparse required=True强制使用两个参数,它们都是文件名。第一个是输入文件名,第二个是输出文件名 具有readFromInputFile首先检查输入文件名已被输入的功能 具有writeToOutputFile首先检查查看输入的文件名的功能 我的程序很小,导致我相信#2和#3中的检查是多余的,应将其删除,从而将这两个功能从不必要的if条件中解放出来。但是,我还被认为“双重检查是可以的”,并且可能是一个程序的正确解决方案,在该程序中可以从不进行参数解析的其他位置调用函数。 (此外,如果读取或写入失败,我try except在每个函数中都有一个引发相应的错误消息。) 我的问题是:最好避免所有冗余条件检查?程序的逻辑是否应该如此扎实,以至于检查只需进行一次?有没有很好的例子说明这一点或相反的情况? 编辑:谢谢大家的答案!我从每个人那里学到了一些东西。看到如此多的观点使我对如何解决这个问题以及根据我的需求确定解决方案有了更好的理解。谢谢!

2
仍然有关系吗?
我从读线程就好理解了这一个是EMS的一点是要确定所有的测量在您的网页,通过该基地的字体大小,可以通过浏览器进行设置。 例如,在Chrome中,您可以转到settings -> show advanced settings -> web content -> font size: very large。如果我使用的是大型高分辨率显示器,那可能会很远。 我创建了一个插件,演示了ems和px在大小调整方面的区别。 #div1 { width: 320px } #div2 { width: 20em; } 如果在浏览器中将字体大小设置为中,则这些div的大小相同,基本字体大小为16px,因此20em = 320px。 但是,当我将浏览器字体大小更改为非常大时,可以看到以ems为单位的div大小增加了。 但是,例如,如果我在body标签中定义字体大小,这种效果将被消除。 body { font-size: 16px; } 因为现在我的CSS覆盖了浏览器设置的字体大小。 我了解到,在较旧的浏览器时代,ems非常重要,因为放大页面只会放大字体。但是如今,现代浏览器同时放大像素和字体,使缩放问题变得毫无意义。 环顾网络-许多网站的确在其body标签中设置字体大小。 例如,堆栈溢出,在body标签中将font-size设置为13px。在浏览器中设置字体大小丝毫不会影响Stack Overflow的布局。 Google搜索结果无法执行此操作。 (这两个屏幕截图都是将chrome字体设置为非常大的,并且100%缩放)。 因此,您可能会争辩说,在body标签中设置字体大小是一个坏主意,因为它会阻止用户自己的辅助功能设置。但是,考虑到用户可以缩放以增加大小(这也会成比例地增加所有像素),这似乎并不是一个真正的问题。
16 css 

4
无法掌握编程设计模式
在过去的4年中,我一直在使用javascript。我对解决问题的能力非常有信心,并且可以看到我的代码质量正在提高。我尝试与社区保持同步,目前正在使用ES2015和React.js。但是,我觉得我根本无法掌握编程设计模式。我知道在哪里可以找到有关此资源的信息,并且我已经阅读了有关它的书籍。我依靠我的高级同事来制定项目结构的决策,但是我对此工作没有任何疑问。 每当我需要自己开始做某事时,我都会寻找这两个路径:如果我使用的是像React.js这样的大型库/框架,我倾向于复制社区正在做的事情;如果使用较小的模块,则将使用模块模式。我知道,一旦我对这个问题有了更好的理解,我就能做出更好的决定,但是现在我已经完全迷失了。 我应该为此寻求高级教育吗?我需要这个主题的导师吗?我只是愚蠢吗?这真的很难理解吗?

2
为什么C#允许您进行重写异步?
在C#中,当您覆盖方法时,允许在未使用原始方法的情况下进行覆盖异步。这似乎是糟糕的形式。 使我想到这一点的例子是这样-我是来协助进行负载测试问题的。在大约500个并发用户的情况下,登录过程将在重定向循环中分解。IIS正在记录异常,并显示消息“异步模块或处理程序在异步操作仍处于挂起状态时已完成”。一些搜索使我认为有人在滥用async void,但是我快速搜索源却找不到任何东西。 可悲的是,当我本应寻找诸如“ async \ s [^ T]”之类的东西时,我正在搜索“ async \ svoid”(正则表达式搜索)(假设Task尚未完全合格……您明白了)。 后来我发现是async override void onActionExecuting(...在基本控制器中。显然,这一定是问题所在。解决该问题(暂时使其同步)解决了该问题。 回到问题:为什么当调用代码永远无法等待覆盖时,为什么还要将覆盖标记为异步?
16 c#  async 

10
在编码标准方面与项目负责人存在分歧[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 3年前关闭。 因此,我与过去1年的项目负责人一起致力于一个新项目。 最初,我们有自己的子项目,这些子项目位于单独的git repos中,我与他的代码几乎没有交互,因此代码的气味不会打扰我。大约6个月后,由于我在该项目中发挥了更大的作用,因此我开始维护他的代码并向其中添加功能。 现在,我是两个子项目的首席开发人员(团队正在成长;他仍然在我之上),这些事情困扰着我,我想照顾他们,但被拒绝了: 没有花括号,大写函数,混合引号用法(带有隐藏逻辑的双引号和单引号),不使用===,具有巨大功能的巨大类。底线可能更好。 依靠PHP的选项来关闭通知/警告。代码中充满了未经检查的变量和数组键用法。变量在ifs内部定义。 以上两个问题的论点: 不想对人强制执行编码风格。 被视为一种语言功能,可以使代码更短/更有效。 我认为需要制定一些规则,并且代码应具有防御性。我提供了使用PHPStorm的默认设置进行格式设置,使用花括号和社区认可的命名约定的功能。 我想使两个项目使用相同的准则,因为它们是密不可分的。 我错了吗?我会强加我的个人喜好吗?

2
什么是Comonad,它们有什么用?
最近,我一直在整理关于Monads工作原理的知识。还向我介绍了'Comonad'的概念,它被描述为monad 的逆对偶。但是,我不可能把头缠住它。 为了了解Monad,我为自己做了一个比喻: Monads可以看作是“构建表达传送带的蓝图”。 要定义一个新的Monad(一种新型的传送带系统),您需要定义: 一种在传送带上放置东西的方法,例如“启动”传送带。(称为unit或return) 将作为传送带一部分的机器(表达式)连接到传送带的一种方式。(称为join或bind或>>=)。 (第三项操作是将当前的传送带取走,将其内含物扔掉,然后启动一个新的传送带,称为>>,但很少使用。) 为了使机器和输送机正常工作,您需要确保: 如果将某些东西放在传送带上并使其通过机器,则输出应与手动将其通过机器时的输出相同。(左身份) 如果要将传送带放在已经存在的传送带之间,则不应以顶部带有传送带的传送带结尾,而应使用一条更长的传送带。 (正确身份) 如果您手动使用机器A,然后将结果传递到连接传送带的BC,或者如果您使用机器,将结果传递给连接的AB,然后手动将结果传递给C,则对于输出无所谓。 >> = b)>> = c)应该与(a >> =(b >> = c))相同(关联性) 最简单的传送带就是那种只接受输入并始终继续到下一个表达式的传送带。这就是“管道”。 另一种可能性是,只有在满足该条件的条件下,才让它通过下一台机器。这意味着,如果在它们之间的某些表达式中,该值更改为不再允许的值,则将跳过其余的表达式。这就是“也许”单子在Haskell中所做的事情。 您还可以在将值传递到计算机之前或之后对值执行其他特殊的条件性复制/更改规则。一个示例:解析器(此处,如果表达式返回“失败”结果,则将表达式之前的值 用作输出)。 当然,这个比喻不是完美的,但我希望它能很好地说明单子的工作原理。 但是,我很难理解这种类比,以理解Comonads。我从互联网上发现的少量信息中得知Comonad定义了以下信息: extract,这与的相反return,也就是说,它从 Comonad中取出一个值。 duplicate,这与的倒数相同join,也就是说,它从一个中创建了两个Comonad。 但是,如果我们只能从它们中提取或复制它们,该如何实例化Comonad?以及如何实际使用它们?我已经看到了这个非常了不起的项目以及有关它的讨论(很遗憾,我对此了解很少),但是我不确定Comonad到底提供了部分功能。 什么是Comonad?它们有什么用?如何使用它们?它们可食用吗?

6
一种基于限制传递给函数的参数数量的语言
这个想法的灵感来自事实运算符,例如+,-,%等,可以看作是传递了一个或两个参数且没有副作用的函数。假设我或其他人编写了一种语言,该语言可以阻止传递两个以上的参数,并且也只能通过返回值来工作: a)这样的语言会导致更容易理解的代码吗? b)代码流程会更清晰吗?(被强制执行更多的步骤,可能会减少“隐藏”的互动 c)限制是否会使该语言在更复杂的程序中显得过于庞大。 d)(奖励)对优点/缺点的任何其他评论 注意: 仍然必须做出两个决定-第一个是是否允许用户在main()或其等效外部进行输入,以及关于传递数组/结构时将发生什么的规则。例如,如果某人希望单个函数添加多个值,则可以通过将其捆绑到数组中来解决该限制。可以通过不允许数组或结构与其自身进行交互来阻止这种情况,例如,仍然可以使您根据位置将每个数字除以不同的数量。

5
C ++中异常的惯用法
isocpp.org例外常见问题解答指出 不要使用throw来指示函数使用中的编码错误。使用断言或其他机制将流程发送到调试器中或使流程崩溃并收集崩溃转储供开发人员调试。 另一方面,标准库定义了std :: logic_error及其所有派生类,在我看来,它们似乎还应该处理编程错误。是否将空字符串传递给std :: stof(将抛出invalid_argument)不是编程错误?是否将包含不同于'1'/'0'字符的字符串传递给std :: bitset(将抛出invalid_argument)不是编程错误?使用无效索引调用std :: bitset :: set(会抛出out_of_range)不是编程错误吗?如果不是,那么将要测试的编程错误是什么?基于字符串的std :: bitset构造函数仅自C ++ 11起存在,因此在设计时应考虑惯用异常。另一方面,有人告诉我,从根本上不应该使用逻辑错误。 经常出现异常的另一个规则是“仅在特殊情况下使用异常”。但是,库函数应该如何知道哪些情况例外?对于某些程序,无法打开文件可能是一种例外。对于其他人,无法分配内存可能不是例外。中间有100多个案例。无法创建套接字?无法连接或将数据写入套接字或文件?无法解析输入?可能是例外,可能不是。该函数本身肯定通常不知道,它不知道在哪种上下文中调用它。 因此,我应该如何决定是否应为特定功能使用异常?在我看来,实际上唯一一致的方法是将其用于所有错误处理,或一无所有。而且,如果我使用的是标准库,那么该选择就是我自己做的。
16 design  c++  exceptions 

1
为什么ES6没有细箭头功能?
ES6添加了胖箭头功能(=>),与正常功能有两个主要区别: 较短的语法(如果使用单表达式主体,则包括隐式返回) this从周围范围继承 这两个都是非常有用的功能,但在我看来它们的价值和应用程序是完全分开的–有时我想要一个或另一个,或者两者兼而有之,或者都不想要。如果我想使用短语法功能,我还必须使用this-modifying行为,这似乎很奇怪。反之亦然。我不明白为什么将这两种功能作为语言的一个附加实现而实现。 如果我想为它的隐式返回和简洁性使用一个短语法函数(在某些情况下,完整的function (..) { return ...}可读性会稍差一些),但是我想this在我的函数中使用它来引用调用上下文,该怎么办?没有办法做到这一点。 CoffeeScript同时具有->和=>样式功能,并且显然ES6是=>从那里借来的样式。所以我的问题是,为什么ES6也没有借用->样式?
16 javascript  es6 

4
将整数标识符映射到枚举有什么缺点?
我一直在考虑为这样的标识符创建自定义类型: public enum CustomerId : int { /* intentionally empty */ } public enum OrderId : int { } public enum ProductId : int { } 我这样做的主要动机是防止在您无意中将orderItemId传递给期望有orderItemDetailId的函数时发生的错误。 枚举似乎可以与我想要在典型的.NET Web应用程序中使用的所有内容无缝地结合在一起: MVC路由工作正常 JSON序列化工作正常 我能想到的每个ORM都可以正常工作 所以现在我想知道,“为什么不应该这样做?” 这些是我能想到的唯一缺点: 这可能会使其他开发人员感到困惑 如果您有任何非整数标识符,它将在您的系统中引起不一致。 它可能需要额外的转换,例如(CustomerId)42。但是我认为这不会成为问题,因为ORM和MVC路由通常会直接将枚举类型的值交给您。 所以我的问题是,我想念什么?这可能是个坏主意,但是为什么呢?
16 c# 

2
如何找到很难拼错名字的名字?
我认为这是一个可以通过一些数据挖掘和完善的算法解决的问题,但我不知道如何解决。欢迎提供有关使用哪些数据源以及应用哪种算法的任何指针。 背景:我是罗马尼亚-匈牙利人,他正在怀有波兰-乌克兰人的怀抱,并且还没有完全决定要定居哪个国家。正如您所期望的那样,选择一个给定的名称是最重要的,也是一个激烈的辩论。从我的角度来看,当我从一个国家搬到另一个国家时,有人拼错了我的名字时,我仍然要经历所有麻烦。例如,如果您被称为“ Adrian”,那么您在罗马尼亚会很幸运,只是发现您最终成为“ Adri e n”是一些法国官方文件。因此,我唯一的要求是在某些欧洲国家/地区极不可能使婴儿的名字拼写错误。 问题陈述:给定一组国家,例如法国,德国,瑞典,波兰和罗马尼亚,请查找适当发音的给定名称列表,这些名称不太可能被当地人拼写错误。 更正式地讲:令p(c,n)是一个函数,该函数返回名称n在国家c中拼写错误的可能性。给定C个国家集和 p₀个概率,找到N个给定名称集,使得 对于所有Ñ ∈ Ñ和Ç ∈ Ç,P(C,N)<P 0 初步思路:核心问题是如何实现p(c,n)。可以尝试用一种启发式方法来近似它。显然,在两种情况下,名称可能会拼写错误: 在那个国家很少使用。 它类似于一个不同的名称,在那个国家很少使用。 我不确定如何使用互联网(例如Wikipedia)有效回答这两个问题。一个人怎么会只列出一个国家中经常使用的名字?人们会如何寻找相似的拼写?

6
调试代码的方法(噩梦情况)
我经常在工作中负责调试应用程序。它是一个我们部署到企业的BI应用程序,其中包括测试环境和生产环境。我想知道,基于这些限制,人们是否可以建议任何应用程序/工具/方法: 调试器不能在客户端站点上或本地使用,因为该软件依赖于我们没有测试环境的自定义第三方应用程序。(编辑:说实话,在某些情况下,可以在本地进行调试。如果我们只使用核心代码,那么大多数有问题的代码都位于一个DLL中,该DLL封装了第三方特定的通信:套接字,进程管道,soap调用,更改核心代码行为的自定义逻辑。通常,在为客户实施或增强功能时,我们会在此区域编写新代码。) 实际上,我们的应用程序中没有任何日志记录。没有单元测试。 版本控制只有完整解决方案的1个版本(使用Source Safe 2005)。因此,不可能仅通过单个文件来获得整个解决方案的先前版本。(除非有人知道解决此问题的方法)。 无法本地复制,通常无法在测试环境上复制(测试和生产版本不同的可能性很高)。 客户端使用的版本与来源安全版本不同的可能性很大。这是因为已更新单个文件,这些文件具有针对该特定客户端的嵌入式自定义逻辑。通常会发生的事情是对二进制文件进行更新,这需要更改其他几个二进制文件,但是提交完成后,没有人对此有任何记录或知识。我看到的一个常见错误是客户端环境上的“找不到函数/方法”或“方法调用指定的参数太多/太少”。 这是一个.net VB解决方案 无法在客户端站点上安装任何软件,但可以在本地 我们的应用程序具有极高的可定制性,但是不幸的是,定制逻辑分布在所有类和文件中,从前端一直到数据层,包括基于每个客户端对数据库进行的定制更改。 代码中几乎没有注释。没有有关体系结构的文档。没有有关api的文档。我们唯一拥有的是成百上千的电子邮件链,这些链在某种程度上解释了正在发生的事情。唯一知道该代码的人是最初编写该代码的人,但是他们不再是每个人所说的开发人员,因此他们不会参与其中。 在你说出来之前……是的,我知道;我也想开枪 意大利面条代码,数百个编译器警告以及确实应该修复的破碎多态性并没有帮助,但是我没有发言权。 我遇到的最常见的错误类型是空引用错误,无效的强制转换和缺少的功能/功能签名不匹配。有时我很幸运,事件查看器将记录类,方法和异常消息。它不是最有用的,但还是有帮助。最糟糕的是没有屏幕快照,没有复制步骤的错误,而且是类似于上面提到的一般错误消息。有时,不可能找出它们发生的原因,只能祈祷环境配置不正确,以后环境会消失。 我知道这有点像咆哮,在某种程度上是这样。但是我渴望选择。我还能使用其他方法/工具吗?
16 .net  vb.net  n-tier 

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.