這是我得到的功能:如何使這個功能更通用和可擴展?
function update_user_information($aUserId, $aName, $aPassword)
如果我想更新多一個屬性,我需要做的是這樣的:
function update_user_information($aUserId, $aName, $aPassword, $aEmail)
如果用戶表不斷擴大,我的功能將永遠改變,如何使未來更新更簡單?謝謝。
這是我得到的功能:如何使這個功能更通用和可擴展?
function update_user_information($aUserId, $aName, $aPassword)
如果我想更新多一個屬性,我需要做的是這樣的:
function update_user_information($aUserId, $aName, $aPassword, $aEmail)
如果用戶表不斷擴大,我的功能將永遠改變,如何使未來更新更簡單?謝謝。
我會創建一個Java風格的Bean。
這種方式我認爲是更合適的方法來保持邏輯簡單。
參見下文如何使用它
class user{
private $name;
private $userName;
public function update(){
///business logic
}
public function getName(){
return $this->name;
}
public function getUserName(){
return $this->userName;
}
public function setName($name){
$this->name = $name;
}
public function getUserName($userName){
$this->userName = $userName;
}
}
//this is how you user it.
$user = new User();
$user->setName('test');
$user->update();
這種方式,你可以無需在每個功能連連處理參數,如插入(),克隆(),sendMailToUser()添加更多的功能。
使用字符串數組作爲參數:
function update_user_information(array $parameters)
烏爾使用一類
陣列將使整個維護操作不可能。其他程序員很可能每次都需要查看源代碼。 – fatnjazzy
考慮創建一個用戶類,並且然後使該作爲參數。
傳遞參數數組使得下一個程序員很難確定預期的參數。
創建更新和用戶類。
$ins->update->user(array('username' => 'Thomas'));
當然,你可以做的不僅僅是用戶類。
或者你可以傳遞用戶對象。
$user->username = 'Thomas', $ins->update($user);
我做「jQuery的」樣式:
$some_helper = new some_helper();
$a_user = new stdClass();
$a_user->userID = 1;
$some_helper->update_something($a_user);
abstract class some_helper_class() {
function extend($defaults, $settings) {
foreach($defaults as $key => $value) {
if (!isset($settings->$key)) {
$settings->$key = $value;
}
}
return $settings;
}
}
class some_helper extends some_helper_class{
function update_something($data) {
$defaults = new stdClass();
// $defaults->userID = 1; // required, so we do not set it now
$defaults->name = 'my name';
$defaults->email = '[email protected]';
$defaults->password = 'secret';
$this->extend($defaults, $data);
$defaults->userID = 1;
// validation is important always
if (count($defaults) != count($data)) {
// Danger ! required values not present.
} else {
// all is well - do your stuff
}
}
}
最簡單的將是傳遞一個數組(就像是現在已經提過幾次)
update_user(array('username' => 'bar'));
但具有以下缺點:您的API不再傳達更新用戶可接受的值。你必須把它放到你的API文檔中。當然,每次你允許設置一個新字段時,你都必須更新它。如果所有必需的值已通過,您還需要檢查函數內部。
如果不固定在使用過程中,您還可以使用Builder模式
class UserBuilder implements ArrayAccess
{
protected $data;
public function setUsername($username) {
$this->data['username'] = $username;
return $this;
}
public function offsetGet($offset) {
return $this->data[$offset];
}
public function getUser() {
$user = new User; // or whatever you use to create new users
$user->update($this);
return $user;
}
…
這將允許你這樣做
$userBuilder = new UserBuilder;
$userBuilder->setUsername('foo');
$user = $userBuilder->getUser();
以及更新現有的創造完全新用戶用戶:
update_user($userBuilder
->setUsername('bar')
->setOtherProperty('baz')
…
);
Builder的API會告訴開發者哪些字段s /他可以設定,而且您還可以逐漸收集價值。使用構建器也會包含創建對象的責任(某些字段可能需要創建更多對象),這比將關鍵字放在整個位置要好。
如果您有一個用戶類,它不需要公開其內部任何內容,並且可以專注於成爲信息專家,並且只公開那些對整個對象進行操作的方法。
class User
{
public function update($userBuilder)
{
$this->username = $userBuilder['username'];
…
}
}
注意,所以無論你傳遞一個數組或一個建設者的實例並不重要,以用戶UserBuilder實現了ArrayAccess。這將工作太:
$user->update(array('username' => 'bar'));
唯一的缺點是,你仍然需要新的存取增加時,你需要額外的領域製造商,但是這是一個很小的代價爲你實現這種方式的靈活性。
+1這是面向對象的方式,它應該完成的方式。 –
@DrCasper我不同意。 Getters和setter違反了封裝,如果它不適用於update方法,則上面的代碼與C中的Struct一樣多。另外,new'關鍵字的任何用法都應隱藏在構建器或工廠中。 – Gordon
@戈登 - 這不是純粹的OOP,這只是一種避免param/s作爲數組和一個函數的20個參數的方法,我只是提供了一種處理具有向後可比性的動態操作的方法。 – fatnjazzy