【问题标题】:Passing variables to methods with often changing parameter list将变量传递给参数列表经常变化的方法
【发布时间】:2018-06-07 21:05:08
【问题描述】:

我在 php 中使用 MVC 模型。 控制器正在向模型发送数据,有时它期望得到一些回报。 当我写我的网页时,我添加了需要来自模型的更多信息的实用程序。大多数情况下,它使控制器向模型接口传递更多参数。问题是模型接口大多只将这些变量传递给另一个方法,所以参数列表应该在几个地方改变。这显然是不可接受的,那么应该如何处理呢? 我认为传递数据数组不是最好的主意,因为它会使它无法控制。任何东西都可以添加任何东西。 目前我正在使用另一种解决方案。我创建了一个特殊的类来处理这个。它们中的每一个都派生自一个包含类似“getAsArray()”方法的类。我认为为几乎每个控制器的需求创建一个特殊的类是浪费时间和资源,所以这是我的问题:这个问题的最佳解决方案是什么?有哪些共同的想法?

控制器

 public function addUser(){
   $this->load->model("User"); 
   $username = $this->someWayOfGettingData("username");
   $email = $this->someWayOfGettingData("email");
   $password = $this->someWayOfGettingData("password");
   $this->User->insert($username, $email, $password);
}

型号

private function someMethodOperatingOnData($username, $email, $password){
   $answer = $this->queryAdd($username, $email, $password);
   return $answer;
}

public function insert($username, $email, $password){
   return $this->someMethodOperatingOnData($username, $email, $password); 
}

问题是什么:当我决定添加有关用户的其他信息(例如性别)时,我必须更新

中的参数列表
insert($username, $email, $password);
someMethodOperatingOnData($username, $email, $password);
queryAdd($username, $email, $password);

到:

insert($username, $email, $password, $gender);
someMethodOperatingOnData($username, $email, $password, $gender);
queryAdd($username, $email, $password, $gender);

所以我必须更新每个传递这些变量的函数。我可以使用数组:

insert($arrayOfData);
someMethodOperatingOnData($arrayOfData);
queryAdd($arrayOfData);

但任何东西都可以添加或删除这些变量,我不希望这种情况发生。

【问题讨论】:

  • 您能否举例说明您认为是什么问题,很难准确理解您看到的问题是什么。
  • 这与 MVC 无关……当然你甚至不知道 MVC 是什么……所以你怎么会知道。
  • 哦,我看到了伟大的捷列斯科说话了。你没有以任何方式帮助我,但你侮辱了我。伟大的!感谢您的帮助!

标签: php oop parameter-passing


【解决方案1】:

我可以为此想出不同的策略:

1) 正如您当前所做的那样,创建一个自定义类,使用您的参数对其进行实例化,然后将其传递。但是,由于参数列表不断变化,您的普通旧数据类将成为移动目标,即成本高昂。

2) 您可以创建一个字典并将这些参数放入该字典并传递它。它在 OO 世界中是一种反模式,但对您来说可能是一个合理的解决方案。

3) 在 Django 世界中,最佳实践之一是完全传递请求。这种方法使您的方法签名保持干净。与上面的#2相比,这更有利。

希望对你有帮助。

编辑 我不是 PHP 人。将字典视为键值对。在 PHP 中,数组实际上是键值对。因此,您可以在 PHP 术语中使用数组,或者在 Smalltalk 等其他语言中使用字典。所以这个选项仍然成立,虽然我选择的术语不是 100% 正确,但想法或原则仍然相同。

以下是本书Two Scoops of Django第9-2节的节选:

对于许多效用函数,我们采用一个或多个属性 来自 django.http.HttpRequest(或简称 HttpRequest)对象和 收集数据或执行操作。我们发现的是 将请求对象本身作为主要参数,我们有 更多方法的更简单的论点。是意味着更少的认知超负荷 管理函数/方法参数:只需传入 HttpRequest 对象!

EDIT2

我刚刚看到您对问题所做的修改。因此,从您给出的示例来看,似乎正在发生的是您有一个用户类。随着时间的推移,可能需要向用户类添加更多属性。比如20年前,还没有MobilePhone这样的财产,但现在几乎是强制性的。因此,自然最好的方法是将该成员属性添加到您的 User 类中。用适当的数据实例化它并传递用户对象,而不是单独的用户属性 在你可以实例化用户对象之前,你可以传递#3中提到的请求对象,之后,你可以使用用户目的。我相信这是你最好的路线。

干杯,

【讨论】:

  • AFAIK 在 php 中没有字典这样的东西,所以这个选项退出了。你能解释一下“完全通过请求”是什么意思吗?
  • 请查看我的 Edit2 @Skyel
  • 感谢您的回答!这对我来说很有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 2012-11-06
  • 1970-01-01
  • 2018-09-03
  • 2019-12-10
  • 1970-01-01
相关资源
最近更新 更多