如何使这个功能更通用和可扩展?

时间:2011-08-14 09:59:43

标签: php

这是我得到的功能:

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

如果我想再更新一个属性,我需要做这样的事情:

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

如果用户表保持扩展,我的功能将始终改变,如何使以后更新更简单?谢谢。

6 个答案:

答案 0 :(得分:2)

考虑创建一个User类,然后将其作为参数传入。

传入一系列参数会使下一个程序员很难确定预期的参数。

答案 1 :(得分: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();

通过这种方式,您可以添加更多功能,如insert(),clone(),sendMailToUser(),而无需在每个函数中反复处理参数。

答案 2 :(得分:1)

使用字符串数组作为参数:

function update_user_information(array $parameters)

你使用一个类

答案 3 :(得分: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会告诉开发人员他/她可以设置哪些字段,并且您还可以逐步收集值。使用构建器还将限制创建对象的责任(某些字段可能需要创建更多对象),这比将new个关键字放在所有位置更好。

如果你有一个User类,它不需要公开它的任何内部结构,并且可以专注于成为一个Information Expert,并且只公开那些对象作为一个整体进行操作的方法。

class User
{
    public function update($userBuilder) 
    {
        $this->username = $userBuilder['username'];
        …
    }
}

请注意,UserBuilder实现了ArrayAccess,因此无论是传递数组还是构建器实例都无关紧要。这也有效:

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

唯一的缺点是,无论何时需要其他字段,您仍然需要向构建器添加新的访问者,但这是为您实现这种方式所带来的灵活性付出的小代价。

答案 4 :(得分:0)

创建更新和用户类。

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

当然,你不仅可以制作用户类。

或者您可以传递用户对象。

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

答案 5 :(得分: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 = 'a@b.com';
    $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
    }
  }
}