软件工程

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

5
如何在C中应用接口隔离原则?
我有一个模块,例如“ M”,其中有一些客户端,例如“ C1”,“ C2”,“ C3”。我想将模块M的名称空间(即,其公开的API和数据的声明)分配给头文件,使得- 对于任何客户端,仅可见其所需的数据和API;模块的其余名称空间对客户端是隐藏的,即遵守接口隔离原则。 在多个头文件中不重复声明,即不违反DRY。 模块M与其客户端没有任何依赖关系。 客户端不受模块M未被其使用的部分中所做的更改的影响。 现有客户端不受添加或删除更多客户端的影响。 目前,我通过根据模块客户端的需求划分模块的命名空间来解决此问题。例如,在下面的图像中,显示了其3个客户端所需的模块名称空间的不同部分。客户要求有重叠。模块的名称空间分为4个单独的头文件-'a','1','2'和'3'。 但是,这违反了上述某些要求,即R3和R5。违反了要求3,因为这种划分取决于客户端的性质;在添加新客户端时,该分区也会更改并违反要求5。如上图右侧所示,在添加新客户端后,模块的命名空间现在分为7个头文件-'a ”,“ b”,“ c”,“ 1”,“ 2 *”,“ 3 *”和“ 4”。用于2个旧客户端的头文件发生更改,从而触发了其重建。 有没有办法以非人为方式在C中实现接口隔离? 如果是,您将如何处理上述示例? 我想象的是一个虚幻的假设解决方案- 该模块有1个胖头文件覆盖了整个名称空间。该头文件分为可寻址的部分和子部分,如Wikipedia页面。然后,每个客户端都有一个为其量身定制的特定头文件。特定于客户机的头文件只是指向胖头文件的节/子节的超链接的列表。如果构建模块指向模块头文件中的任何部分,则构建系统必须将特定于客户端的头文件识别为“已修改”。
15 c  interfaces  solid 

2
在现代编译器中如何实现泛型?
我的意思是我们如何从某些模板T add(T a, T b) ...进入生成的代码?我已经想到了几种方法来实现,我们将通用函数存储在AST中Function_Node,然后每次使用它时,都会在原始函数节点中存储其自身的副本,其中所有类型都T替换为正在使用。例如add<int>(5, 6)将存储的通用功能的副本add并替换所有类型T 的副本有int。 所以它看起来像: struct Function_Node { std::string name; // etc. Type return_type; std::vector<std::pair<Type, std::string>> arguments; std::vector<Function_Node> copies; }; 然后,您可以为这些代码生成代码,并在访问Function_Node副本列表所在的位置时copies.size() > 0调用visitFunction所有副本。 visitFunction(Function_Node& node) { if (node.copies.size() > 0) { for (auto& node : nodes.copies) { visitFunction(node); } // it's a generic function so we …

5
微服务和消费者的授权和认证系统
我们计划将公司系统重构为基于微服务的系统。该微服务将由我们自己的公司内部应用程序以及需要的第三方合作伙伴使用。一种用于预订,一种用于产品等。 我们不确定如何处理角色和范围。这个想法是创建3个基本用户角色,例如Admins,Agent和End-Users,并让消费者应用程序根据需要微调作用域。 管理员可以默认(针对其公司)创建,更新,读取和删除所有资源。 代理可以为其公司创建,更新和读取数据。 最终用户可以创建,更新,删除和读取数据,但不能访问与代理或管理员相同的端点。他们也将能够创建或修改数据,而不必与代理或管理员处于同一级别。例如,最终用户可以更新或阅读他们的帐户信息,就像代理可以为他们完成此操作一样,但他们看不到或更新管理员注释。 假设代理默认情况下可以为其公司创建,读取和更新每个资源,这是可以为其令牌/会话请求的最大范围,但是客户端(API使用者)应用程序的开发人员已决定他们的代理之一可以仅读取和创建某些资源。 更好的做法是在我们的内部安全性中处理此问题,然后让他们在数据库中写入该数据,还是让客户端通过请求范围较小的令牌在内部进行处理,并让他们编写哪个代理在数据库中具有哪个范围?这样,我们仅需跟踪令牌范围。 不利的一面是,我们的团队还需要在内部应用程序中创建经过微调的访问机制。 用这种思维方式,微服务及其授权系统不应受到客户需求的困扰,因为它们只是消费者,而不是系统的一部分(即使其中一些消费者是我们自己的内部应用程序)? 这是一个好的方法吗?

1
通用C ++包装器能否实现Rust的所有权模型?
浏览有关Rust的并发安全性的这篇文章: http://blog.rust-lang.org/2015/04/10/Fearless-Concurrency.html 我想知道在C ++ 11(或更新版本)中可以实现多少这些想法。特别是,我可以创建一个所有者类,将所有权转移到可能传递给它的任何方法吗?似乎C ++有太多传递变量的方法,这是不可能的,但是也许我可以对类或模板施加一些限制,以确保每次方法传递都执行某些模板代码?

5
如何结合严格的TDD和DDD?
TDD是关于在测试的指导下设计代码的。 因此,通常不预先构建典型的层。它们应该在重构步骤中稍微出现。 域驱动的设计涉及许多技术模式,它们定义了完善的层,如应用程序层,基础结构层,域层,持久性层。 要从头开始DDD项目的编码部分,应如何操作? 我是否应该严格让设计从测试中脱颖而出,这意味着没有关注点分离(没有层次)和重构以适合DDD技术模式? 还是应该创建那些空层(应用程序,实体/域服务,基础结构),并让TDD独立地适合每个层(使用模拟在层之间进行隔离)?

2
私人Github存储库上的合作者是否应该分叉存储库?
目前,我正在一个项目上,我们将源代码保存在Github上的私有存储库中,我们每个人都作为合作者。 我们尚不清楚如何将我们的每项工作分开。 我认为我们需要做的是: 我们每个人都需要分叉存储库 当我们准备推送代码时,我们会向项目负责人的仓库提交拉取请求,而后者可以同时以此为契机进行代码审查 对于私有存储库,这是应该用于分叉的,还是我使情况变得过于复杂?

4
微服务REST或AMQP,在这种情况下
我读过许多有关微服务体系结构的文章,我想知道何时使用AMQP或REST。 我读到服务之间的松耦合是一件好事,在这种情况下,AMQP似乎是一个不错的选择。但是,如果我们使用AMQP,则意味着我们不再需要REST端点(但这意味着我们将失去HATEOAS概念)。 但是REST真的是构建我的服务的好方法吗?原因我将不使用任何端点...在这种情况下,一个端点比另一个端点更好? 什么时候应该使用其中一个?

2
DDD CQRS-每个查询和每个命令的授权
摘要 是否应按命令/查询实现CQRS / DDD中的授权? 我是第一次使用或多或少严格使用DDD CQRS模式的在线应用程序。我遇到了一个问题,我无法真正解决这个问题。 我正在构建的应用程序是分类帐应用程序,允许人们创建分类帐,也允许其他人查看/编辑/删除分类帐,例如员工。分类帐的创建者应该能够编辑他创建的分类帐的访问权限。甚至可以更改所有权。该域具有两个聚合TLedger和TUser。 我读了很多有关DDD / CQRS关键字的文章,涉及安全性,授权等。大多数人说授权是通用子域,除非正在构建安全应用程序。 在这种情况下,核心域当然是对交易,余额和帐户感兴趣的会计域。但是还需要能够管理对分类帐的细粒度访问的功能。我想知道如何用DDD / CQRS术语进行设计。 在DDD教程中,所有命令都是通用语言的一部分。它们很有意义。它们是代表“真实事物”的具体动作。 因为所有这些命令和查询都是用户将在“现实生活”中执行的实际操作,所以授权的实现是否应与所有这些“命令”和“查询”结合使用?例如,用户将具有执行TLedger.addTransaction()的权限,但没有执行TLedger.removeTransaction()的权限。或者,将允许用户执行查询“ getSummaries()”,但不执行“ getTransactions()”。 三维映射将以用户分类帐命令或用户分类帐查询的形式存在,以确定访问权限。 或者,以分离的方式,将为用户注册名为“权限”的权限。然后将为特定命令映射权限。例如,权限“ ManageTransactions”将允许用户执行“ AddTransaction()”,“ RemoveTransaction()”等。 权限映射用户->分类帐->命令/查询 权限映射用户->分类帐->权限->命令/查询 那是问题的第一部分。或简而言之,CQRS / DDD中的授权应按命令还是按查询实施?还是应该将授权与命令分离? 其次,关于基于权限的授权。用户应该能够管理其分类帐或允许其管理的分类帐上的权限。 授权管理命令在分类帐中发生 我想到了将事件/命令/处理程序添加到Ledger聚合中,例如GrantPermission(),revokePermission()等。在这种情况下,强制执行这些规则将发生在命令处理程序中。但这将要求所有命令都包含发出该命令的用户的ID。然后,我将检查到TLedger中是否存在该用户执行该命令的权限。 例如 : class TLedger{ function addTransactionCmdHandler(cmd){ if (!this.permissions.exist(user, 'addTransaction') throw new Error('Not Authorized'); } } 用户中的授权管理命令 另一种方法是将权限包括到TUser中。TUser将具有一组权限。然后,在TLedger命令处理程序中,我将检索用户并检查他是否有权执行该命令。但这将要求我为每个TLedger命令获取TUser聚合。 class TAddTransactionCmdHandler(cmd) { …


4
如果我们产生datareader行而不读取所有记录,数据库连接会关闭吗?
在了解yield关键字的工作原理的同时,我遇到了StackOverflow 上的link1和link2,它主张yield return在DataReader 上进行迭代时使用它,它也适合我的需求。但是,这使我感到奇怪,如果发生如下情况,如果我yield return按如下所示使用,并且如果我不遍历整个DataReader,那么数据库连接会永远保持打开状态吗? IEnumerable<IDataRecord> GetRecords() { SqlConnection myConnection = new SqlConnection(@"..."); SqlCommand myCommand = new SqlCommand(@"...", myConnection); myCommand.CommandType = System.Data.CommandType.Text; myConnection.Open(); myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection); try { while (myReader.Read()) { yield return myReader; } } finally { myReader.Close(); } } void AnotherMethod() { foreach(var rec in GetRecords()) { i++; …
15 c#  database  .net  resources 

1
与每个循环的标准相比,Collection.stream()。filter()。forEach()效率低下吗?
IntelliJ IDEA刚刚向我建议用Java 8“ forEach”调用替换以下for-each循环: for (Object o : objects) { if (o instanceof SomeObject) { doSomething(); } } 推荐的电话如下所示: objects.stream().filter(o -> o instanceof SomeObject).forEach(o -> doSomething()); 除非我误解了Stream的基础功能如何工作,否则在我看来,使用stream是一个O(2n)操作,而不是标准for-each循环的O(n)操作。

2
OCaml批评:它仍然有效吗?
我是OCaml的新手。我最近偶然发现此页面,列出了对OCaml的大量批评。 看到页面很旧(2007年):今天列出的哪些项目符号仍然正确?例如:仍然不可能打印通用对象吗? 我想明确指出,我不是要讨论其中表达的意见。我在问列出的信息(例如整数无警告溢出)是否仍然适用于OCaml的最新版本
15 ocaml 

5
JSON的XSLT等效项
我对寻找(或必要时开发)JSON的XSLT等效项感兴趣。 由于没有发现任何内容,我正在考虑使用可能的查询语言来匹配JSON路径,以便在匹配时应用模板(来自JavaScript)(可能只是按顺序检查匹配模式的数组,然后在第一个匹配的模板,尽管允许使用xsl:apply-templates等效,以使模板适用于子级)。 我知道JSONPath,JSONQuery和RQL是JSON查询语言(尽管我还不太清楚RQL是否支持绝对路径和相对路径)。关于要考虑的因素和每种方法相对优势的任何建议。
15 javascript  json  xslt 

4
如何在依赖注入中处理“循环依赖”
标题说“ Circular Dependency”,但这不是正确的措辞,因为对我来说,设计似乎很牢固。 但是,请考虑以下情形,其中蓝色部分由外部合作伙伴提供,橙色是我自己的实现。还假设有多个ConcreteMain,但我要使用一个特定的。(实际上,每个类都有更多的依赖关系,但是我在这里尝试简化它) 我想通过Depency Injection(Unity)实例化所有这些,但是我显然可以StackOverflowException在以下代码上找到,因为Runner试图实例化ConcreteMain,而ConcreteMain需要一个Runner。 IUnityContainer ioc = new UnityContainer(); ioc.RegisterType<IMain, ConcreteMain>() .RegisterType<IMainCallback, Runner>(); var runner = ioc.Resolve<Runner>(); 我该如何避免呢?有什么方法可以构造它,以便可以与DI一起使用?我现在正在执行的方案是手动设置所有内容,但这ConcreteMain在实例化它的类中具有硬性依赖。这就是我要避免的事情(在配置中使用Unity注册)。 下面的所有源代码(非常简化的示例!); public class Program { public static void Main(string[] args) { IUnityContainer ioc = new UnityContainer(); ioc.RegisterType<IMain, ConcreteMain>() .RegisterType<IMainCallback, Runner>(); var runner = ioc.Resolve<Runner>(); Console.WriteLine("invoking runner..."); runner.DoSomethingAwesome(); Console.ReadLine(); } } …

1
AngularJS指令vs服务vs控制器
我将开始在公司内部网站上执行更改请求,该请求将检查一堆字段并突出显示它们是否符合某些准则。例如,如果出生日期是今天,则该字段将被概述,并且工具提示将显示“祝他们生日快乐!”。 规范要求在页面其余部分完成渲染后再加载,因此不会增加加载时间。由于我是angularJS的新手,所以我不确定应该采用哪种“正确”方法。 问题: 由于这包括添加边框和图像以及标题属性(DOM操作),因此似乎应该使用指令。 但是,这不会像大多数指令那样可重复使用或“简短”。 我需要检查的数据的一半将在页面加载时的原始调用中返回,因此我想保存它,而不会浪费另一个调用来再次获取它,这使我认为服务对于存储所有这些数据将是不错的选择。 我确实知道如何在控制器中执行所有操作,但这是不好的错误代码:P 关于最好的方法有什么想法吗?基本上,我将需要一个http调用来检查所有数据,这将为我需要执行的每种“ Call Out”类型返回一个带有布尔值的对象。然后,我将遍历此列表,如果该值为true,则添加边框,图像和工具提示文本。 我不确定这个问题是否足够清楚,所以如果您要我添加一些详细信息,请询问。谢谢!
15 angularjs 

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.