在 MVC 模式中将模型和操作划分为 类 的最佳方法是什么
What's the best approach to divide model and actions into classes in MVC pattern
假设我有一个包含大量字段的 class Employee
。我有很多与数据库相关的操作,比如 CRUD、过滤器等。
在 MVC 模式中,所有这些东西都可以放在模型部分的一个 class 中。但同样,如果我有很多字段和很多动作怎么办。如何正确拆分为 classes 基本对象人员(字段、基本方法:getter 和 setter、toString 等)和操作。喜欢 Employee
和 EmployeeActions
?或者任何最好的方法?需要你的经验)
我认为如果模型仅包含模型的定义 类,getter 和 setter 以及所有业务逻辑都在单独的 类 - 也许是单独的层,您可以将它们称为 EmployeeActions或者更好的 EmployeeManager 以这样的方式我们将逻辑与定义分开。
但这仅在您有复杂的应用程序时才需要。有时引入任何额外的层可能会给代码增加不必要的复杂性。
我认为一个好的答案是:
https://softwareengineering.stackexchange.com/a/165470
原则上,domain model,例如模型层,例如"model",应该分为以下几个部分:
- Entities, e.g. domain objects (like your
Employee
) and value objects。每个实体不仅包含特定数据,而且最重要的是,还包含与其相关的所需行为(仅)。
- Data mappers 抽象(如
EmployeeMapperInterface
)。它们的实现(如 EmployeeMapper
)不应该是域层的一部分。数据映射器是负责在实体和数据库(或任何其他持久层)之间传输数据的对象。所以它们是唯一知道如何通过 API 与数据库通信的组件。例如。它们包含 SQL statements/calls。此类语句不应以任何方式成为实体的一部分,因为多个应用程序可以使用相同的实体,并且并非所有应用程序都需要数据库访问权限,或者与其他应用程序具有相同的数据库访问权限。这些实体甚至根本不应该知道任何持久性。
- 作为可选的抽象层:repository 抽象(如
EmployeeRepositoryInterface
,或 EmployeeCollectionInterface
,或 EmployeesInterface
)。它们的实现(如 EmployeeRepository
、或 EmployeeCollection
、或 Employees
)也不应位于域层中,而应位于其边界之外。它们是具有从模型组件中隐藏持久性类型的作用的构造,并且有两个 functionalities/characteristics:1)它们将实体从域模型传输到数据映射器,以更新数据库数据和 2)他们使用相应的数据映射器从数据库中存储实体集合"fetched",使其可用于领域层。
- 服务,作为 service layer 的一部分(如
AuthorizationService
)。可以有应用程序服务,如果需要,还可以有域服务(由前者使用)。这些服务处理所有其他域层组件,以便正确响应用户需求。从用户的角度来看,它们是领域模型的唯一入口。
- 外部服务的抽象(如
MailServiceInterface
,或PaymentServiceInterface
,或PrintingServiceInterface
)。它们的实现(如 ExampleMailer
、PayPalPayment
或 PdfPrinter
)位于域模型之外。
资源:
- How should a model be structured in MVC?
- Keynote: Architecture the Lost Years - Presentation given by Robert Martin, licensed under a Creative Commons Attribution ShareAlike 3.0.
- The Clean Architecture 作者:罗伯特·马丁
- Sandro Mancuso : An introduction to interaction-driven design
- Unbreakable Domain Models (with slides). Additional to it: The Clean Code Talks - Inheritance, Polymorphism, & Testing.
- Brainstorming your way from a Monolith to a Clean Architecture by Victor Rentea
假设我有一个包含大量字段的 class Employee
。我有很多与数据库相关的操作,比如 CRUD、过滤器等。
在 MVC 模式中,所有这些东西都可以放在模型部分的一个 class 中。但同样,如果我有很多字段和很多动作怎么办。如何正确拆分为 classes 基本对象人员(字段、基本方法:getter 和 setter、toString 等)和操作。喜欢 Employee
和 EmployeeActions
?或者任何最好的方法?需要你的经验)
我认为如果模型仅包含模型的定义 类,getter 和 setter 以及所有业务逻辑都在单独的 类 - 也许是单独的层,您可以将它们称为 EmployeeActions或者更好的 EmployeeManager 以这样的方式我们将逻辑与定义分开。 但这仅在您有复杂的应用程序时才需要。有时引入任何额外的层可能会给代码增加不必要的复杂性。
我认为一个好的答案是: https://softwareengineering.stackexchange.com/a/165470
原则上,domain model,例如模型层,例如"model",应该分为以下几个部分:
- Entities, e.g. domain objects (like your
Employee
) and value objects。每个实体不仅包含特定数据,而且最重要的是,还包含与其相关的所需行为(仅)。 - Data mappers 抽象(如
EmployeeMapperInterface
)。它们的实现(如EmployeeMapper
)不应该是域层的一部分。数据映射器是负责在实体和数据库(或任何其他持久层)之间传输数据的对象。所以它们是唯一知道如何通过 API 与数据库通信的组件。例如。它们包含 SQL statements/calls。此类语句不应以任何方式成为实体的一部分,因为多个应用程序可以使用相同的实体,并且并非所有应用程序都需要数据库访问权限,或者与其他应用程序具有相同的数据库访问权限。这些实体甚至根本不应该知道任何持久性。 - 作为可选的抽象层:repository 抽象(如
EmployeeRepositoryInterface
,或EmployeeCollectionInterface
,或EmployeesInterface
)。它们的实现(如EmployeeRepository
、或EmployeeCollection
、或Employees
)也不应位于域层中,而应位于其边界之外。它们是具有从模型组件中隐藏持久性类型的作用的构造,并且有两个 functionalities/characteristics:1)它们将实体从域模型传输到数据映射器,以更新数据库数据和 2)他们使用相应的数据映射器从数据库中存储实体集合"fetched",使其可用于领域层。 - 服务,作为 service layer 的一部分(如
AuthorizationService
)。可以有应用程序服务,如果需要,还可以有域服务(由前者使用)。这些服务处理所有其他域层组件,以便正确响应用户需求。从用户的角度来看,它们是领域模型的唯一入口。 - 外部服务的抽象(如
MailServiceInterface
,或PaymentServiceInterface
,或PrintingServiceInterface
)。它们的实现(如ExampleMailer
、PayPalPayment
或PdfPrinter
)位于域模型之外。
资源:
- How should a model be structured in MVC?
- Keynote: Architecture the Lost Years - Presentation given by Robert Martin, licensed under a Creative Commons Attribution ShareAlike 3.0.
- The Clean Architecture 作者:罗伯特·马丁
- Sandro Mancuso : An introduction to interaction-driven design
- Unbreakable Domain Models (with slides). Additional to it: The Clean Code Talks - Inheritance, Polymorphism, & Testing.
- Brainstorming your way from a Monolith to a Clean Architecture by Victor Rentea