软件工程

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

3
RESTful API:具有共享或特定URL的HTTP动词?
创建RESTful API时,应该在相同的URL上使用HTTP动词(如果可能),还是在每个操作中创建特定的URL? 例如: GET /items # Read all items GET /items/:id # Read one item POST /items # Create a new item PUT /items/:id # Update one item DELETE /items/:id # Delete one item 或使用特定的网址,例如: GET /items # Read all items GET /item/:id # Read one item POST /items/new # …

4
是否有充分的理由使纯函数不公开?
我和一位同事进行了一些辩论。简而言之,是否有充分的理由隐藏/封装纯函数? “纯”是指维基百科定义: 始终从相同的输入返回相同的结果。(出于讨论的Foo Create(){ return new Foo(); }目的,如果Foo不具有值语义,则认为这是不纯的。) 不使用可变状态(局部变量除外)或I / O。 不会产生副作用。

3
为什么要增加指针?
我最近才开始学习C ++,并且由于大多数人(根据我一直在阅读的内容),我一直在努力使用指针。 不是传统意义上的,我了解它们的含义,为什么使用它们,以及它们如何有用,但是我无法理解递增指针的使用方式,谁能提供一个解释如何递增指针的解释。有用的概念和惯用的C ++? 在我开始阅读Bjarne Stroustrup 的《A C ++之旅》一书之后,就提出了这个问题,我被推荐这本书,因为我对Java非常熟悉,Reddit的家伙告诉我这将是一本很好的“转换”书。 。
25 c++  c  pointers 

3
为什么没有针对本地机器代码的python编译器?
据我了解,造成编译语言与python之间速度差异的原因是,第一个方法将代码一直编译到本机计算机的代码,而python编译为python字节码,由PVM解释。我看到这种方式python代码可以在多个操作系统上使用(至少在大多数情况下),但是我不明白,为什么没有额外的(和可选的)python编译器,其编译方式与传统编译器相同。这将留给程序员选择,这对他们来说更重要。本机上的多平台可执行性或性能。一般来说; 为什么没有可以同时编译和解释的语言?

1
Code Complete的作者在谈论隐藏全局数据时意味着什么?
在Code Complete 2nd Edition的6.4节中,有一段有关隐藏全局数据的段落。我特别感兴趣的是McConnell(该书的作者)提供了隐藏全球数据的好处的示例。有一个我无法理解的例子。我没有这本书的英文版,所以我将尝试翻译文本。 隐藏全局数据。(...)您可以在不修改程序的情况下更改数据的结构。 麦康奈尔是什么意思?他是在谈论改变全球数据吗?如果是这样,为什么在使用检索数据的方法时不必修改程序?还是他在这里指的是其他东西? 如果有人能消除我的困惑,我将不胜感激。如果您还可以提供一个示例,那就太好了(您知道示例非常棒)。


2
Web应用程序的创建者缺乏专业知识来进行扩展是否常见?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 当我看Twitter之类的东西时,这个想法一开始实施起来很简单,因此创始人不必具有很高的技术才能。基本上,这只是一个有好主意的人。但是,当应用程序/软件崩溃并带来更艰巨的工程问题时,创始人如何应对? 我们是否曾遇到过这样的情况,即具有好主意的原始人在某种程度上会从企业中脱身,因为它更多地涉及技术挑战而不是思想方面?
25 startup 

7
解决主键不属于您的业务领域的事实
在几乎所有情况下,主键都不是您的业务领域的一部分。当然,您可能会拥有一些具有唯一索引的重要的面向用户的对象(UserName针对用户或OrderNumber订单),但是在大多数情况下,除了单个或多个值外,无需通过单个值或一组值公开标识域对象。管理用户。即使在那些特殊情况下,尤其是在使用全局唯一标识符(GUID)的情况下,您也会希望或希望使用备用键而不是公开主键本身。 因此,如果我对域驱动设计的理解是准确的,则不需要主键,因此也不必公开主键,这是很好的方法。他们很丑,使我的风格狭窄。但是,如果我们选择在域模型中不包括主键,则会产生以下结果: 天真的,仅从域模型组合中得出的数据传输对象(DTO)将没有主键 传入的DTO将没有主键 因此,可以肯定地说,如果您真的要保持纯洁并在域模型中消除主键,那么您应该准备能够根据该主键上的唯一索引来处理每个请求吗? 换句话说,在删除领域模型中的PK之后,下列哪种解决方案是处理识别特定对象的正确方法? 能够通过其他属性识别需要处理的对象 在DTO中获取主键;即,从持久性映射到域时消除PK,然后从域映射到DTO时重新组合PK? 编辑:让我们具体化。 说我的域模型VoIPProvider,其中包括像场Name,Description,URL,以及引用喜欢ProviderType,PhysicalAddress和Transactions。 现在让我们说我想构建一个允许特权用户管理VoIPProvider的Web服务。 在这种情况下,用户友好的ID可能没有用;毕竟,VoIP提供商是出于商业原因其名称在计算机意义上趋于不同甚至在人性意义上趋于不同的公司。因此,可以说一个唯一VoIPProvider性完全由决定(Name, URL)。因此,现在让我们说我需要一种方法,PUT api/providers/voip以便特权用户可以更新VoIP提供程序。他们发送一个VoIPProviderDTO,其中包括的很多但不是全部字段VoIPProvider,包括可能会展平的字段。但是,我看不懂他们的想法,他们仍然需要告诉我我们正在谈论的提供商。 看来我有2个(也许3个)选项: 在我的域模型中包含主键或备用键,并将其发送给DTO,反之亦然 通过唯一索引确定我们关注的提供商,例如 (Name, Url) 引入某种总是可以在持久层,域和DTO之间映射的中间对象,而不会暴露有关持久层的实现细节-例如,在从域到DTO并返回时引入内存中的临时标识符,

1
要求贡献者在github上重新放置他们的拉取请求是否正确
我维护了一个相对流行的github仓库。 当合并请求很好合并时,我通常会要求作者在合并之前将其重新设置为单个提交(特别是在进行多个小修改时)。 这是git的好习惯吗?这是可接受/标准的GitHub礼节吗? 因此有一些好处: 我在提交日志中得到了很好的干净提交历史记录 我不需要自己更改提交 它委托一些工作 一些可能的缺点: 我不确定这是不是很好的礼节 我不确定这是否是个好习惯 我通常已经要求进行其他一些更改-这是又一个更改,我不想阻止贡献者。
25 github  etiquette 

12
“尝试……抓住……最终”构造的“最终”部分是否必要?
某些语言(例如C ++和PHP的早期版本)不支持构造的finally一部分try ... catch ... finally。有finally必要吗?因为其中的代码始终运行,所以为什么不/不应该将代码放在try ... catch没有finally子句的块之后?为什么要用一个?(我正在寻找使用/不使用的原因/动机finally,不是取消“捕获”的理由,或者这样做的合法性。)

4
使用Git Stash作为工作流是否是反模式?
最近,我一直在研究我和我的团队如何使用Git以及我们的工作流程如何工作。我们目前使用的功能分支工作流程似乎运行良好。 我还看到我们团队中的某些人使用基于git stash的工作流。工作流程如下所示: 在主分支上工作(如master) 随手提交 如果需要更改或切换分支,请将未提交的更改推送到存储中 更新完成后,将更改从隐藏项中弹出。 我应该提到,此工作流代替了功能分支工作流。在这里,开发人员只需要在一个分支上工作,而不是采用分支机构就可以按照自己的意愿推送/弹出堆栈。 实际上,我认为这不是一个很好的工作流程,因此分支比以这种方式使用git stash更合适。我可以将git stash的值视为紧急操作,但不能用于日常的常规工作流程中。 定期使用git stash是否会被视为反模式?如果是这样,可能会出现哪些具体问题?如果没有,有什么好处?

11
为什么C中的void表示不无效?
在Java和C#等强类型语言中,void(或Void)作为方法的返回类型似乎意味着: 此方法不返回任何内容。没有。没有回报。您不会从此方法收到任何信息。 真正奇怪的是,在C语言中,void作为返回类型甚至方法参数类型的含义是: 真的可以是任何东西。您必须阅读源代码才能找到答案。祝好运。如果这是一个指针,那么您应该真的知道自己在做什么。 考虑以下C语言示例: void describe(void *thing) { Object *obj = thing; printf("%s.\n", obj->description); } void *move(void *location, Direction direction) { void *next = NULL; // logic! return next; } 显然,第二个方法返回一个指针,根据定义,该指针可以是任何东西。 由于C早于Java和C#,因此为什么这些语言采用void“ nothing”的含义,而C却使用“ nothing or any(当指针时)”呢?
25 c  pointers 

1
使用Reactive Extensions进行异步网络编程
该问题是从Code Review Stack Exchange 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 5年前。 socket多年前(以基于事件的异步模式(EAP)方式)进行了一些(或多或少)“低级”异步编程之后,最近又将其“升级”到了TcpListener(异步编程模型(APM)),然后尝试转到async/await(基于任务的异步模式(TAP))时,我不得不忍受所有这些“低级管道”的困扰。所以我在想;为什么不试一试RX(Reactive Extensions),因为它可能更贴近我的问题领域。 我编写的代码很多,许多客户端通过Tcp连接到我的应用程序,然后启动双向(异步)通信。客户端或服务器可以随时决定是否需要发送消息,所以这不是您的经典request/response设置,而是更多的实时,双向,“线路”开放给双方以发送他们想要的任何内容,只要他们想要。(如果有人用一个得体的名字来形容这一点,我将很高兴听到它!)。 每个应用程序的“协议”有所不同(并且与我的问题并不相关)。我确实有,但是有一个最初的问题: 假设只有一个“服务器”正在运行,但是它必须跟踪许多(通常是数千个)连接(例如客户端),每个连接都有(由于缺乏更好的描述)自己的“状态机”来跟踪其内部状态等,您更喜欢哪种方法?EAP / TAP / APM?RX甚至可以考虑吗?如果没有,为什么? 因此,我需要使用Async,因为a)它不是请求/响应协议,所以我不能在“等待消息”阻止调用或“发送消息”阻止调用中使用线程/客户端(但是,如果发送是仅阻止该客户端,我可以忍受它)b)我需要处理许多并发连接。我看不到使用阻塞调用(可靠地)执行此操作的方法。 我的大多数应用程序都与VoiP相关;无论是来自SIP 科学家的 SIP消息,还是来自FreeSwitch / OpenSIPS等应用程序的PBX(相关)消息,但是您可以以最简单的形式尝试想象一个“聊天”服务器尝试处理许多“聊天”客户端。大多数协议都是基于文本的(ASCII)。 因此,在实现了上述技术的许多不同排列之后,我想通过创建一个对象来简化我的工作,该对象可以简单地实例化,告诉它在哪IPEndpoint听,并在发生任何感兴趣的事情时告诉我(通常我通常会这样做)使用事件,因此通常将某些EAP与其他两种技术混合使用)。该类不应费力尝试“理解”协议。它应该只处理传入/传出的字符串。因此,我着眼于RX希望(最终)可以简化工作,我从头开始创建了一个新的“小提琴”: using System; using System.Collections.Concurrent; using System.Net; using System.Net.Sockets; using System.Reactive.Linq; using System.Text; class Program { static void Main(string[] args) { var f = new …
25 c#  .net  tcp 



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.