软件工程

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

4
我应该在布尔型数据库字段中将False作为Null存储吗?
假设您有一个应用程序,该应用程序的表中有一个布尔字段,User称为Inactive。 仅将false存储为null是否有天生的错误?如果可以,请您解释一下不利之处吗?几个月前,我已经与某人讨论了这一点,我们都同意,只要您在整个应用程序/数据库中始终如一地进行操作,就没有关系。最近,我认识的某个人强调应该使用“ true” true或“ true” false,但是他们并没有真正解释原因。

2
理解“接缝”一词的问题
我正在阅读Mark Seemann撰写的“ .NET中的依赖项注入”(这太棒了,而且必须有),并且作者经常使用“ seam”一词。但我不明白这意味着什么。这是使用此词的示例: 第7章介绍了如何在各种具体框架(例如ASP.NET MVC,WPF,WCF等)中组成对象。并非所有框架都同样出色地支持DI,即使在那些框架中,DI的实现方式也有很大差异。对于每个框架,可能很难确定在该框架中启用DI的SEAM。但是,一旦找到SEAM,您就会为使用该特定框架的所有应用程序找到一个解决方案。在第7章中,我已经为最常见的.NET应用程序框架完成了这项工作。可以将其视为框架SEAMS的目录。 感谢您帮助我理解这个词。

8
一个单元的单个或多个文件用于单元测试?
在研究单元测试最佳实践以帮助为我的组织制定准则时,我遇到了一个问题,即分离测试装置(测试类)还是将一个类的所有测试保存在一个文件中是更好还是有用。 首先,我纯粹是指“单元测试”,它们是针对单个类,每个测试一个断言,所有依赖项都被嘲笑的白盒测试。 一个示例场景是一个类(称为Document),它具有两个方法:CheckIn和CheckOut。每种方法实现控制其行为的各种规则等。按照每次测试一个断言的规则,每种方法我将有多个测试。我可以将所有测试放在一个单独的DocumentTests类中,其名称类似于CheckInShouldThrowExceptionWhenUserIsUnauthorized和CheckOutShouldThrowExceptionWhenUserIsUnauthorized。 或者,我可以有两个单独的测试类:CheckInShould和CheckOutShould。在这种情况下,我的测试名称将被缩短,但是它们会被组织起来,以便针对特定行为(方法)的所有测试都在一起。 我确定这两种方法都有优缺点,并且想知道是否有人使用多个文件进行了路由,如果是,为什么?或者,如果您选择了单文件方法,为什么感觉更好呢?

2
有没有人曾经要求过SSL证书的保修?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 8年前关闭。 SSL证书通常会宣传不同数量的担保或保证,例如$ 500,000或$ 1m。 我的问题是,在SSL的历史上,有没有人成功地成功声明过其中一项保证?曾经有过一个案例吗?如果不是,可以假设它们只是营销头是否公平?

4
为什么所有的函数式编程教程都这么数学?
我一直在尝试学习函数式编程,而我发现的大多数教程都将数学作为更复杂的结构(在某些情况下甚至是简单的结构)的示例。为什么是这样?我想可以使用更简单的方法。这使得它很难学习。 背景信息:我已经编写软件已有12年了。我了解一些概念,例如闭包,作为一等公民的功能和泛型。在某些高级水平上,我可能对高阶函数有疑问,但是我想相信我已经掌握了基本知识。Monads在咬我,这时我还没有超越(我敢肯定,最终,因为我坚持不懈)。

4
如何知道两个图像是否相同?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 我有超过10000张图片,其中约2000张是其他格式的副本(例如JPEG,PNG,GIF)。这两个数字每天都在增加。我需要删除这些重复项,为此,我必须知道如何首先找到它们。 我的第一个想法是检查图像像素并查找在相同坐标中具有相同颜色像素的其他图片。但是此选项并不总是有效。假设我搜索重复项。至于可搜索对象,我选择一个8位PNG文件。它会找到该图像的所有副本,但只会找到8位PNG,有时是8位GIF,很少是JPEG(因为我想是图像算法吗?)。 我的第二个想法是复制所有这些图像,并在严格的两种颜色的调色板(例如,黑白)中对它们重新着色,并执行与上述相同的扫描。JPEG图像又不是100%与PNG或GIF格式相似(与上述相同的原因?)。 第三个想法是减少图像需要熟悉的百分比,增加颜色可以变化的百分比,从而导致不必要的图像去除... 有什么想法吗?

6
一个电话号码应允许使用哪些特殊字符?
因此,我正在设计一个供全球用户使用的网页,其中包括来自加拿大,美国,印度,英国等地的用户。我需要对此电话号码字段进行验证,但是我不确定执行此操作的最佳方法。 我能想到的一些有效格式是: 1800123456(印度) 美国电话号码中使用“-” 我对应该允许用户输入哪些特殊字符感到困惑(例如- / ())。过去其他人如何解决这个问题?

7
软件许可:开源,但不分发(免费或牟利)
我用PHP编写了一个程序。我希望人们能够使用该代码来学习,甚至在自己的应用程序中包含一些代码,但我也希望维护出售它的权利,并明确表示其他人不会免费或牟利分发副本。我没有使用其他任何人的代码,因此我不必担心许可证兼容性。哪个许可证适合呢? 我知道我不能阻止人们无视许可证,但我只是希望他们至少知道许可证在那里,并且知道他们尝试做错了什么。我找不到任何用简单的英语解释许可证的地方,是的,我试图阅读GNU和BSD许可证,但我找不到。谢谢。 好的,这是其他人要求的澄清:我将以非常便宜的价格出售此程序。只要人们首先购买了程序,就可以随意使用他们想要的代码,而且他们不会从我的代码中受益。 我不介意人们是否只是把整个东西都花光了,并增加了它并使它变得更好,但后来人们就不诚实了,他们只会添加一些东西并免费提供,然后没人会购买我的产品。 我想我应该让人们拥有它并要求捐款。所以也许我应该使用GPL或BSD。 编辑:我明白为什么每个人都感到困惑。这是矛盾的,但有关法文的事情是,一切似乎都是黑色或白色的。我正在尝试达到灰色区域。我希望人们从我这里购买东西,而不是复制并分发给人们,甚至使用其中的一部分。通过“使用零件”,如果有人随便问我,我会说的是“合理”。因此,基本上不要在您的工作中使用我的大部分代码,而是完全让我感到惊讶,因为您会像我已经完成大部分肮脏的工作一样轻松!我的意思是,当然,我不在乎您的项目中使用我的数据库连接脚本。或者...使用所有代码并添加到其中!但是,仅用于个人用途,您不敢开始分发它,因为我要从这东西上赚钱,这完全破坏了我的工作。而且是 d很高兴向您展示您的新增功能,我会表示赞赏,但主要的是不要重新分发我赖以生存的软件。很难将这种情绪化为法文。我只是不明白所有这些许可证。
20 licensing 

9
“ if password == XXXXXXX”是否足以确保最低安全性?
如果我为具有中到低安全风险的应用程序创建登录名(换句话说,它不是银行应用程序或任何其他应用程序),那么我可以接受用户输入的密码,只需输入类似以下内容的密码即可: if(enteredPassword == verifiedPassword) SendToRestrictedArea(); else DisplayPasswordUnknownMessage(); 这似乎很容易有效,但是我当然不介意是否仅此而已。对用户名/密码组合进行简单检查是否足够? 更新:特定项目恰好是Web服务,验证完全是服务器端的,并且不是开源的。域会改变您的处理方式吗?

11
第一本书怎么样?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我从没看过它们,但是我发现它们的风格有趣而独特。我不确定他们是否值得花时间/金钱?
20 books 

4
作为软件架构师,您应该提出什么建议?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 4年前关闭。 关于StackOverflow和Programmers SE上的软件架构师(SA)的角色,存在很多问题,而且都有很好的答案。我正在尝试提出一个比那些更集中的问题。SA的定义非常广泛,因此,为解决此问题,我们将SA定义如下: 软件架构师指导项目的总体设计,参与编码工作,进行代码审查,并选择要使用的技术。 换句话说,我不是在谈论SA的波峰(不再使用押韵词)类型的管理休息和归属。如果我要从事任何类型的SA职位,我都不想远离编码。我可能会花一些时间与客户和业务分析师等进行交流,但是我仍然在技术上参与其中,而且我不仅了解会议的进行情况。 考虑到这些要点,SA应该带来什么?他们是否应该怀有“放下法律”(可以这么说)的思想,并强制某些工具的使用以符合“他们的方式”,例如编码指南,源代码控制,模式,UML文档等?还是应该指定初始方向和策略,然后根据需要摆放并跳入以纠正船的方向? 根据组织的不同,这可能不起作用。依靠TFS来执行所有事务的SA可能会在仅使用StarTeam的雇主那里难以实施其计划。同样,根据项目阶段的不同,SA也需要保持灵活性。如果这是一个新项目,则他们有更多选择,而现有项目则可能更少。 以下是一些我作为共享背景知识而经历过的SA故事,希望我的问题的答案也能为这些问题提供一些启示: 我曾与一名SA一起工作过,该SA的代码实际上检查了团队的每一行代码。SA不仅会为我们的项目,而且还会为组织中的其他项目执行此操作(想象在此上花费的时间)。起初,强制执行某些标准很有用,但后来却变得残酷。FxCop是SA如何发现问题的方法。别误会,这是教导初级开发人员并强迫他们考虑他们选择的方法的后果的好方法,但是对于高级开发人员而言,这被认为有些苛刻。 一个特定的SA反对使用某个库,声称它很慢。这迫使我们编写大量代码来实现不同的目标,而另一个库可以为我们节省很多时间。快进到项目的最后一个月,客户抱怨性能。唯一的解决方案是,尽管有开发人员的早期警告,仍要更改某些功能以使用最初忽略的方法。到那时,很多代码被扔掉并且不可重用,从而导致超时和压力。可悲的是,用于该项目的估算是基于我的项目被禁止使用的旧方法,因此它不是合适的估算指标。我会听到总理说“我们以前做过” 将在所有项目中强制使用DTO,DO,BO,服务层等的SA。新开发人员必须学习此体系结构,并且SA严格执行使用指南。当绝对难以遵循使用指南时,会出现例外情况。SA是基于他们的方法。DTO和所有CRUD操作的类都是通过CodeSmith生成的,而数据库模式则是另一个相似之处。但是,在所有地方都使用了此设置之后,SA并未接受诸如LINQ to SQL或Entity Framework之类的新技术。 我没有将此帖子用作发泄的平台。我对上述SA故事的经历有正面和负面的方面。我的问题归结为: SA应该带来什么? 他们如何在决策中取得平衡? 是否应该以必须执行某些基本规则的心态来从事SA工作(如先前所定义)? 还有什么需要考虑的吗? 谢谢!我确信这些工作任务很容易扩展到高级开发人员或技术负责人,因此也可以以这种身份随意回答。

3
我应该如何提供有关异常的其他信息?
每当我需要提供有关异常的其他信息时,我都会想知道哪种方法实际上是正确的方法。 为了这个问题,我写了一个例子。假设有一个我们要更新Abbreviation属性的类。从SOLID的角度来看,这可能并不完美,但是即使我们通过具有某些服务的DI 传递了工作方法,也会发生相同的情况-发生异常,并且没有上下文。回到示例... class Person { public int Id { get; set; } public string Name { get; set; } public string Abbreviation { get; set; } } 然后是该类的一些实例和一个调用worker方法的循环。它可以抛出StringTooShortException。 var persons = { new Person { Id = 1, Name = "Fo" }, new Person { Id = 2, Name …
20 c#  exceptions 

2
在git中,创建与已删除分支同名的标记是个坏主意吗?
我有一个带有git分支模型的项目,该模型大致遵循nvie的git-flow的模型。 我们的发行分支以SemVer格式命名,例如v1.5.2 一旦发布分支允许生产,我们就关闭该分支,方法是将其合并到master中,应用标签,然后删除该分支。 当我们立即删除发布分支时,我们一直在使用相同的标识符来标记分支,例如 v1.5.2 这是我们用于关闭发布分支的命令: $ git checkout master $ git merge v1.5.2 $ git tag -a v1.5.2 -m "Version 1.5.2 - foo bar, baz, etc" $ git branch -d v1.5.2 $ git branch -dr origin/v1.5.2 $ git push origin :v1.5.2 $ git push $ git push --tags 这似乎在大多数情况下都可行,但是在git …

1
复制关于接口实现/重写文档的好坏?
所以我们有一个像这样的界面 /// <summary> /// Interface for classes capable of creating foos /// </summary> public interface ICreatesFoo { /// <summary> /// Creates foos /// </summary> void Create(Foo foo); /// <summary> /// Does Bar stuff /// </summary> void Bar(); } 最近,我们播放了一个文档故事,涉及生成并确保像上面那样有大量XML文档。但是,这导致了很多重复的文档。示例实现: /// <summary> /// A Foo Creator which is fast /// </summary> …

4
为什么不使用SQL而不是GraphQL?
最近,我了解了GraphQL,它声称比RESTful更好。但是,我开始怀疑为什么不将SQL语句简单地放入HTTP GET请求中。 例如,在GraphQL中,我将编写 { Movie(id: "cixos5gtq0ogi0126tvekxo27") { id title actors { name } } } 这并不比它的SQL比较简单 SELECT id, title FROM movies WHERE id = cixos5gtq0ogi0126tvekxo27; SELECT actors.name FROM actors, actors_movies WHERE actors.id == movies.actor_id AND movie.id == cixos5gtq0ogi0126tvekxo27; 也许我们可以对查询进行URL编码并发送到服务器 GET endpoint?q=SELECT%20id%2C%20title%20FROM%20movies%20WHERE%20id%20%3D%20cixos5gtq0ogi0126tvekxo27%3B%0ASELECT%20actors.name%20FROM%20actors%2C%20actors_movies%20WHERE%20actors.id%20%3D%3D%20movies.actor_id%20AND%20movie.id%20%3D%3D%20cixos5gtq0ogi0126tvekxo27%3B HTTP/1.1 是的,查询URL可能太长,但是如果您不关心REST遵从性,则可以将其放入POST请求的正文中。(顺便说一句,我认为需要对REST进行HTTP RFC的修订才能有意义:限制查询字符串的长度从一开始就将实现与规范混合在一起) 从客户端直接发出SQL的优势还在于 解析GraphQL不需要服务器端代码/库,从而减少了开发时间。 解析GraphQL不需要服务器端开销,从而减少了运行时间。 SQL语句比GraphQL灵活得多,因为(在大多数情况下)GraphQL无论如何都会简化为SQL。 每个人都知道SQL。 那么,GraphQL与SQL相比有什么优势?

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.