问题标签 [grasp]

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.

0 投票
3 回答
11819 浏览

oop - 纯制造和间接之间的区别

我试图找到可以解释这两者之间差异的教程和好的示例,但找不到任何信息。

纯粹的制造和间接行为是为了创建中间对象并将职责分配给中间对象,那么任何人都可以解释这些设计模式之间的区别吗?

谢谢!

0 投票
2 回答
3247 浏览

grasp - GRASP信息专家和GRASP凝聚力有什么区别?

这两个概念非常相似,很难分辨哪个是哪个。

请举例说明如何区分它们。

0 投票
2 回答
1681 浏览

design-patterns - SOLID GRASP 控制器模式?

我有一个关于应用 GRASP 控制器模式同时保持其 SOLID 的问题,更具体地说,同时保持它的单一职责。

维基百科的控制器模式定义说:

控制器模式将处理系统事件的责任分配给代表整个系统或用例场景的非 UI 类。控制器对象是负责接收或处理系统事件的非用户界面对象。

关于 SOLID 的单一责任原则

在面向对象编程中,单一职责原则指出每个类都应该有单一职责,并且该职责应该完全由类封装。它的所有服务都应与该责任密切相关。

让我们来看一些示例代码。假设我有以下 Java 类:

什么是一个好的控制器实现,同时保持一个单一的责任?我只是通过用例还是什么?例如:

我在这里承担一项责任吗?我这样做或理解正确吗?事先谢谢你。

编辑:如果bazController有这种方法会发生什么,使两个类相关?

0 投票
1 回答
120 浏览

java - GRASP 之后的 Java 参数传递

所以我有一个名为的类Game,我需要Game根据它们的会话 ID 从数据库中检索几个对象,所以我有这个方法:

好的,但我必须在那里传递一个参数,这样我才能知道我想要检索哪个会话的游戏,并且我有两种可能性。我可以传递一个int或者我可以传递一个Session具有属性的对象,id然后使用session.getID(). 最后,两者基本上都会产生相同的结果,但我想知道的是别的东西。

我的问题是,这是一种更好的方法,如果我传递一个对象,这是否意味着它与 GRASPGame高度耦合Session并违反了GRASP

0 投票
1 回答
51 浏览

class - 继承类的泛化

有2种不同的设计。第二个是(下)第一个的改进版本。不同之处在于我向 B 添加了 2 个子类。所以 A 现在依赖于 2 个子类。但是如果 B 以后有更多的子类会发生什么?

这真的是最佳实践吗?尤其是 GRASP 的观点?

两个不同的版本

0 投票
3 回答
305 浏览

oop - 两个类之间的业务规则拆分

我有一个具有以下业务规则的项目分配域

  1. 当一名新员工被分配到一个项目时,总支出不应超过预算金额。
  2. 对于员工,总分配百分比不应超过 100%

我已经创建了如下所示的实体C#

问题

Allocate逻辑分为两个类 - Project 和 Employee ..作为参数传递给 Allocate 方法,而不是作为类的List<Allocation>属性添加......这是正确的方法还是我需要List<Allocation>在这两个类中添加作为属性?

笔记:

数据库

在此处输入图像描述

权利

在此处输入图像描述

代码

项目

员工

参考

以下来自没有 ORM 的存储库模式

有什么行为需要客户有订单列表?当您更多地考虑您的域的行为(即在什么时候需要什么数据)时,您可以根据用例对聚合进行建模,并且事情变得更加清晰和容易,因为您只需跟踪一小部分对象的更改在聚合边界。

我怀疑 Customer 应该是没有订单列表的单独聚合,而 Order 应该是带有订单行列表的聚合。如果您需要对客户的每个订单执行操作,请使用 orderRepository.GetOrdersForCustomer(customerID); 进行更改,然后使用 orderRespository.Save(order);

0 投票
0 回答
1569 浏览

java - GRASP——信息专家模式——方法

在以下情况下,我正在寻找最佳实践方法。我有三个 Java 类:和ManualComponent,它们扩展抽象类并实现以下接口:AutomaticComponentCustomComponentCalculationComponentCalculableComponent

还有另一个类聚合了CalculationComponent这些ComponentBox

一切都很完美,直到我被要求更改calculate(). CustomComponent目前,此方法需要来自其他已计算的CalculationComponents信息(=来自Set<CalculationComponent> components位于ComponentBox此类的信息calculate(components);)。

我对 GRASP 的理解是ComponentBox该类现在是Information Expert,因为现在它包含进行最终计算所需的所有信息 ( calculateAll();)。

我应该如何改变我的课程以获得最佳实践方法?

谢谢您的帮助!M。

0 投票
1 回答
886 浏览

oop - GRASP 的 Information Expert 和 MVC 的 Modell 是一样的吗?

我刚开始阅读 Applying UML and Patterns (2nd edition) 这本书。信息专家的 GRASP 模式之一是否等同于 Modell 形式的 MVC?

他们是否有相同的职责(存储和检索信息)?

0 投票
0 回答
559 浏览

javascript - 重构 Javascript 对象和属性

我有一些代码我可能想多次重构。想象一下,像这样:

所以,我想要一个系统来生成某种数据结构,我可以在其中知道我有哪些命名空间/对象以及它们的方法,所以我可以决定是否要将“changeType”函数名称更改为“setNewType ",我知道仅仅替换原型的“changeType”属性是不够的,还需要 object1 调用该函数,因为它是一个 CustomObject。

所以,我一直在尝试不同的选择。

起初我尝试掌握:

http://graspjs.com/docs/equery/

但是我找不到检测元素范围的方法,我认为这是不可能的。

然后我想到使用 esprima 来创建我的代码的 AST,并可能从那里获取允许我识别对象范围的结构,但我也找不到这样做的方法。

http://esprima.org/

我想这一定是可能的,但也许我正在尝试错误的方式。我知道这也是一项艰巨的任务,所以我当然不是要求有人来解决这个问题,但是任何指向正确方向的提示都会非常有帮助。

谢谢。

0 投票
1 回答
425 浏览

php - 如何在 php(和 javascript)项目中实现用例控制器

我是 PHP 和设计模式的初学者。我在包含 javascript 和 php 的应用程序中实现用例控制器时遇到问题。我正在尝试制作一个学生档案管理器的项目。我有一个“上传分数”的用例,教师上传学生在特定部分的分数。我已经将这个用例中系统操作的职责分配给了一个名为 UploadMarksEventHandler 的类。我只提到了方法和属性,它们还不应该产生输出。这是代码:

上面的代码是针对应用逻辑层的。UI 层的用户将执行诸如 login($teacher_id, $password)、uploadMarks($student_id, $marks) 等操作,并且这些操作中的每一个都作为控制器类 UploadMarksHandler 的职责。问题是,用户将从 UI 层生成操作,我打算在 jquery 中对其进行编码。假设用户在浏览器上按下了一个名为“Upload Marks”的按钮。为此,我将使用 AJAX 创建一个 UploadMarksHandler 对象。我将在 main.php 文件中执行此操作,该文件将用于将 UI 层映射到应用程序逻辑层。

在实例化负责处理“上传标记”用例的 $upload_marks 对象后,我的应用程序应该在 UI 层监听下一个系统操作。假设用户按下一个名为“登录”的按钮。现在,当控件从客户端移回服务器端时,我的 $upload_marks 对象将被删除,因此其状态将丢失。

我搜索了有关在 PHP 中应用 MVC 和控制器的信息,但没有发现关于我的问题的运气。我应该使用 MVC 框架吗?任何帮助表示赞赏。