软件工程

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

5
为什么负零很重要?
我对为什么我们关心正零和负零的不同表示感到困惑。 我隐约记得阅读过的说法,即负零表示在涉及复数的编程中极为重要。我从来没有机会编写涉及复数的代码,所以我对为什么会这样感到困惑。 Wikipedia关于该概念的文章并不是特别有用。如果我理解正确的话,它只会使带符号的零的含糊的说法使某些数学运算在浮点中变得更简单。该答案列出了几个功能不同的函数,如果您熟悉它们的用法,则可以从示例中推断出一些东西。(尽管复杂的平方根的特定示例看起来完全错了,因为这两个数字在数学上是等价的,除非我有误解。)但我一直无法找到一个清晰的陈述,说明如果不存在该陈述会遇到的麻烦。我能够找到的更多数学资源表明,从数学角度看,两者之间没有区别,并且Wikipedia文章似乎暗示,除了描述限制之外,在计算之外很少见到这一点。 那么为什么负零在计算中有价值呢?我确定我只是想念一些东西。

12
有一个标志来指示是否应该抛出错误
我最近开始在一个与一些年龄较大的开发人员(大约50岁以上)一起工作的地方。他们致力于处理无法解决系统故障的航空关键应用。结果,较老的程序员倾向于以这种方式进行编码。 他倾向于在对象中放入一个布尔值,以指示是否应该引发异常。 例 public class AreaCalculator { AreaCalculator(bool shouldThrowExceptions) { ... } CalculateArea(int x, int y) { if(x < 0 || y < 0) { if(shouldThrowExceptions) throwException; else return 0; } } } (在我们的项目中,该方法可能会失败,因为我们正在尝试使用当时无法使用的网络设备。区域示例仅是异常标志的示例) 对我来说,这似乎是一种代码气味。编写单元测试变得有些复杂,因为每次都必须测试异常标志。另外,如果出现问题,您是否想立即知道?确定如何继续是呼叫者的责任吗? 他的逻辑/理由是我们的程序需要做一件事,向用户显示数据。任何其他不会阻止我们这样做的异常都应忽略。我同意不应忽视它们,而应该冒泡并由适当的人员来处理,而不必为此处理标志。 这是处理异常的好方法吗? 编辑:只是为了提供更多有关设计决策的信息,我怀疑这是因为如果该组件失败,程序仍可以运行并完成其主要任务。因此,当用户可以正常工作时,我们不想抛出异常(不处理它?)并让它删除程序。 编辑2:为了提供更多上下文,在本例中,该方法被调用来重置网卡。当网卡断开连接并重新连接时,会出现问题,它被分配了另一个IP地址,因此Reset将引发异常,因为我们将尝试使用旧的IP重置硬件。

11
路径覆盖范围是否可以保证找到所有错误?
如果测试了程序的每条路径,是否可以保证找到所有错误? 如果没有,为什么不呢?如何解决程序流程的每一种可能的组合,如果存在的话却找不到问题? 我毫不犹豫地建议可以找到“所有错误”,但这也许是因为路径覆盖不切实际(因为它是组合的),所以从未经历过? 注意:本文提供了我考虑的覆盖类型的快速摘要。

5
从另一个微服务“拥有”的数据库中读取数据为何如此糟糕
我最近阅读了有关微服务体系结构的出色文章:http : //www.infoq.com/articles/microservices-intro 它指出,当您在Amazon上加载网页时,则有100多个微服务合作提供该页面。 该文章描述了微服务之间的所有通信只能通过API。我的问题是,为什么这么糟糕的说法是所有数据库写操作只能通过API进行,但是您可以自由地直接从各种微服务的数据库中进行读取。例如,可以说微服务外部只能访问少数几个数据库视图,以便维护微服务的团队知道只要保持这些视图不变,那么他们就可以尽可能多地更改其微服务的数据库结构。想。 我在这里想念什么吗?还有其他原因为什么只能通过API读取数据? 不用说,我的公司要比亚马逊小得多(并且一直会这样),我们可以拥有的最大用户数约为500万。

2
为什么这么多散列和加密的字符串以等号结尾?
我在C#和MSSQL中工作,并且正如您期望的那样,我将密码存储为盐值和哈希值。 当我查看存储在nvarchar列中的哈希(例如,开箱即用的aspnet成员资格提供程序)时。我一直很好奇为什么生成的Salt和Hash值总是以一个或两个等号结尾。 在使用加密算法时,我已经看到了类似的事情,这是巧合还是有原因?

6
服务层与DAO -为什么两者同时存在?
我一直在使用Java Web应用程序示例中的SpringMVC,Hibernate和某些数据库。 有几种不同的方法可以执行此操作,但是此Spring 3和hibernate集成教程(带有示例)具有模型类,视图(在jsp中)以及控制器的服务和dao类。 我的问题是,服务类和DAO类是否都做同样的事情?您为什么同时需要它们? 这是我实际使用的教程:http : //fruzenshtein.com/spring-mvc-security-mysql-hibernate/

1
Gerrit代码审查,还是Github的分叉模型?
我正在启动一个将由团队和社区开发的软件项目。我以前是在Gerrit上出售的,但是现在Github的fork和pull请求模型似乎几乎提供了更多工具,可视化提交的方式以及易用性。 对于至少两者都有一点经验的人来说,两者的利弊是什么?对于希望为社区发展留出无限可能的基于团队的项目,哪个会更好?
64 git  github  forking  gerrit 

1
Rust特性与Go Interface有何不同?
我对Go相对熟悉,在其中编写了许多小程序。当然,Rust我不太熟悉,但请注意。 最近阅读过http://yager.io/programming/go.html以后,我认为我将亲自研究泛型的两种处理方式,因为在实践中,当接口实际上没有太多内容时,这篇文章似乎不公平地批评了Go。不能优雅地完成。我一直在听到关于Rust的特质多么强大的炒作,除了人们对Go的批评之外,什么也没有。有了Go的经验,我想知道它的真实性以及最终的差异。我发现特征和接口非常相似!最终,我不确定是否遗漏了一些东西,因此这里是他们相似之处的快速教育总结,您可以告诉我我错过了什么! 现在,让我们从他们的文档中了解Go Interfaces : Go中的接口提供了一种指定对象行为的方式:如果可以做到这一点,则可以在这里使用它。 到目前为止,最常见的接口是Stringer返回表示对象的字符串。 type Stringer interface { String() string } 因此,String()在其上定义的任何对象都是Stringer对象。可以在类型签名中使用它,这样func (s Stringer) print()几乎可以获取所有对象并进行打印。 我们也有interface{}哪个对象。然后,我们必须在运行时通过反射确定类型。 现在,让我们从他们的文档中了解Rust特性: 简单来说,特征是一组零个或多个方法签名。例如,对于可以打印到控制台的内容,我们可以使用单个方法签名声明特征Printable: trait Printable { fn print(&self); } 这立即看起来与我们的Go Interfaces非常相似。我看到的唯一区别是,我们定义了特征的“实现”,而不仅仅是定义了方法。所以,我们做 impl Printable for int { fn print(&self) { println!("{}", *self) } } 代替 fn print(a: int) { ... } 额外的问题:如果定义一个实现特征但不使用的函数,在Rust中会发生什么impl?就是行不通吗? 与Go的接口不同,Rust的类型系统具有类型参数,可让您执行适当的泛型和诸如interface{}编译器和运行时实际知道类型的操作。例如, …
64 go  rust 

3
为什么Java 8 java.time类缺少getMillis()方法?
Java 8在java.time包中提供了一个用于日期和时间的全新库,这对于以前必须使用JodaTime或使其成为自己的日期处理助手方法而感到烦恼的人来说,是一件非常受欢迎的事情。该程序包中的许多类都表示时间戳,并具有一些辅助方法,例如getHour()从时间戳获取小时,从时间戳getMinute()获取分钟,从时间戳getNano()获取nano等。 我注意到他们没有一种方法getMillis()来获取时间戳的毫秒数。相反,必须调用method get(ChronoField.MILLI_OF_SECOND)。在我看来,这似乎是图书馆中的矛盾之处。有谁知道为什么缺少这种方法,或者由于Java 8仍在开发中,是否有可能稍后再添加呢? https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html 此处定义的类代表主要的日期时间概念,包括瞬间,持续时间,日期,时间,时区和时间段。它们基于ISO日历系统,这是遵循通用格里高利规则的事实世界日历。所有的类都是不可变的并且是线程安全的。 每个日期时间实例均由API方便提供的字段组成。对于较低级别的字段访问,请参考java.time.temporal软件包。每个类都支持打印和解析各种日期和时间。请参阅java.time.format软件包以获取自定义选项... 此类示例:https : //docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html ISO-8601日历系统中没有时区的日期时间,例如2007-12-03T10:15:30。 LocalDateTime是一个不变的日期时间对象,代表一个日期时间,通常被视为年-月-日-时-分-秒。也可以访问其他日期和时间字段,例如,一年中的某天,一周中的某天和一周中的某周。时间以纳秒精度表示。例如,值“ 2nd October 2007 at 13:45.30.123456789”可以存储在LocalDateTime...中
64 java  java8 

7
配置数据:单行表与名称-值对表
假设您编写了一个可由用户配置的应用程序。为了将该“配置数据”存储到数据库中,通常使用两种模式。 该单行表 CompanyName | StartFullScreen | RefreshSeconds | ... ---------------+-------------------+------------------+-------- ACME Inc. | true | 20 | ... 的名称-值对表 ConfigOption | Value -----------------+------------- CompanyName | ACME Inc. StartFullScreen | true (or 1, or Y, ...) RefreshSeconds | 20 ... | ... 我已经看到了两种选择,它们都有明显的优缺点,例如: 单行表限制了您可以拥有的配置选项的数量(因为通常限制一行中的列数)。每个其他配置选项都需要更改数据库架构。 在名称/值对表中,所有内容都是“字符串类型的”(您必须对Boolean / Date / etc。参数进行编码/解码)。 (还有很多) 开发社区内部对于哪种选择更可取达成共识?

4
不使用JSF的原因[关闭]
我是StackExchange的新手,但我认为您可以为我提供帮助。 我们正在创建一个新的Java Enterprise应用程序,以替换旧版JSP解决方案。由于许多更改,UI和业务逻辑的各个部分将被完全重新考虑和重新实现。 我们首先想到的是JSF,因为它是Java EE中的标准。起初,我印象深刻。但是现在,我正在尝试实现一个功能原型,并且对使用它确实有一些严重的担忧。 首先,它创建了我见过的最糟糕,最混乱的无效伪HTML / CSS / JS混合。它违反了我在网络开发中学到的每一个规则。此外,它把所有东西紧密结合在一起:布局,设计,逻辑和与服务器的通信。我看不到如何舒适地扩展此输出,无论是使用CSS样式,添加UI糖果(例如可配置的热键,拖放小部件)还是其他方法。 其次,它太复杂了。它的复杂性非常出色。如果您问我,这是对基本Web技术的拙劣抽象,最终变得残废无用。我有什么好处?没有,如果您考虑的话。数百个组件?我看到了数以万计的HTML / CSS片段,数万个JavaScript片段以及成千上万个jQuery插件。它解决了很多问题-如果不使用JSF,就不会有。或完全是前控制器模式。 最后,我认为我们将不得不在两年之内重新开始。我看不到如何实现所有第一个GUI模型(此外;我们的团队中没有JSF专家)。也许我们可以以某种方式将其破解。然后会有更多。我确信我们可以破解我们的黑客。但是在某些时候,我们会陷入困境。由于服务层之上的所有内容都由JSF控制。我们将不得不重新开始。 我的建议是使用JAX-RS实现REST api。然后用客户端MVC创建一个HTML5 / Javascript客户端。(或MVC的某种风格。)顺便说一句;无论如何,我们都将需要REST api,因为我们也在开发部分Android前端。 我怀疑JSF是当今最好的解决方案。随着互联网的发展,我真的不明白为什么要使用这种“耙子”。 现在,优点/缺点是什么?我如何强调我不使用JSF的观点?在我的建议下使用JSF有什么优点?

11
如何使老板相信ANSI C不适合我们的新项目?[关闭]
几个月前,我们开始开发一个应用程序,以控制内部开发的测试设备并记录一组测量值。它应该具有简单的UI,并且由于必须进行连续记录,因此可能需要线程。该应用程序将使用几年,并且在此期间应由许多计算机科学专业的学生维护。 我们的老板大约30年前毕业(不要被视为冒犯;我也有一半以上的时间都在我的背上),并责令我们在ANSI C中开发此应用程序。理由是他是唯一的一位将一直存在,因此他必须能够了解我们在做什么。他还裁定我们不应使用抽象数据类型。他甚至给我们列出了他希望我们使用的全局变量的名称(叹气)。 我实际上尝试了这种方法一段时间,但确实让我放慢了脚步,以确保所有指针操作都是安全的并且所有字符串的大小均正确。此外,与手头问题实际相关的代码行数仅占我们代码库的一小部分。几天后,我放弃了整个工作,并使用C#重新开始。我们的老板已经看到了程序的运行,他喜欢它的工作方式,但是他不知道该程序是用另一种语言编写的。 下周,我们两个人将开会讨论源代码,以便他“知道如何维护它”。我有点害怕,我想听听你们可以用哪些论点支持我的决定。 ward弱的你

18
长方法总是不好的吗?[关闭]
因此,环顾四周,我注意到一些关于长方法是不好的做法的评论。 我不确定我是否总是同意长方法是不好的(并希望别人提出意见)。 例如,我有一些Django视图,在将对象发送到视图之前会对其进行一些处理,一个长方法是350行代码。我编写了代码,以便处理参数-对查询集进行排序/过滤,然后对查询返回的对象进行一点点处理。 因此,处理主要是条件聚合,它具有足够复杂的规则,无法在数据库中轻松完成,因此我在主循环外部声明了一些变量,然后在循环期间对其进行了更改。 variable_1 = 0 variable_2 = 0 for object in queryset : if object.condition_condition_a and variable_2 > 0 : variable 1+= 1 ..... ... . more conditions to alter the variables return queryset, and context 因此,根据理论,我应该将所有代码分解为较小的方法,以使视图方法的最大长度为一页。 但是,过去曾经在各种代码基础上工作过,当您需要不断地从一种方法跳转到另一种方法来查明代码的所有部分,同时又将最外层的方法放在脑海中时,有时会发现它使代码的可读性降低。 我发现拥有一个格式合理的长方法,您可以更轻松地看到逻辑,因为它不会被内部方法隐藏。 我可以将代码分解为较小的方法,但是通常会有一个内部循环用于两三件事,因此这会导致代码更复杂,或者方法只会做两三件事而不做一件事(或者我可以为每个任务重复内部循环,但是这样会影响性能。 那么是否存在长方法并不总是不好的情况?当只在一个地方使用这些方法时,总会有一种情况吗? 更新:好像一年多以前我问了这个问题。 因此,在这里(混合)响应之后,我重构了代码,将其拆分为方法。这是一个Django应用,可从数据库中检索复杂的相关对象集,因此测试参数不可用(可能一年中的大部分时间都需要为测试用例创建相关对象。我有一个“昨天需要做的事情”类型)工作环境,然后再抱怨)。现在,修复该代码部分中的错误现在稍微容易一些,但并不是那么容易。 之前: #comment 1 bit of …

5
显式或隐式实现接口有什么区别?
在Visual Studio中,我可以右键单击一个接口,然后选择“实现接口”或“明确实现接口”。 public class Test : ITest { public string Id // Generated by Implement Interface { get { throw new NotImplementedException(); } } string ITest.Id // Generated by Implement Interface Explicitly { get { throw new NotImplementedException(); } } } 我看到的两者之间的唯一区别是,如果选择显式实现接口,则在创建接口属性和方法时会将接口名称添加到接口属性和方法中。 我发现它使代码更具可读性,因为我可以看到该方法/属性的来源,但是这对使用或编译该类的方式有什么不同吗?我隐式或显式实现接口真的重要吗?
64 c#  syntax 

11
为什么隐秘的短标识符在低级编程中仍然如此普遍?
曾经有很保持指令很好的理由/注册短名称。这些原因不再适用,但是简短的加密名称在低级编程中仍然很常见。 为什么是这样?仅仅是因为旧习惯难以改变,还是有更好的理由? 例如: Atmel ATMEGA32U2(2010?):(TIFR1代替TimerCounter1InterruptFlag),ICR1H(代替InputCapture1High),DDRB(代替DataDirectionPortB)等。 .NET CLR指令集(2002):(bge.s而不是branch-if-greater-or-equal.short)等。 较长的非加密名称不是更容易使用吗? 在回答和投票时,请考虑以下内容。这里建议的许多可能的解释同样适用于高级编程,但是,普遍的共识是使用由一个或两个词组成的非加密名称(不包括通常理解的首字母缩写词)。 另外,如果您的主要论点是关于纸质图表的物理空间,请考虑这绝对不适用于汇编语言或CIL,此外,如果您向我展示一个简短名称适合但易读的名称的图表,我将不胜感激。 。从无晶圆厂半导体公司的个人经验来看,可读名称恰好适合,并可以使图更易读。 低级编程与高级语言相比有什么不同的核心之处,高级语言使简洁的加密名称成为低级编程而不是高级编程的理想选择?

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.