使用 SOC 和 SRP 时,我是否应该担心代码块之间传递的参数过多?
When using SOC & SRP should I be concerned about too much parameter passing between code blocks?
在 "Web application reacts to user input" 的典型场景中,我将单个任务分解到什么程度?
例如,在下面的案例中,假设场景是 "User submits a form, causing user data to be turned into an Object (technical detail) and then saved into the database" .
我正在使用各种服务来获取、过滤、对象化和保存数据。具体来说,例如,在我下面的 $domainObject = ...
行中,仅将数组中的数据复制到一个对象中(类似于此 What is a name for a pattern where it receives data or asks for data and returns back an object?)
我想问的是,如果继续将我遇到的个人问题分离为各种 类、服务和方法,从长远来看,我是否会让我自己或未来的维护者变得更难 运行?
class Controller
{
//saves a domain object acquired from an HTML form & other sources
function saveAction()
{
// acquire data from GET, POST, COOKIE, SESSION, database, et
$inputData = $this->inputService->acquireData();
// clean data
$filteredData = $this->filterService->filter($inputData);
// marshall data into an object
$domainObject = $this->objectService->createObject($filteredData);
//save object into a database
$id = $this->repository->save($domainObject);
// Send $id to View
return new ViewModel(array(
'id' => $id
);
}
为了清楚起见
让我们称 "parameter passing" 为 "wiring"。
- 所以,首先,我的电汇是
$inputData
,我从 inputService
收到。
- 我把那根电线送入
filterService
,return
电线的另一端称为 $filteredData
.
- 我把电线的那一端送入
objectService
。
- 在 return 中,我得到
$domainObject
线的末端。
- 我把那一端送入
repository
,然后收到 ID
- 我将电线的
$id
端 运行 放入我的 ViewModel
,这就是端点。
^^^^ 以上是我使用关注分离将我的代码分成 inputService, filterService, objectService, repository, ViewModel
的各种代码结构时需要进行的所有连接。
电线将它们连接在一起。
我可以 "cheat" 并将一些代码结构合并在一起,以最大限度地减少传递线路的次数。 (尽量减少到处传递参数)。
这就是我的问题。
问题
连接各个代码结构(在各种服务之间传递参数)是一件好事吗?我应该做更多吗?我应该少做吗?有没有一种我不知道的技术可以解决这个问题?
我会说这取决于业务逻辑和您要解决的问题的领域。如果您看到像 Ruby On Rails 或 Laravel 这样的框架,它们会尝试使用 MVC 来解决常见的 Web 应用程序问题。然而,这些框架开始变胖(例如,您可以找到超过 2000 行代码的控制器或模型,即具有大量业务逻辑的著名用户模型)。
这推广了两种方法。
- 在不同的技术中使用微服务,而不是单一的应用程序。
- OOP 概念的使用,例如关注点(PHP 中的特征)、组合、行为的混合、拆分逻辑的引擎等等。
所以我想说的是,如果您有一个简单的应用程序,并且未来不打算让它发展成数百个功能,那么一个带有帮助程序的简单 mvc 流程就足够了。如果您的应用计划大幅增长,您应该考虑之前提到的替代方案。
这是一个非常有争议的话题,有几篇伟大的程序员的文章,比如 this one from David Heinemeier Hansson. Also this is pure gold from Sandy Metz in railsconf. And other nice resource is 问题。
在 "Web application reacts to user input" 的典型场景中,我将单个任务分解到什么程度?
例如,在下面的案例中,假设场景是 "User submits a form, causing user data to be turned into an Object (technical detail) and then saved into the database" .
我正在使用各种服务来获取、过滤、对象化和保存数据。具体来说,例如,在我下面的 $domainObject = ...
行中,仅将数组中的数据复制到一个对象中(类似于此 What is a name for a pattern where it receives data or asks for data and returns back an object?)
我想问的是,如果继续将我遇到的个人问题分离为各种 类、服务和方法,从长远来看,我是否会让我自己或未来的维护者变得更难 运行?
class Controller
{
//saves a domain object acquired from an HTML form & other sources
function saveAction()
{
// acquire data from GET, POST, COOKIE, SESSION, database, et
$inputData = $this->inputService->acquireData();
// clean data
$filteredData = $this->filterService->filter($inputData);
// marshall data into an object
$domainObject = $this->objectService->createObject($filteredData);
//save object into a database
$id = $this->repository->save($domainObject);
// Send $id to View
return new ViewModel(array(
'id' => $id
);
}
为了清楚起见
让我们称 "parameter passing" 为 "wiring"。
- 所以,首先,我的电汇是
$inputData
,我从inputService
收到。 - 我把那根电线送入
filterService
,return 电线的另一端称为$filteredData
. - 我把电线的那一端送入
objectService
。 - 在 return 中,我得到
$domainObject
线的末端。 - 我把那一端送入
repository
,然后收到 ID - 我将电线的
$id
端 运行 放入我的ViewModel
,这就是端点。
^^^^ 以上是我使用关注分离将我的代码分成 inputService, filterService, objectService, repository, ViewModel
的各种代码结构时需要进行的所有连接。
电线将它们连接在一起。
我可以 "cheat" 并将一些代码结构合并在一起,以最大限度地减少传递线路的次数。 (尽量减少到处传递参数)。
这就是我的问题。
问题
连接各个代码结构(在各种服务之间传递参数)是一件好事吗?我应该做更多吗?我应该少做吗?有没有一种我不知道的技术可以解决这个问题?
我会说这取决于业务逻辑和您要解决的问题的领域。如果您看到像 Ruby On Rails 或 Laravel 这样的框架,它们会尝试使用 MVC 来解决常见的 Web 应用程序问题。然而,这些框架开始变胖(例如,您可以找到超过 2000 行代码的控制器或模型,即具有大量业务逻辑的著名用户模型)。
这推广了两种方法。
- 在不同的技术中使用微服务,而不是单一的应用程序。
- OOP 概念的使用,例如关注点(PHP 中的特征)、组合、行为的混合、拆分逻辑的引擎等等。
所以我想说的是,如果您有一个简单的应用程序,并且未来不打算让它发展成数百个功能,那么一个带有帮助程序的简单 mvc 流程就足够了。如果您的应用计划大幅增长,您应该考虑之前提到的替代方案。
这是一个非常有争议的话题,有几篇伟大的程序员的文章,比如 this one from David Heinemeier Hansson. Also this is pure gold from Sandy Metz in railsconf. And other nice resource is