软件工程

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

3
“状态”还是“状态”?变量名称何时应包含单词“状态”,变量名称应何时包含单词“状态”?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 在阅读代码和有关代码的讨论时,我经常看到“状态”和“状态”这两个词可以互换使用,但是似乎存在以下趋势: 当变量具有旨在指示某物处于某种状态的值时,该变量的名称通常不包含单词“状态”或其缩写。 但是,当函数的返回值用于指示某种状态时,我们倾向于将该值称为“状态码”;当该值存储在变量中时,该变量通常称为“状态”或类似名称。 我想孤立地很好,但是当上述变量实际上是相同的时,就需要做出选择,涉及英语(或一般人类语言)的错综复杂。 当要在两者之间进行歧义消除时,目前流行的编码标准或约定是什么?还是应该始终避免这两者之一? 我想,这个english.stackexchange问​​题也很重要。

9
如何存储记录状态(如待定,完成,草稿,已取消…)
很多应用程序要求其表中的记录具有状态,例如“完成”,“草稿”,“已取消”。存储这些状态的最佳方法是什么?为了说明我在这里得到的是一个(非常简短的)示例。 我有一个简单的Blog应用程序,每个帖子的状态之一是:已发布,草稿或待审核。 我看到的方式有两种在数据库中建模的方式。 “发布”表的文本字段包含状态文本。 Post表的状态字段包含PostStatus表中记录的ID 这里的Blog示例是一个非常简单的示例。枚举(如果支持)可能就足够了。但是,我希望对此问题的回答要考虑到状态列表可以随时更改,因此可以添加或删除更多状态。 谁能解释每个优点/缺点? 干杯! 我最初的选择是,最好使用另一个表并查找状态以使其更适合进行规范化,而且我一直被教导规范化对数据库有好处

3
从整体式迁移到微服务时,如何处理外键约束?
我的团队正在从单一的ASP.NET应用程序迁移到.NET Core和Kubernetes。代码更改似乎正在进行中,并且可以预期,但是我的团队遇到的很多问题都围绕数据库进行。 当前,我们有一个相当大的SQL Server数据库,其中包含了整个业务的所有数据。我提议我们以与拆分代码类似的方式拆分数据库-一个逻辑数据库中的目录数据,另一个数据库中的库存数据,另一个数据库中的订单等-每个微服务都将成为其数据库的关守者。 这就意味着跨微服务边界的外键将必须被删除,跨边界的程序和视图将被禁止。所有数据模型可能会或可能不会驻留在同一个物理数据库中,但是即使它们存在,它们也不应直接相互交互。订单可能仍按ID引用目录项,但不会在数据库级别严格执行数据完整性,并且必须将数据以代码而不是SQL形式联接。 我认为这些损失是迁移到微服务并获得随之而来的可伸缩性优势时的必要折衷。只要我们明智地选择接缝并围绕它们发展,那应该没问题。其他团队成员坚持认为,所有内容都必须保留在同一个整体数据库中,以便所有内容都可以是ACID并在各处保留引用完整性。 这使我想到了我的问题。首先,我对外键约束和加入的立场是否合理?如果是这样,有人知道我可以提供给同事的任何可靠的阅读材料吗?他们的立场几乎是宗教性的,他们似乎不会因马丁·福勒本人告诉他们自己的错而受到任何影响。

1
DTO代替实体有什么用?
我正在研究RCP应用程序,我是这个应用程序的新手。 Spring bean用于编写业务逻辑来保存/获取实体。 但是,我们不是将实体直接发送给客户端,而是转换为DTO并填充客户端。保存时,我们再次将DTO转换为实体并保存。 这些转换有什么好处?有人可以解释吗?
18 java  spring  entity  map  dto 

3
运输测试代码。你为什么不呢?
我想将测试代码与产品一起提供。具体来说,提供一个选项,以便拥有我们程序副本的任何人都可以单击“自检”按钮或在命令行上通过--self-test并运行完整的单元| 集成测试。 我主要是想这样做,以帮助调试在现场发现的问题,因此,当最终用户收到错误报告时,“并且这三项测试在我的计算机上都失败了”,这有可能会为它提供支持。我希望手动测试仪能够运行该单元| 集成测试。 但是,团队的测试认为测试代码不是生产代码,因此不应发货。因为大多数开源项目都附带了一个测试套件,所以我并没有真正理解这个论点。在封闭的软件中,这确实不寻常。 我想为论证的任何方面提供证据或轶事。我已经最好地猜测了哪个堆栈交换站点最合适,但是如果这不合适,请告诉我。

3
健壮性与正确性竞赛[关闭]
已关闭。这个问题需要细节或说明。它当前不接受答案。 想改善这个问题吗?添加详细信息并通过编辑此帖子来澄清问题。 去年关闭。 在“ 需求质量”段落中阅读“代码完成2”,我发现: 是否在竞争属性之间(例如,稳健性和正确性之间)规定了可接受的折衷? (以上是检查复选框质量的一个大复选框) 因此,我在网络,学术书籍等中找到了很多关于稳健性和正确性的定义。 例如: 在“面向对象的软件构造,第二版,Bertrand Meyer,Prentice-Hall,1997”一书中: 正确性:系统在其规格,设计和实施中没有[缺陷]的程度。 鲁棒性:在无效输入或压力环境条件下,系统继续运行的程度。 尽管如此,尚不清楚这两个原因为何以及在哪些情况下可能发生冲突。 我的问题是:为什么这两个属性在竞争中?

6
带中断/返回的Foreach循环与带显式不变和后置条件的while循环
这是检查值是否在数组中的最流行的方法(在我看来): for (int x : array) { if (x == value) return true; } return false; 但是,在我也许是Wirth或Dijkstra读过的一本书中,据说这种风格更好(与内部退出的while循环相比): int i = 0; while (i < array.length && array[i] != value) i++; return i < array.length; 这样,附加的退出条件就成为循环不变式的显式部分,没有隐藏的条件,并且在循环内退出,一切都变得更加明显,并且结构化编程的方式更加明显。我通常优选后者的图案尽可能和所使用的for从-loop只迭代a到b。 但是我不能说第一个版本不太清楚。至少对于初学者来说,它甚至更清晰,更容易理解。所以我仍然在问自己一个问题哪个更好? 也许有人可以对其中一种方法给出很好的理由? 更新:这不是多个函数返回点,lambda或本身在数组中查找元素的问题。这是关于如何编写具有比单个不等式更复杂的不变式的循环。 更新:好的,我看到回答和评论的人的观点:我在这里混入了foreach循环,它本身已经比while循环更加清晰易读。我不应该那样做。但这也是一个有趣的问题,因此我们将其保留为:foreach循环和内部一个额外条件,或者while循环具有一个显式循环不变性和after后置条件。看来带有条件和退出/中断的foreach循环是成功的。我将创建一个没有foreach循环的附加问题(用于链接列表)。

9
多态性在现实世界中如何使用?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 去年关闭。 我试图了解在现实生活中的项目中如何使用多态,但是我只能找到经典的示例(或类似的例子),该示例具有一个Animal带方法的父类speak(),以及许多重写此方法的子类,现在您可以speak()在任何子对象上调用该方法,例如: Animal animal; animal = dog; animal.speak(); animal = cat; animal.speak();

3
为什么Mike Pound用图形卡而不是处理器来测量计算机的计算能力?
我最近在观看一部精彩的Computerphile视频,上面有关于密码的视频,其中Mike Pound吹嘘自己公司的超级计算机具有4个图形卡(准确地说是Titan X)。 作为一个数值模拟爱好者,我梦想着建立一个仅用于模拟工作的桌面。为什么Mike Pound用图形卡而不是处理器来测量计算机的计算能力?如果要构建计算机,我应该进一步关注哪一项?
17 hardware 

1
放置API密钥的位置:自定义HTTP标头与自定义方案的Authorization标头
我正在设计一个通过API密钥使用授权/身份验证的REST API。 我试图找出最合适的位置,然后发现许多人建议使用自定义HTTP标头ProjectName-Api-Key,例如: ProjectName-Api-Key: abcde 但在Authorization标头上使用自定义方案也是可能的,从思想上来说也是正确的,例如: Authorization: ApiKey abcde 另一方面,我发现一个考虑,自定义授权方案可能出乎意料,并且不受某些客户端支持,并且无论如何都会导致自定义代码,因此最好使用自定义标头,因为客户对此没有任何期望。 您希望以哪种方式发送API密钥?

6
作者将接口引用强制转换为任何实现是什么意思?
我目前在试图掌握C#的过程,所以我读通过C#自适应编码由加里·麦克莱恩大厅。 他撰写有关模式和反模式的文章。在实现与接口部分中,他写道: 不熟悉接口编程概念的开发人员通常很难放开接口背后的内容。 在编译时,接口的任何客户端都不应该知道接口正在使用哪种接口实现。这些知识可能导致错误的假设,从而使客户端耦合到接口的特定实现。 想象一下一个常见的示例,其中一个类需要在持久性存储中保存一条记录。为此,它正确地委托给一个接口,该接口隐藏了所使用的持久性存储机制的详细信息。但是,对运行时使用接口的哪个实现进行任何假设都是不正确的。例如,将接口引用强制转换为任何实现都是一个坏主意。 这可能是语言障碍,或者是我缺乏经验,但是我不太明白这意味着什么。这是我的理解: 我有一个免费的有趣的项目来练习C#。我在那里上课: public class SomeClass... 此类在很多地方都使用过。在学习C#时,我读到最好使用接口抽象,因此我做了以下工作 public interface ISomeClass <- Here I made a "contract" of all the public methods and properties SomeClass needs to have. public class SomeClass : ISomeClass <- Same as before. All implementation here. 因此,我进入了所有一些类引用,并用ISomeClass替换了它们。 除了在构造中,我写过: ISomeClass myClass = new SomeClass(); …

2
什么是案例反模式?
今天的TDWTF文章以作者的告白开头: 直到最近,我才知道什么是For-Case反模式,当时有大量文章谴责它为反模式。我确定在某个时候我可能已经使用过它,但是我从来不知道它的名字。它被认为是教科书的反模式,通常意味着对for循环,case语句,要解决的问题或这三者的某种组合的误解。 然后,他继续前进,就好像读者自然会知道For-Case反模式是什么,而无需任何进一步的解释。 但是我没有!我还没有看过Remy谈论的“大量文章”,而且我唯一可以在Google上找到的重要参考文献(除了Remy的文章)是Raymond Chen的博客文章,内容是关于if-if反模式的问题。 。不过,他也没有定义“针对案例的反模式”。 这些家伙在谈论的“案例反模式”是什么,又是什么使它成为反模式?

6
REST端点在发布前显示预览
我正在设计一个新的Web应用程序,该应用程序由REST后端和HTML + JS前端提供支持。 它具有一个POST方法来更改一个实体(我们称为Config),这在应用程序的许多元素的状态下具有多种副作用。假设以这种方式执行POST: POST /api/config BODY {config: ....} 因此,我想在进行这些更改之前显示预览,以使最终用户能够注意到要更改的内容。 我首先想到的是为预览创建一个GET端点,发送实体新状态的主体。这条路: GET /api/preview/items BODY {config: ....} 可能显示具有新配置的项目的新状态。 GET /api/preview/sales BODY {config: ....} 可能会使用新配置显示销售的新状态。 使用GET动词似乎是个好主意,因为我不会更改应用程序的状态。然而,随着使用请求主体的GET请求似乎气馁。 有什么好的做法吗?其他选择可能是使用一种方法将配置存储为草稿,并使用其他方法显示结果,但这将需要额外的步骤,并且必须在服务器中管理草稿: POST /api/preview/config BODY {config: ....} GET /api/preview/items?idPreviewConfig=1

4
如何可视化物理引擎的设计?
我正在开发一个物理引擎,使其很难跟踪整个过程。通常,当我在休息后返回代码时,我只是不记得为什么它不起作用。大多数问题不是简单的编程错误,而是我的物理引擎中的设计缺陷。这就是为什么我应该在编程之前完成设计。 但是,我需要一种方法在纸上书写物理引擎的整个设计。否则,明天我会忘记它,然后再次迷路。UML类图根本不适用于物理引擎的设计。我不是很在乎课程,而是在过程。我认为业务流程图不是真正有用的,因为对流程的单个步骤(框架)进行建模不会帮助我了解引擎在许多步骤上的最终行为。 那么,应该使用哪种图表来帮助我跟踪流程?专业人士使用哪种图表制作物理引擎?

1
继续更新Web应用程序中使用的Bootstrap版本是否有意义?
对于可能不知道的人来说,Bootstrap是HTML,CSS和JS框架,可以用作构建网站或Web应用程序的基础或起点。 现在,我处于生产中的应用程序中,该应用程序是使用框架的版本3设计的,但具有与该公司投资组合中的其他网站一致的其他样式。 但是,我们将对该Web应用程序进行大量扩展,我想知道-我是否应该更新该应用程序正在使用的引导程序的版本? 我问这个有几个原因。首先是bootstrap的版本4与版本3并不完全向后兼容-许多辅助类已被更改,替换或完全删除,因此更新工作量不小(不是多余,但不是只需更新package.json中的版本号,然后重新构建即可)。 现在,我对引导程序的理解是,它最初是关于使您的网站/ Web应用程序起步的-可以这么说(因此得名)。但是考虑到应用程序已经超出了引导点,我是否应该考虑花费时间来更新引导框架? 我知道从表面上看这似乎是一个带有明显答案的问题-当然,您可以使自己的东西保持最新状态!!!但是,如果您将Bootstrap视为入门的一种方式,那么在启动并运行后,为什么还要继续更新框架本身?您已经为应用程序的需求定制了零件-您是否应该允许自己朝不同的方向发展? 如果Bootstrap作为框架真的是关于入门的(不同于像Rails或Django这样的框架在整个应用程序的生命周期中都在不断提高生产力),那么在某个时候,您是否应该与入门框架分离? (例如,如果您克隆了一个Angular入门仓库来开始构建您的应用程序,那么您会在4或5个月后回来并尝试将对该入门仓库的更新合并到您现在处于活动状态的应用程序中吗?) PS。这是我第一次在这里提出问题-如果这不是该论坛的适当类型的问题,我事先表示歉意。

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.