繁体   English   中英

将变量传递给经常更改参数列表的方法

[英]Passing variables to methods with often changing parameter list

我在 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);

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

我可以想到不同的策略:

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

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

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

我希望它有帮助。

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

以下是《Django 的两勺》一书第 9-2 节的摘录:

对于许多实用函数,我们从 django.http.HttpRequest(或简称为 HttpRequest)对象中获取一个或多个属性并收集数据或执行操作。 我们发现通过将请求对象本身作为主要参数,我们在更多方法上有更简单的参数。 是意味着管理函数/方法参数的认知过载更少:只需传入 HttpRequest 对象!

编辑2

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

干杯,

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM