Questions tagged «architecture»

软件系统的高级设计和描述。架构设计提取了实现,算法和数据表示的细节,以专注于“黑匣子”组件的交互。

6
在微服务中,每个服务是单个数据库还是单个数据库实例?
我了解微服务架构中的每个服务都应具有自己的数据库。但是,拥有自己的数据库,实际上是在同一个数据库实例中简单地拥有另一个数据库,还是在字面上拥有另一个数据库实例? 这样,我并不是说共享数据库,这是不对的,而是数据库实例。 例如,如果我使用的是AWS并具有3个服务,那么我是否要在单个RDS实例上为每个服务创建3个数据库,还是要创建3个RDS实例,每个实例都包含一个数据库,供3个服务分别使用? 如果在单个RDS实例上使用多个数据库是一个更好的主意,那么它会否决拥有独立服务的目的,因为: RDS实例的资源将在服务之间共享。在特定时间可能大量使用数据库的服务A是否会影响使用不同数据库但在同一RDS实例上的服务B? 所有服务将取决于该RDS实例上的数据库版本。

14
使用反射是否有问题?
我不知道为什么,但是当我使用反射时,我总是觉得自己在“作弊”-也许是因为我知道我要表现出色。 我的一部分说,如果它是您正在使用的语言的一部分,并且可以完成您尝试做的事情,那么为什么不使用它呢?我的另一部分说,必须有一种无需使用反射即可执行此操作的方法。我想也许这取决于情况。 使用反射时需要注意哪些潜在问题,我应该如何关注它们?尝试寻找更常规的解决方案需要花费多少精力?

9
管理器类是否可以作为不良体系结构的标志?
最近,我开始认为在您的设计中拥有很多经理类是一件坏事。这个想法还不够成熟,我无法提出令人信服的论点,但这里有几点要点: 我发现,要理解高度依赖“经理”的系统要困难得多。这是因为,除了实际的程序组件之外,您还必须了解使用管理器的方式和原因。 在很多时候,管理人员似乎常常被用来缓解设计问题,例如当程序员找不到一种方法来制作程序Just Work TM并不得不依靠管理人员类来使一切正常运行时。 当然,马槽可能很好。一个明显的例子是EventManager,这是我一直以来最喜欢的结构之一。:P我的观点是,经理似乎经常被滥用,除了掩盖程序体系结构的问题外,没有其他充分的理由。 经理班真的是不良建筑的标志吗?


9
为什么构造函数中的while(true)循环实际上不好?
尽管是一个普遍的问题,但我的范围是C#,因为我知道像C ++这样的语言在构造函数执行,内存管理,未定义的行为等方面具有不同的语义。 有人问我一个有趣的问题,对我来说不容易回答。 为什么(或者根本不?)让类的构造函数开始永无止境的循环(即游戏循环)被认为是不好的设计? 有一些与此有关的概念: 像最小惊讶原则一样,用户并不希望构造函数具有这种行为。 单元测试比较困难,因为您无法创建此类或将其注入,因为它永远不会退出循环。 从概念上讲,循环的结束(游戏结束)是构造函数完成的时间,这也是奇怪的。 从技术上讲,此类除了构造函数外没有其他公共成员,这使它很难理解(尤其是对于没有可用实现的语言) 然后是技术问题: 构造函数实际上从未完成,所以GC在这里发生了什么?这个对象已经在Gen 0中了吗? 由于基本构造函数从不返回,因此无法或至少非常复杂地从此类派生 这样的方法是否存在更明显的弊端或弊端?
47 c#  architecture 

11
异步与同步的含义[关闭]
在计算机科学中,异步和同步一词的含义是什么? 如果您用谷歌搜索单词的含义,您将获得以下信息: 异步:不存在或不在同一时间发生。 同步:同时存在或同时发生。 但是似乎它们被用来传达编程或计算机科学中相反的含义: HTML异步属性表示即使HTML仍在解析或下载,脚本也将在下载后立即执行,这意味着脚本和HTML都同时存在并同时发生。 这些术语是用来传达计算机科学中相反的意思的吗?

4
随着团队的成长,如何在整个应用程序体系结构中保持一致性?
作为一家创业公司的唯一开发人员,我能够在我们的应用程序的体系结构和框架中做出很多决定。 快进4年,后来又进行了收购,我有一支5人的团队,很多时候感觉就像是荒野的西部。做出任何设计决定的人都会喜欢它们:在一个地方将DB类型的整数和枚举放在一个地方,在另一个地方使用字符串,此问题的框架,然后在其他地方针对同一问题的不同框架,等等。 如何执行一致性?对我来说,这很重要,但是我的团队成员似乎赞成“如果有效,那么有效”的方法。 我想我的问题很大一部分是:期望这样的标准对我来说是不现实的吗?我遇到这样一个想法:作为扼杀创造力的独裁者,但是做他们想做的事情似乎是不可扩展的。

7
应用层还是领域层?
我正在阅读Evans的“域驱动设计”,并且正在讨论分层体系结构。我刚刚意识到应用程序层和域层是不同的,应该分开。在我正在从事的项目中,它们是混合在一起的,直到我读完这本书(我现在不能说对我很清楚)之后,我才能分辨出它们之间的区别。 我的问题是,由于这两个问题都涉及应用程序的逻辑,并且应该不涉及技术和表示方面,因此,将这两者划定界限有什么好处?

9
退货被认为有害吗?没有它,代码可以起作用吗?
好的,标题有点clickbaity,但是我已经很认真地告诉别人,请不要踢一会儿。我喜欢它如何鼓励以真正的面向对象的方式将方法用作消息。但是,这个棘手的问题一直困扰着我。 我开始怀疑编写良好的代码是否可以同时遵循OO原则和功能原则。我正在设法调和这些想法,而我所坚持的最大症结是return。 纯函数具有两种性质: 使用相同的输入重复调用它总是得到相同的结果。这意味着它是不可变的。其状态仅设置一次。 它不会产生副作用。调用它引起的唯一变化就是产生结果。 那么,如果您发誓要使用return它来传达结果,那么如何才能完全发挥功能呢? 该出来,不问用什么有些人会考虑副作用思想工作。当我处理一个对象时,我不会询问它的内部状态。我告诉它我需要做的事情,它使用其内部状态来弄清楚该如何处理我已经告诉它要做的事情。一旦我告诉了我,我就不会问它做了什么。我只是希望它对它被告知要做的事情有所作为。 我认为“告诉,不要问”不仅仅是封装的另一个名称。当我使用时,return我不知道叫我什么。我不能说这是协议,我必须强迫它处理我的协议。在许多情况下,这表示为内部状态。即使暴露的不是确切的状态,通常也只是对状态和输入args进行一些计算。拥有一个响应界面,可以将结果整理成比内部状态或计算更有意义的结果。那就是信息传递。请参阅此示例。 回想过去,当磁盘驱动器中实际上装有磁盘,而拇指驱动器是您在汽车上做的,而车轮太冷而无法用手指触摸时,我就被教给了令人讨厌的人们如何考虑没有参数的功能。void swap(int *first, int *second)似乎很方便,但是我们鼓励我们编写返回结果的函数。因此,我坚信信念,并开始遵循。 但是现在我看到人们在构建体系结构,在该体系结构中,对象可以通过其构造方式控制结果的发送位置。这是一个示例实现。再次注入输出端口对象似乎有点像out参数的想法。但这就是告诉对象不要告诉其他对象他们所做的事情的方式。 当我第一次了解副作用时,我将其视为输出参数。有人告诉我们不要以令人惊讶的方式进行某些工作,也就是说,不遵守return result公约,以使人们感到惊讶。现在可以肯定,我知道有很多并行异步线程问题会带来副作用,但是返回实际上只是一个约定,您可以将结果压入堆栈,以便以后调用时可以将其弹出。真的就是这些。 我真正想问的是: 是return避免所有这些副作用的苦难并获得没有锁等的线程安全性的唯一方法。还是我可以跟着说,不要以纯粹的功能性方式提出要求?

11
Robert C. Martin用SQL表示什么意思是什么?[关闭]
我一直在阅读/观看Robert C. Martin的很多内容。我碰到他说,由于固态硬盘,SQL是不必要的。当我搜索其他资源以进行备份时,我会收到大量随机文章,描述硬盘驱动器和固态驱动器之间的SQL性能差异(相关但与我要研究的内容无关)。 最终,我不明白他在试图达到什么目的。他是说用No-SQL技术取代SQL吗?他是说在文件系统中的文件中存储数据吗?还是他只是希望人们因为SQLi攻击而停止使用SQL /关系数据库?我担心我错过了他想表达的观点。 我将在此处提供一些链接,以便您可以直接从他的心中读懂: 鲍比表 清洁建筑讲座 首先,他指出应该从系统中完全删除SQL。 解决方案。唯一的解决方案。是从系统中完全消除SQL。如果没有SQL引擎,那么就不会有SQLi攻击。 并且尽管他谈论使用API​​替换SQL,但我不认为他的意思是将SQL放在API后面,因为前面的引用以及他在本文前面所说的。 框架无法解决问题; ... 旁注:在说SQL时,我很确定Robert意味着大多数关系数据库。也许不是全部,而是大多数。无论如何,大多数人还是使用SQL。所以... 如果不使用SQL来持久化数据,那么我们应该使用什么呢? 在回答之前,我还应该注意。罗伯特(Robert)强调,固态驱动器应该改变我们用来持久化数据的工具。SørenD.Ptæus的回答指出了这一点。 我还必须回应“但是数据完整性”组。经过进一步研究,罗伯特说我们应该使用像datomic这样的事务数据库。然后,CRUD变成CR(创建和读取),并且SQL事务完全消失。数据完整性当然很重要。 我找不到涵盖所有这些的问题。我想我正在寻找符合罗伯特指南的替代方案。Datomic是一个,但是是吗?还有哪些其他选项与这些准则匹配?它们在固态驱动器上是否更好地工作?

4
为什么这么多名称空间以com开头
我注意到许多公司都使用“反向域名”名称空间,我很好奇这种做法的起源以及为什么这种做法会持续下去。它是否仅由于死记硬背而继续存在,还是这里可能缺少我想念的出色的体系结构概念? 还请注意以下问题:https ://stackoverflow.com/questions/189209/do-you-really-use-your-reverse-domain-for-package-naming-in-java,可以回答我的问题,但不能回答100 % (如果让您感觉更好,我真的很好奇我是否应该将它用于我的javascript命名间隔工作,但是我对何时何地以及为什么这样更感到好奇,这应该可以帮助我指导javascript答案,而不是bene:“窗口”) 这种做法的示例扩展到文件夹和文件:

11
作为软件架构师,我应该专注于分析日志并修复其他人的错误吗?
自从我毕业(2005年末)以来,我在同一家公司工作,担任c ++软件工程师。一年前,我被提升为软件架构师,但是我发现自己越来越多地参与资格和修复错误以及2级支持。 我有50%的时间花在Notepad ++上,用于分析软件日志并试图找出问题所在。30%的人修复了其他人的错误,其余的(如果有的话)审查了开发人员的意粉代码。 我开始讨厌该产品,并开始考虑退出该公司的战略。 在这种情况下,您认为我能做什么?您还有其他软件架构师还在修复代码中的错误吗?

4
上游和下游服务采用哪种方式?
对于由多个相互调用的服务组成的系统(例如,前端->后端->存储),我经常听到人们使用诸如“下游”或“上游”服务之类的术语。我不清楚这些是指哪个方向。数据双向流动。请求从更多的面向用户的流向更多的后端服务,但是响应却朝相反的方向流动,因此在我看来,可以说是任一种

11
在域丰富的应用程序中检索报告和仪表板数据的最佳实践或设计模式
首先,我想说这似乎是一个被忽略的问题/领域,因此,如果这个问题需要改进,请帮助我将此问题变成一个有益于他人的好问题!我正在寻求实施解决方案的人员的建议和帮助,而不仅仅是尝试的想法。 根据我的经验,应用程序有两个方面-“任务”方面,这主要是域驱动的,用户可以在其中与域模型(应用程序的“引擎”)进行丰富的交互,而报告方面则是用户根据任务侧发生的情况获取数据。 在任务方面,很显然,具有丰富域模型的应用程序应在域模型中具有业务逻辑,并且数据库应主要用于持久性。分离关注点,每本书都为此而写,我们知道该怎么做,太好了。 报告方面呢?数据仓库是可以接受的,还是由于将业务逻辑合并到数据库以及数据本身而设计不当?为了将数据库中的数据聚合到数据仓库数据中,您必须对数据应用业务逻辑和规则,并且该逻辑和规则不是来自您的域模型,而是来自您的数据聚合过程。错了吗 我致力于业务逻辑广泛的大型财务和项目管理应用程序。在报告这些数据时,我经常会做很多汇总工作以提取报告/仪表盘所需的信息,并且这些汇总中有很多业务逻辑。为了提高性能,我一直在使用高度聚合的表和存储过程进行此操作。 例如,假设需要一个报告/仪表板来显示活动项目的列表(设想10,000个项目)。每个项目将需要显示一组指标,例如: 总预算 迄今为止的努力 燃烧率 以当前消耗率计算的预算用尽日期 等等 这些都涉及很多业务逻辑。我不仅在谈论乘数或一些简单的逻辑。我说的是为了获得预算,您必须应用一个包含500个不同费率的费率表,每个费率适用于每个员工的时间(在某些项目中,其他项目具有乘数),应用费用和任何适当的加价等。逻辑是广泛的。为了使客户端在合理的时间内获得大量数据,需要进行大量的聚合和查询调整。 应该首先在域中运行它吗?性能如何?即使使用直接的SQL查询,我也无法获得足够快的数据以使客户端在合理的时间内显示。我无法想象如果要重新为所有这些域对象补水,并在应用程序层中混合,匹配和聚合它们的数据,或者试图在应用程序中聚合数据,那么尝试将这些数据足够快地发送到客户端。 在这些情况下,SQL似乎擅长处理数据,为什么不使用它呢?但是,那么您在域模型之外就有了业务逻辑。对业务逻辑的任何更改都必须在您的域模型和报告聚合方案中进行更改。 对于域驱动设计和良好实践,如何设计任何应用程序的报告/仪表板部分,我实在感到茫然。 我添加了MVC标签,因为MVC是jour的设计风格,并且在我当前的设计中使用了它,但无法弄清楚报告数据如何适合此类应用程序。 我正在寻找这方面的任何帮助-书籍,设计模式,谷歌关键字,文章等等。我找不到有关此主题的任何信息。 编辑和另一个例子 我今天遇到的另一个完美的例子。客户需要为客户销售团队提供报告。他们想要看似简单的指标: 对于每个销售人员,他们迄今为止的年销售额是多少? 但这很复杂。每个销售人员参加了多个销售机会。有些人赢了,有些人没有。在每个销售机会中,都有多个销售人员,每个销售人员根据其角色和参与度分配一定比例的销售功劳。因此,现在想象一下要遍历该域...为每个销售人员从数据库中提取此数据所需要做的对象补液量: 获取所有SalesPeople-> 对于每个获取其SalesOpportunities-> 对于每个获取其销售百分比并计算其销售金额, 然后将所有SalesOpportunity销售金额相加。 这是一个指标。或者,您可以编写一个SQL查询,该查询可以快速有效地完成并对其进行快速调整。 编辑2- CQRS模式 我已经阅读了有关CQRS模式的信息,尽管很有趣,但即使是马丁·福勒(Martin Fowler)也说它未经测试。那么BEEN过去如何解决这个问题。每个人在某个时候或某些时候都必须面对这一点。具有成功记录的既定方法或陈旧方法是什么? 编辑3-报告系统/工具 在这种情况下,要考虑的另一件事是报告工具。Reporting Services / Crystal报表,Analysis Services和Cognoscenti等都希望从SQL /数据库获取数据。我怀疑您的数据稍后会通过您的业务。然而,在许多大型系统中,它们和其他类似的对象仍然是报告的重要组成部分。在这些系统的数据源甚至报告本身中甚至存在业务逻辑的地方,如何正确处理这些数据?

3
Bob叔叔的干净架构-每层都有一个实体/模型类?
背景 : 我试图在我的Android应用程序中使用Bob叔叔的干净架构。我研究了许多开源项目,这些项目试图展示正确的方法,并且发现了一个基于RxAndroid 的有趣实现。 我注意到的是: 在每一层(表示,域和数据)中,都有一个用于同一实体的模型类(正在谈论UML)。另外,每当数据越过边界(从层到另一层)时,都有一些映射器类负责对象的转换。 题 : 当我知道如果需要所有CRUD操作时,它们都将具有相同的属性,是否需要在每个层中都有模型类?还是使用干净的体系结构是规则还是最佳实践?

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.