簡體   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