软件工程

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

2
为什么使用UML图计划代码的组织方式不合适?
因此,是的,图表有时可能不合适。什么时候不合适?当您创建没有代码的代码来验证它们时,然后打算遵循它们。绘制图表探索想法没有错。 敏捷软件开发:原理,模式和实践 -Robert C. Martin 他到底是什么意思?UML是否旨在帮助计划如何在 “切入” 之前构造代码?如果您不遵循自己想到的图,使用它有什么意义? 上下文:在本章中,鲍伯叔叔为保龄球比赛的得分保持者制作了一个UML图。然后,他继续以测试驱动的方式开发程序,而无需查阅UML图。生成的程序与UML图完全不同,鲍勃叔叔得出了上面引用的结论。

1
仅在很少有写入的情况下才使用事件源吗?
我正在阅读事件源,不能停止问自己,这是否仅在非常罕见的情况下才有意义,在这种情况下,写操作很少或需要进行军事级审核。 具有非凡用途的非例外系统每天可能会产生成百上千的写入,相当于每年运行一百万或2次写入(因此发生事件)。与从传统存储中直接读取的内容相比,合并数百万个对象(事件)只是为了获得当前状态,这听起来很荒谬。但是,事件源位于某些性能最高的系统(例如LMAX)的背后。 那么,我想念什么?从事件流恢复状态是否通常已经完成?还是这种想法很少需要这样做,而是完全使用其他存储来进行常规操作(即使用CQRS的查询存储),并且仅在特殊情况下(例如复制,审核等)从事件中恢复?

1
用Java语言吊起===编译?
在最近的一次面试中,我遇到了一个有趣的观点。 用Java语言进行提升是关于将变量声明和函数声明移到脚本顶部。我们可以将此阶段称为编译阶段吗? 我知道以下事实:Javascript解释器在输入脚本上有2个传递,在第一个传递中它会提升,而在第二个传递中它实际上会执行脚本。知道Javascript是一种解释语言后,这个问题使我有些困惑。

1
用PHP中的字符串公式评估数据集
我受命更新应用程序中的某些条件。我有一个要评估的数据集,并且已按照以下方式在应用程序中进行了硬编码: $arr = array( 'a' => 'apple', 'b' => 'orange', 'c' => 1, 'd' => 2, 'e' => 5, 'f' => 'green', 'g' => 'red', 'h' => 'yellow', ) $res1 = ($arr['a'] == 'apple') ? TRUE : FALSE; $res2 = (($arr['b'] == $arr['f']) && ($arr['c'] < $arr['d']) ? TRUE : …
9 php 

8
防范数据库中错误的空条目的设计和实践
程序的一部分从数据库中的许多表和列中获取数据进行处理。有些列可能是null,但是在当前处理上下文中这是一个错误。 从理论上讲,这不会发生,因此,如果这样做,则表明数据错误或代码中存在错误。错误具有不同的严重性,具体取决于哪个字段null。也就是说,对于某些字段,应停止处理并通知某人;对于其他字段,应允许该处理继续进行,而仅通知某人。 是否有任何好的架构或设计原则来处理稀有但可能的null条目? 解决方案应该可以用Java来实现,但是我没有使用标记,因为我认为问题在某种程度上与语言无关。 我的一些想法: 使用NOT NULL 最简单的方法是在数据库中使用NOT NULL约束。 但是,如果原始数据插入比随后的处理步骤更重要,该怎么办?因此,如果插入内容将a null放入表中(由于错误或什至出于某些合理的原因),我不希望插入操作失败。假设程序的更多部分取决于插入的数据,但不取决于此特定列。因此,我宁愿冒险在当前处理步骤而不是插入步骤中出错。这就是为什么我不想使用NOT NULL约束的原因。 天真的取决于NullPointerException 我可以使用数据,就像我期望它始终存在一样(这确实应该如此),并在适当的级别上捕获生成的NPE(例如,以便停止当前条目的处理,而不是整个处理进度) )。这是“快速失败”的原则,我经常喜欢它。如果这是一个错误,至少我会得到一个已记录的NPE。 但是后来我失去了区分各种丢失数据的能力。例如,对于某些丢失的数据,我可以将其省略,但是对于其他一些数据,应停止处理并通知管理员。 null在每次访问之前进行检查并引发自定义异常 自定义异常可以让我根据异常来决定正确的操作,因此这似乎是可行的方法。 但是,如果我忘记在某个地方检查该怎么办?然后,我还会使用从未有过或很少有期望的空检查(因此绝对不是业务逻辑流程的一部分)使我的代码混乱。 如果我选择这种方式,哪种模式最适合该方法? 欢迎对我的方法提出任何想法和意见。还有任何更好的解决方案(模式,原理,代码或模型的更好体系结构等)。 编辑: 还有一个约束,因为我使用ORM进行从DB到持久性对象的映射,因此在该级别上执行null检查将不起作用(因为在null不会造成任何危害的部分中使用了相同的对象) 。我添加此内容是因为到目前为止提供的答案都提到了该选项。

4
存储数据的最有效方法是什么?
我负责重写一些旧的VB代码。我了解它是如何工作的,但是我觉得有一种更有效的方法来完成他们的工作。我只是不知道那是什么。这是一个人为的示例,它在数据需求方面确实与我需要做的相似。 用户必须在GUI中挑选汽车的制造商,制造商,型号和颜色。我有一个很大的文本文件,看起来像这样: Ford Truck F150 red Ford Truck F150 blue Ford Truck F150 black Ford Truck F150 silver Ford Truck F250 red Ford Truck F250 green Ford Sedan Taurus red Ford Sedan Taurus green Ford Sedan Taurus white Ford... ... Subaru SUV Forester blue Subaru SUV Forester red Subaru SUV …

2
我可以在单元测试中检查注释的存在吗?
我有一个由抽象类及其N个扩展组成的Java类层次结构。在抽象类中,我有一个使用@Remove注释进行注释的方法。尽管删除该批注不会导致任何异常,但不会很快失败,但是我们可能会遇到内存异常,因此,我想确保如果此批注在某些重构中消失,我们会尽快注意到。 我正在尝试创建GUTS(好的单元测试),因此我认为我可以在测试中记录该“技术要求”,并附带说明其的测试用例。 但这不是功能,它是实现的详细信息,并且没有与方法的行为链接(该方法可以为空,但是必须存在并且必须进行注释)。 是否可以为此创建测试,还是有其他方法可以检查此批注的存在?


2
为什么Akka对并发有好处?
我是Akka和actor框架的新手-我确信我缺少明显的东西,请提前接受我的道歉。 我一直在读,选择Akka的主要要点之一是它管理并发的方式。 我不清楚Akka为什么如此特别。我知道有很多小演员非常轻快。但是,当两个用户同时保存一个表单时,这对我有什么帮助? 我是否还需要某种并发锁(悲观/乐观/等等)?

3
ASP.Net中的三层体系结构和MVC(模型,视图控制器)之间的区别
我很想知道3层架构与ASP.Net中的MVC(模型,视图控制器)有何不同,因为在我看来,该架构适用。 在3层中,我们有User Services Layer,BusinessLayer而DataAccessLayer在另一方面Model,中View,和Controller。在我看来,这是相同的体系结构。 谁能解释这两种架构的真正区别是什么,每一层之间又有什么不同?

1
ISO-8601中的“ kk”和“ HH” +1有什么区别?
在ISO-8601中,有多种小时格式,其中一种是1-24小时的“ kk”。 这样做的目的是什么?有没有抵消时间的国家?是用于军事用途吗? 在维基百科的文章并没有明确HH和KK之间的确切性质。我关注的主要来源是SimpleDataFormatter中格式的行为。 编辑:我指的是来自SimpleDateFormat的直接部分是这样的: H小时(0-23)时数0 k小时(1-24)时数24 在使用中... HH:mm:ss // 00:00:00 kk:mm:ss // 01:00:00

1
网站的版本控制:开发/生产前端文件
我正在尝试一种更好的方式来控制我们的网站项目的版本。请记住,我只是一个前端开发人员,所以我对VCS并不了解。 工作流程在变化,过去的版本控制习惯变得过时。主要问题是每个网站都有2个前端文件阵列。 开发环境(较少的文件,未压缩的js,图像等)。构建环境“变得糊涂”(一切压缩且人类无法读取)。 但是您不能出售带有源文件的网站。好吧,感觉不太正确。 有两个解决方案的解决方案:一个构建,一个开发,并用gulp发送dev文件到构建目录。但是,对于小型公司而言,维护起来很麻烦,我认为这不是那么好。它创建了很多回购协议,人们不得不管理多个回购协议,有时甚至需要一个svn回购协议,都会出现问题。 因此,还有一种解决方案,即拥有1个repo:同一svn中的源文件和prod文件。但是,当网站从本地开发服务器转到生产服务器时,需要删除源文件(因此,根据其位置,开发或生产,单个存储库中有不同的文件。)。据我所知不好 关于版本控制系统,管理gulp前端工作流的正确方法是什么?

3
CRUD API:如何指定要更新的字段?
假设您有某种数据结构,该数据结构保留在某种数据库中。为简单起见,我们将此数据结构称为Person。现在,您要负责设计CRUD API,该API允许其他应用程序创建,读取,更新和删除Person。为简单起见,让我们假定通过某种Web服务访问此API。 对于CRUD的C,R和D部分,设计很简单。我将使用类似C#的功能符号-实现可以是SOAP,REST / JSON或其他方式: class Person { string Name; DateTime? DateOfBirth; ... } Identifier CreatePerson(Person); Person GetPerson(Identifier); void DeletePerson(Identifier); 那更新呢?自然要做的是 void UpdatePerson(Identifier, Person); 但你会如何指定哪些领域Person要更新? 我可以提出的解决方案: 您始终可以要求通过一个完整的“人员”,即客户将执行以下操作来更新出生日期: p = GetPerson(id); p.DateOfBirth = ...; UpdatePerson(id, p); 但是,这将需要某种事务上的一致性或在Get和Update之间锁定;否则,您可能会覆盖其他客户端并行进行的其他更改。这会使API更加复杂。此外,由于下面的伪代码(假设客户端语言支持JSON),因此容易出错。 UpdatePerson(id, { "DateOfBirth": "2015-01-01" }); - 看起来正确-不仅会更改DateOfBirth,而且会将所有其他字段重置为null。 您可以忽略所有的字段null。但是,您将如何在不更改 DateOfBirth和有意将其更改为null之间做出区别? 将签名更改为void UpdatePerson(Identifier, Person, ListOfFieldNamesToUpdate)。 将签名更改为void …

1
为所有用户缓存经过身份验证的请求
我正在开发一个Web应用程序,该应用程序必须处理需要授权的并发用户的巨大冲动,以请求相同的内容。在当前状态下,它甚至完全破坏了32核AWS实例。 (请注意,我们使用Nginx作为反向代理) 无法简单地缓存响应,因为在最坏的情况下,我们必须通过解码JWT来检查用户是否已通过身份验证。这要求我们启动Laravel 4 ,即使启用了PHP-FPM和OpCache ,它也很慢。这主要是由于繁重的自举阶段。 可能会问一个问题:“如果您知道这将成为一个问题,为什么首先要使用PHP和Laravel?” -但是现在再来做这个决定为时已晚! 可能的解决方案 提出的一种解决方案是将Auth模块从Laravel提取到一个轻量级的外部模块(以类似于C的方式编写),其职责是解码JWT并确定用户是否通过身份验证。 请求的流程为: 检查缓存是否命中(如果没有正常传递给PHP) 解码令牌 检查是否有效 如果有效,则从缓存中投放 如果无效,请告诉Nginx,然后Nginx将把请求传递给PHP进行正常处理。 一旦我们向单个用户提供了此请求,这将使我们不再打PHP,而是接触到轻量级模块来解决解码JWT以及此类auth附带的其他注意事项。 我什至在考虑直接将此代码作为Nginx HTTP扩展模块编写。 顾虑 我担心的是,我从未见过这样的事情,并且想知道是否有更好的方法。 同样,第二次您将任何用户特定的内容添加到页面,它完全杀死了该方法。 Nginx中是否可以直接使用另一种更简单的解决方案?还是我们必须使用像Varnish这样的更专业的东西? 我的问题: 上述解决方案有意义吗? 通常如何处理? 有没有更好的方法来实现类似或更好的性能提升?

4
您如何处理仅在运行时才知道的传递依赖冲突?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 您通常如何处理大型软件项目在运行时发生的传递依赖问题? 在过去的三个星期中,我一直试图在一个软件的另一个组件中启动一个大型软件的一个组件,但是由于仅在运行时才知道的传递依赖项问题,该软件间歇性地消失了。 通过传递依赖关系问题,我的意思是给定项目的依赖关系的某些依赖关系在运行时与其他依赖关系发生冲突,从而导致不稳定或即时失败。 有成百上千的依赖在使用中,并且与该工具相关联的子项目大约有50个,这些其他项目是由其他团队隔离进行的,其中所有模块之间都具有深层嵌套的依赖关系。鉴于项目的规模和复杂性,没人知道所有子项目的用途。 在这种情况下,您是否会尝试为受影响的组件的每个依赖项生成DAG的可视化表示,并尝试确定在运行时可能在何处发生冲突?我无法控制其他子项目中依赖项的管理方式,也无法更改其他开发人员编写的任何Java代码 我提出的解决方案只能工作一两个小时,然后由于上游组件的更改而停止工作。上游组件的一个示例是工件,我正在处理的项目依赖于工件,该工件是在CI管道的较早阶段构建的。 应他人的要求,我将提供有关正在使用哪种技术的信息,可能会因提供太多信息而导致问题被解决,或者身体变得太长的风险: Maven用于依赖性管理;和 Spring用作DI容器; 由于在运行时加载了其他模块的上下文,因此大多数依赖性问题都涉及到重叠的Bean上下文。 该产品运行正常,并且存在大量的单元测试和集成测试,以确保程序的功能正确性 总的来说,我正在寻找一种与语言无关的方法来确定解决依赖冲突的方法,而不用枚举给定项目依赖的所有可能组合。 我无法重新设计项目,添加其他质量保证,无法推动公司范围内的范式转换或切换语言作为解决方案。

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.