问题标签 [cohesion]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
oop - 凝聚力与单一职责
我已经开始研究像凝聚力这样的概念和像单一责任原则这样的原则。我对它们之间的区别感到非常困惑。
网络上有很多信息,但我发现很难过滤出正确的比较。
凝聚力和单一职责之间的关系是什么?一个类是否有可能只有一个职责但内聚度低?
design-patterns - 什么时候提高程序内聚会恶化耦合?
我最近参加了一个设计原则和模式的考试,考试中的一个问题是:“有时提高程序内聚可能会恶化耦合,举个例子。”
据我了解,凝聚力是一个类/模块如何专注于解决它为解决而创建的问题,或者更好的是,它在完成这项工作方面有多好。它做不该做的工作吗?然后将该部分移动到不同的类/模块。
耦合是许多类/模块之间的依赖级别。这意味着无论我们是否对不同的模块/类进行重大更改,一个好的类/模块都会起作用。
我曾经向自己解释这一点的一种方式是这个例子:调酒师的工作是制作咖啡和其他饮料。一个好的调酒师应该做好他的工作,那就是煮咖啡,这会增加他的凝聚力,但如果他开始拖地并为顾客服务,他就会脱离工作,从而失去凝聚力。一个好的调酒师也不应该受到其他工作人员的影响,这意味着他的耦合度很低。换句话说,如果清洁工一天早上不来上班,他的工作应该不受影响。
所以如果我的理解是正确的,这意味着增加内聚不应该对耦合产生负面影响,就像告诉调酒师更专注于咖啡不会让他更依赖清洁女工一样。
我错过了什么吗?我对内聚/耦合的理解有缺陷吗?抱歉读了很久!
php - 是否有可以根据自定义边界规则限制类导入的 PHP linter?
我们有一个 monorepo,其中包括我们的旧单体以及我们的新模块。(我们不想要单独的回购......但是)
我们显然不希望我们的新模块耦合到单体应用。我们也不希望某些模块依赖于其他模块。例如:OrderModule
可以依赖于PaymentModule
,但反之则不然。
是否有防止“不当”凝聚力的 phpcs 或 linter 规则?限制进口的东西会起作用。
JavaScript 的 ESLint 具有no-restricted-imports
,no-restricted-modules
并将nx-enforce-module-boundaries
强制执行自定义边界规则。是否有 PHP 等价物?
奖励:我们使用的是 DDD 六边形架构,因此我们甚至可以使用这些规则来强制分离应用程序、域和基础设施层!
java - 我不明白为什么 test[number-1] 重复并返回不同的布尔值
这是计算给定矩阵是否为幻方的子代码。我只是对重复的 test[element -1] 感到困惑并且有两个不同的返回。
coding-style - 为什么不建议或不可能创建最大内聚类?
我正在学习 Robert C. Martin “Clean Code”(2009 年)的书,并且偶然发现了凝聚力的概念(第 10 章)。罗伯特引用:
每个方法都使用每个变量的类具有最大的内聚性。一般来说,创建这种具有最大凝聚力的类既不可取,也不可能……
不幸的是,我在任何地方都没有找到详细的解释。有没有人用真实的代码示例对此进行解释?
提前谢谢了!!
java - 如何将高内聚模型分解为不同的类
我有一个容器,里面有 8 个继电器。现在我想让客户端打开/关闭不同的继电器。到目前为止,一切都很好。
一种解决方案可能是:
1表示relais 1,true表示尝试开启;false 意味着尝试将其关闭。如果我要添加更多与继电器本身相关的方法(改变颜色,自毁或其他一些创造性的东西^^),而不是容器,容器接口将会长大。
所以我认为一个好主意是为每个继电器都有一个自己的课程,这样你就可以做这样的事情
现在我也有不同的规则: 它只允许 8 个继电器中的 6 个可以设置为打开。(容器的任务确保这一点)。
所以在那种情况下我有几个问题:
我从 getRelais 得到的 Relais 是贫血的,它只保持 relais 状态,但功能在容器中,因为只有容器知道是否允许 tryTurnOn(true)。(或者我应该将行为放入继电器中,通过容器访问其他继电器?) 我遇到的第二个问题是循环依赖:继电器发送打开容器的愿望,所以它必须知道容器。容器还必须知道它的子节点(relais),以检查是否有比 6 更多的relais根据结果,他直接从继电器访问状态并更改它。
- 那么还有其他解决方案吗?
- 如何解决这个循环、封装、告诉-不问的问题
- 我必须做的,到这里来一个面向对象的方法
问题的一种扩展:
也许我想在那里添加更多规则:
- 管理员可以打开 7 个继电器,普通用户只能打开 6 个继电器。
- 如果我的模型中可能的太阳亮度超过 80%,则只允许打开 3 个继电器(管理员和普通用户)。
- 如果阳光超过 95%,控制器将关闭所有继电器。
您将如何以 OO 风格对这些进行建模?问题域看起来非常有凝聚力,因为所有人都必须了解所有人。你会把行为放在哪里,你会把行为分成不同的组件吗?我现在不知道如何以 OO 风格执行此操作,对我来说,无论如何都会在某些过程代码中产生结果。但这就是我问的原因^^
microservices - 使用来自其他服务的过滤器进行微服务分页。大凝聚力
我们目前正在尝试打破我们在微服务中的单体应用,而我目前遇到了一个用例问题。
我们有来自客户的以下用例/请求
- 用户可以得到bookdetails
- 用户可以管理私人笔记
- 用户可以管理私人收藏的书籍
现在我们创建了一个复杂的访问过程。如果您对这些书籍有可见性,则有一些过滤器可以声明。例如,他们可以随时更改,客户购买新订阅并可以即时访问这些书籍。每个请求一本书,都必须使用这个访问逻辑。在大多数用例中,它是一个简单的访问服务,如果您可以访问一本书,它就会返回。所以理论上我们可以创建一个“接入微服务”。
但是在收藏夹列表中,我们对 sql 请求进行了分页。在这个sql请求中都包含了访问过滤器,这确实很痛苦。我现在的问题是,如何创建一个分页收藏夹列表,其中另一个微服务定义了一个过滤器。
目前我最好的解决方案是获取客户的所有收藏夹,使用缓存中的访问服务过滤所有这些收藏夹,然后在缓存中进行分页。但与往常一样,有些客户的收藏夹中有大约 5,000 本书。
听起来很奇怪,您的收藏夹中可以有一本书,而您看不到。这是因为您的订阅可能会过期,如果您购买新订阅,我们不想从您的收藏夹中删除这本书。还有一些不同的设备可以提供较少的书籍。这意味着您可以在网站上看到这本书,但在智能手机应用程序上可能看不到。(不同的用例有不同的应用程序)
如何将这些用例拆分为好的微服务?我目前正在阅读很多关于微服务的内容,他们说微服务不应该互相调用。收藏夹服务应该如何知道客户在当前设备上可以访问哪些书籍?访问服务与几乎所有服务都有很大的内聚力,我怎样才能消除这种内聚力?我无法缓存客户对收藏夹服务的访问(我们有大约 1mio 书籍和客户。)。
c# - C# 属性和标准类结构度量
我试图了解如何根据 C# 属性计算基本类结构指标,例如 ATFD(访问外部数据)和 LCOM(方法缺乏凝聚力)。
如果一个方法访问另一个类的单个属性,这是否意味着该方法的 ATFD 分数为 1?这会根据是否有支持的私有字段而改变吗?
对于 LCOM,当遵循 NDepend 制定的公式(例如https://www.ndepend.com/docs/code-metrics#LCOM )时,该属性是否算作字段或方法(或两者都算) 。
当我们有一个与属性相关的显式私有字段时,这将如何改变 - 即,以下 A 类和 C 类的 LCOM 差异是什么:
collision - 在 Abaqus 中碰撞后实体的键合/合并
是否可以在 Abaqus 中对碰撞后实体或网格元素的合并或结合进行建模?从我目前所见,内聚元素和内聚接触可用于模拟两个组件之间的粘合剂或界面脱粘,以及断裂扩展。从高层次来看,我认为这个或类似的标准可以用来描述身体的结合,而不是分离。
如果该理论不适用,有谁知道是否有可能根据碰撞的动能或类似的东西来制定连接网格元素的标准(可能通过一些子程序)。当谈到描述两层之间的粘附开始时,可能有四个不同的标准。当超过某个接触压力时,当两个边界彼此相距一定距离时,从分析的最开始,并且当满足用户定义的布尔表达式时。这篇 COMSOL Multiphysics 博客文章 ( https://www.comsol.com/blogs/how-to-model-adhesion-and-decohesion-in-comsol-multiphysics/ )讨论了这一点以及通过接触模拟粘附力.
任何与此想法相关的信息将不胜感激。
java - 使用 Enum 存储常量并在多个类中使用这些常量
我目前正在编写解决旅行商问题的遗传算法。我在多个地方使用了一些“常量”。但是,这些值需要预先计算,因此,我无法将它们存储到私有静态最终变量中。因此,我决定使用枚举。
我的问题是,你认为这是一个好方法吗?我不确定这是否会降低使用枚举的每个类的凝聚力。提前致谢。