2011-08-14 39 views
1

這是我得到的功能:如何使這個功能更通用和可擴展?

function update_user_information($aUserId, $aName, $aPassword) 

如果我想更新多一個屬性,我需要做的是這樣的:

function update_user_information($aUserId, $aName, $aPassword, $aEmail) 

如果用戶表不斷擴大,我的功能將永遠改變,如何使未來更新更簡單?謝謝。

回答

2

我會創建一個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()添加更多的功能。

+1

+1這是面向對象的方式,它應該完成的方式。 –

+0

@DrCasper我不同意。 Getters和setter違反了封裝,如果它不適用於update方法,則上面的代碼與C中的Struct一樣多。另外,new'關鍵字的任何用法都應隱藏在構建器或工廠中。 – Gordon

+0

@戈登 - 這不是純粹的OOP,這只是一種避免param/s作爲數組和一個函數的20個參數的方法,我只是提供了一種處理具有向後可比性的動態操作的方法。 – fatnjazzy

1

使用字符串數組作爲參數:

function update_user_information(array $parameters) 

烏爾使用一類

+0

陣列將使整個維護操作不可能。其他程序員很可能每次都需要查看源代碼。 – fatnjazzy

2

考慮創建一個用戶類,並且然後使該作爲參數。

傳遞參數數組使得下一個程序員很難確定預期的參數。

0

創建更新和用戶類。

$ins->update->user(array('username' => 'Thomas')); 

當然,你可以做的不僅僅是用戶類。

或者你可以傳遞用戶對象。

$user->username = 'Thomas', $ins->update($user); 
0

我做「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 
    } 
    } 
} 
1

最簡單的將是傳遞一個數組(就像是現在已經提過幾次)

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')); 

唯一的缺點是,你仍然需要新的存取增加時,你需要額外的領域製造商,但是這是一個很小的代價爲你實現這種方式的靈活性。