Предложения по улучшению набора связанных функций PHP?


Я работаю на приложения веб-чата. В приложении, пользователи могут выполнять команды (например, /Ник, /МСГ и т. д.), Начиная с / и введя команду затем Параметры. Например, если кто-то хотел сменить имя на "foobar", они бы ввести это в:

/whois foobar

Однако, я не могу придумать хороший способ организовать код для этого. Это то, что я так далеко:

В User.php

function User_command(array $args)
{
   $command = $args['command']; 
   list($command_name, $command_parameters) = explode(' ', $command, 2); 
  $command_name = str_replace('/', '', strtolower($command_name)); 

$result = Command::process($command_name, $command_parameters); 

if (!$result)
    return responseFailure(); 

addQueueEntry($result['json'], $result['user_id'], $result['room_id'], $result['added_by']); 
return responseSuccess(); 
}

* В Command.php *

class Command
{
public function process($command, $parameters)
{
    $method = 'MinteCommand_' . $command; 

    if (function_exists($method))
        return $method($parameters); 

    return null; 
}
}

/* Note: When implementing commands, you must specify all fields for $response */
/*       If you don't, then they might not work correctly or as intended. */

function MinteCommand_notice($message)
{
$response = array(); 
$response['json'] = array('addChatNotice' => $message);
$response['user_id'] = null; 
$response['room_id'] = MINTE; 
$response['added_by'] = SYSTEM; 

return $response; 
}

function MinteCommand_announce($message)
{
$response = array(); 
$response['json'] = array('addChatAnnouncement' => $message); 
$response['user_id'] = null; 
$response['room_id'] = MINTE; 
$response['added_by'] = SYSTEM; 

return $response;  
}

function MinteCommand_announcement($message)
{
// Command "announcement" is an alternative spelling for command "announce"
return MinteCommand_announce($message); 
}

function MinteCommand_clear($message)
{
$response = array(); 
$response['json'] = array('clearChat' => $message); 
$response['added_by'] = SYSTEM; 
$response['user_id'] = MINTE; 
$response['room_id'] = null; 

return $response; 
}

function MinteCommand_whois($username)
{
$response = array(); 
$response['added_by'] = 'SYSTEM'; 
$query = DB::query('SELECT ip_address, user_agent, last_activity, room_id FROM mt_users 
    WHERE username = ? LIMIT 1', $username); 

$exists = $query['num_rows'] > 0; 
$ip_address = $user_agent = $last_activity = $room_id = ""; 

if ($exists)
{
    $row = $query['rows'][0]; 
    $ip_address = $row['ip_address']; 
    $user_agent = $row['user_agent']; 
    $last_activity = $row['last_activity']; 
    $room_id = $row['room_id']; 
}

$response['json'] = array('addChatNotice' => !$exists ? 'User ' . $username . ' does not exist' : 
    '[' . $username . '] ' . $ip_address . '/' . $user_agent . ', last_activity=' . $last_activity . ', room_id=' . $room_id); 

$response['added_by'] = SYSTEM; 
$response['user_id'] = MINTE; 
$response['room_id'] = null; 

return $response; 
}

function MinteCommand_msg($args)
{
    list($username, $message) = explode(' ', $args, 2); 
}

Как я могу идти об улучшении кода и делает его более организованным и элегантно? В общей сложности будет около 30 команд.



176
3
php
задан 11 июля 2011 в 12:07 Источник Поделиться
Комментарии
1 ответ

Просто идея, но, возможно, это поможет вам с точки зрения управляемости:

 public function process($command, $parameters) {
$method = 'MinteCommand_' . $command;
$methodFile = dirname(__FILE__) . 'commands/' . $method . ".php";
if (file_exists($methodFile)) {
require_once($methodFile);
if (function_exists($method)) {
return $method($parameters);
} else {
throw "invalid function";
}
} else {
throw "invalid function file";
}
}

Единственное преимущество этого заключается в том, что вы просто создаете новый файл с новой командой (функцией) внутри этого файла, и он будет автоматически искать его, если команда выдается. Один нюанс будет ограничение на количество команд может иметь ограничение на количество файлов в одной директории на файловую систему...

Обратите внимание, код не может быть идеальным с синтаксической точки зрения. Это просто чтобы дать вам общую идею / концепцию.

2
ответ дан 11 июля 2011 в 12:07 Источник Поделиться