使用 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"。

^^^^ 以上是我使用关注分离将我的代码分成 inputService, filterService, objectService, repository, ViewModel 的各种代码结构时需要进行的所有连接。

电线将它们连接在一起。

我可以 "cheat" 并将一些代码结构合并在一起,以最大限度地减少传递线路的次数。 (尽量减少到处传递参数)。

这就是我的问题。

问题

连接各个代码结构(在各种服务之间传递参数)是一件好事吗?我应该做更多吗?我应该少做吗?有没有一种我不知道的技术可以解决这个问题?

我会说这取决于业务逻辑和您要解决的问题的领域。如果您看到像 Ruby On Rails 或 Laravel 这样的框架,它们会尝试使用 MVC 来解决常见的 Web 应用程序问题。然而,这些框架开始变胖(例如,您可以找到超过 2000 行代码的控制器或模型,即具有大量业务逻辑的著名用户模型)。

这推广了两种方法。

  1. 在不同的技术中使用微服务,而不是单一的应用程序。
  2. OOP 概念的使用,例如关注点(PHP 中的特征)、组合、行为的混合、拆分逻辑的引擎等等。

所以我想说的是,如果您有一个简单的应用程序,并且未来不打算让它发展成数百个功能,那么一个带有帮助程序的简单 mvc 流程就足够了。如果您的应用计划大幅增长,您应该考虑之前提到的替代方案。

这是一个非常有争议的话题,有几篇伟大的程序员的文章,比如 this one from David Heinemeier Hansson. Also this is pure gold from Sandy Metz in railsconf. And other nice resource is 问题。