Problemas no CodeIgniter que dificilmente poderão ser resolvidos
Olá pessoal,
meu primeiro post aqui foi para pedir conselhos sobre como as empresas estão exigindo frameworks e falei como sempre rejeitei usar alguns frameworks por não concordar com muitas coisas neles.
Conversando, acabei por concordar em fazer o que o mercado está pedindo, ou seja, "não pode com eles, junte-se a eles".
Comecei minha pesquisa e estudo de frameworks. Assistir um vídeo de um profissional que dizia que o CodeIgniter é orientado a objetos, MVC, etc.
Então, resolvi começar por ai, baixei e montei o ambiente, em seguida, fui olhar a estrutura do CI, o MVC está muito bem colocado e não deixa a desejar em nada, mas quando fui ver a questão de orientação a objetos, notei que o CI é apenas 50% orientado a objetos e com um design de classe muito antigo.
Respeito muito a comunidade do CI e acho que é sim uma opção, o grande problema é que o(s) desenvolvedor(es) não podem fazer muitas modificações, isso implicaria em ter que mudar tudo para todos que usam o framework.
Eu tinha desistido do CI no momento que entrei no core e visualizei a classe CI_Utf8, depois, pensei: "Se as empresas querem usar, então problema é delas."
Veja um pouco da class CI_Utf8 do CodeIgniter
class CI_Utf8 {
function __construct()
{
log_message('debug', "Utf8 Class Initialized");
global $CFG;
if (
preg_match('/./u', 'é') === 1 // PCRE must support UTF-8
AND function_exists('iconv') // iconv must be installed
AND ini_get('mbstring.func_overload') != 1 // Multibyte string function overloading cannot be enabled
AND $CFG->item('charset') == 'UTF-8' // Application charset must be UTF-8
)
{
log_message('debug', "UTF-8 Support Enabled");
define('UTF8_ENABLED', TRUE);
if (extension_loaded('mbstring'))
{
define('MB_ENABLED', TRUE);
mb_internal_encoding('UTF-8');
}
else
{
define('MB_ENABLED', FALSE);
}
}
Note que o design ignora completamente a PSR-2
class CI_Utf8 {
Usando um namespace (CI_) no nome da classe, apenas para previnir colisão, mas não serve para um autoload.
O correto deveria ser
namespace CI\System\Core;
Em seguida temos
log_message('debug', "Utf8 Class Initialized");
Chamando uma função do framework dentro de um objeto, isso quebra completamente o conceito de orientação a objetos.
Depois disso vemos ainda outra violação com
global $CFG;
Quando vi essa linha, foi ctrl+w e fechei meu Sublime, nesta hora eu tinha desistido do CI, mas voltei atrás pelos motivos citados acima.
Agora quanto ao restante, não tenho nada a reclamar, da pra fazer um bom site usando o CI.
Vamos pensar juntos, eu acredito que uma classe do tipo i18n (Utf8), pra começar, já deveria está fora da pasta core.
Uma class Utf8 de um framework deveria ser diferente desta do CI, tentando escrever aqui junto com vocês uma classe dessa, agente talvés faria algo diferente.
/*
* PSR-2
*
* Eu adicionaria mais 3 classes CI\System\Core\Runtime|Debugger|SystemMonitoring
*/
namespace CI\System\Core;
use CI\System\Core\Runtime;
use CI\System\Core\Debugger;
use CI\System\Core\SystemMonitoring;
class Utf8
{
private $runtime = null;
private $debugger = null;
public function __construct(Runtime $Runtime)
{
$this->runtime = $Runtime;
$this->debugger = $this->runtime->getDebugger();
$this->debugger->logPrepare(Debugger::LOG_TYPE_CLASS_INITIALIZE, $this);
/*
* Não precisa informar 'Utf8 Class Initialized' Runtime::LOG_TYPE_CLASS_INITIALIZE cuida disso
* e no segundo parametro uma instancia do objeto está sendo passado,
* ou seja, tudo que precisa está aí.
*/
$this->debugger->log(/* [$message] */);
$this->debugger->resetLogType(Debugger::PRESERVE_OBJECT_INSTANCE);
if (/* Conditions */) {
/*
Then [...]
*/
$this->debugger->log('New log message');
}
}
public function __destruct()
{
/*
* Não precisa passar uma instancia do objeto novamente,
ela foi preservada por Debugger::PRESERVE_OBJECT_INSTANCE
*/
$this->debugger->logPrepare(Debugger::LOG_TYPE_CLASS_STOP);
// ($SystemMonitoring) Eu prefiro usar instancias de objetos no estilo camelCase, é pessoal.
$SystemMonitoring = $this->runtime->getSysMonitor($this->debugger);
/*
* SystemMonitoring::PROGRAM_EXECUTION_ANALYZE vai analizar, por exemplo,
o tempo que demorou para a execusão do código.
*/
$SystemMonitoring->analyse(SystemMonitoring::PROGRAM_EXECUTION_ANALYZE);
/*
* Aqui poderiamos pensar em algo como SystemMonitoring::STORE_RESULT_AS_[...]
*/
$SystemMonitoring->storeResults(/* [$store_as = SystemMonitoring::STORE_RESULT_AS_DEFAULT] */);
}
}
Talvés eu pensaria em algo desse tipo, mas, da pra usar o CI normalmente do jeito que está.
A proposito, eu demorei pouco tempo para aprender a usar o CI, como ESerra disse no outro post, a curva de aprendizado é pequena. Mas não indicaria este framework para quem está começando, ou do contrário, aprenderia muita coisa que já está obsoleto no quesito orientação a objetos.
Abraço a todos!
Discussão (5)
Carregando comentários...