使用 SOC 和 SRP 时,我应该担心代码块之间传递的参数过多吗?
Posted
技术标签:
【中文标题】使用 SOC 和 SRP 时,我应该担心代码块之间传递的参数过多吗?【英文标题】:When using SOC & SRP should I be concerned about too much parameter passing between code blocks? 【发布时间】:2016-08-28 19:00:54 【问题描述】:在“Web 应用程序对用户输入做出反应”的典型场景中,我应该在多大程度上分解单个任务?
例如,在下面的案例中,假设场景是“用户提交表单,导致用户数据转换为对象(技术细节),然后保存到数据库中”。
我正在使用各种服务来获取、过滤、对象化和保存数据。具体来说,例如,在我下面的$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
);
为了清晰
我们将“参数传递”称为“布线”。
首先,我的电汇是$inputData
,我从inputService
收到。
我把那根电线送入filterService
,它会返回
电线的另一端称为$filteredData
。
我把电线的那一端送到objectService
。
作为回报,我得到了$domainObject
的接线端。
我把它输入repository
,然后收到回ID
我将$id
线的一端连接到我的ViewModel
,这就是端点。
^^^^ 以上是我所做的所有接线,当我使用关注点分离将我的代码分成inputService, filterService, objectService, repository, ViewModel
的各种代码结构时需要进行这些接线。
接线将它们连接在一起。
我可以“作弊”并将一些代码结构合并在一起,以最大限度地减少通过线路。 (尽量减少到处传递参数)。
这就是我的问题所在。
问题
单个代码结构的连接(各种服务之间的参数传递)是一件好事吗?我应该做更多吗?我应该少做吗?是否有一种我不知道的技术使它成为非问题?
【问题讨论】:
也许您可以在 CodeReview 上询问,这是获取代码反馈的好地方 这看起来像一个纯粹的通用示例。如果您确实在 Code Review 上提出问题,请务必发布您的真实代码。 代码审查建议我去程序员。如果程序员建议我去 SO,它将创建一个无限循环引用。 Code Review 是一个小得多的社区,过去我的问题只是挂在那里没有答案。如果我确实在几天或几周后得到答案,我通常会渴望继续前进,而答案对我来说没有多大用处。我更喜欢 SO 或程序员,因为我的问题在那里得到解答。代码审查是我的问题去死的地方。 Code Review 拒绝了您的问题,这让我有点困惑。考虑在他们的 Meta 网站上问一个关于这个的问题。在这里发布您的问题当然没有错,但是 Stack Overflow 并没有什么特别之处使它比 Code Review 更适合。 @Dennis 您的代码审查问题在哪里?我在任何地方都看不到它。 Code Review 建议你去哪里找程序员? 【参考方案1】:我会说这取决于您要解决的问题的业务逻辑和领域。如果你看到像 Ruby On Rails 或 Laravel 这样的框架,他们会尝试使用 MVC 来解决常见的 Web 应用程序问题。但是,这些框架开始变胖(例如,您可以找到代码超过 2000 行的控制器或模型,即著名的具有大量业务逻辑的 User 模型)。
这已经普及了两种方法。
-
在不同的技术中使用微服务,而不是单一的应用程序。
OOP 概念的使用,例如关注点(php 中的特征)、组合、行为的混合、拆分逻辑的引擎等等。
所以我想说,如果您有一个简单的应用程序,并且未来不打算让它拥有数百个功能,那么带有帮助程序的简单 mvc 流就足够了。如果您的应用计划大幅增长,您应该考虑前面提到的替代方案。
这是一个非常有争议的话题,有几篇关于伟大程序员的文章,比如 David Heinemeier Hansson 的 this one。 this 也是来自 Railsconf 中 Sandy Metz 的纯金。其他不错的资源是this question。
【讨论】:
以上是关于使用 SOC 和 SRP 时,我应该担心代码块之间传递的参数过多吗?的主要内容,如果未能解决你的问题,请参考以下文章