使用 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 时,我应该担心代码块之间传递的参数过多吗?的主要内容,如果未能解决你的问题,请参考以下文章

ASICASSPSoC和FPGA到底有何区别?

设计模式原则

项目之间的 Javascript IIFE 代码共享

调试和发布配置之间的不同块行为

观察者设计模式方法在做两件事时是否违反SRP:设置和通知

敏捷开发原则-SRP(单一职责原则)