No leí todo el código de activerecord, pero por lo que veo intenta
solucionar muchos problemas distintos y lo resuelve con código de mala
calidad y mal estilo. Por ejemplo, miren este archivo:
https://github.com/rails/rails/blob/v4.1.0.rc2/activerecord/lib/active_record.rb
Si pensamos en que las clases tienen que tener una responsabilidad, no
es evidente qué responsabilidad tienen estas dos:
autoload :Base
autoload :Core
También es raro esto:
autoload :Migration
autoload :Migrator, 'active_record/migration'
autoload :ModelSchema
autoload :Schema
autoload :SchemaDumper
autoload :SchemaMigration
Son seis clases que tienen responsabilidades similares y algunas
incluso son interdependientes. Si hubiera un librería sólo para
modificar el schema de una base de datos, la complejidad sería menor.
De ese estilo hay varios grupos de clases que se pueden distinguir, y
que cada uno de esos grupos podría ser una herramienta genérica.
Por otro lado, el autoload, eager_autoload, eager_load, on_load y
similares son indirecciones innecesarias y costosas.
Esto también me llama la atención:
autoload :DatabaseTasks
autoload :SQLiteDatabaseTasks, 'active_record/tasks/sqlite_database_tasks'
autoload :MySQLDatabaseTasks, 'active_record/tasks/mysql_database_tasks'
autoload :PostgreSQLDatabaseTasks,
'active_record/tasks/postgresql_database_tasks'
Me parece raro que una librería incluya rake tasks, sobre todo cuando
se propone como agnóstica con respecto a la base de datos.
Con todo esto, activerecord tiene 17108 líneas de código sin contar
las dependencias. Las dependencias son activesupport, activemodel y
arel. Así se describe activemodel:
"Active Model provides a known set of interfaces for usage in model classes.
They allow for Action Pack helpers to interact with non-Active
Record models,
for example. Active Model also helps with building custom ORMs for
use outside of
the Rails framework."
Entonces es raro que activerecord dependa de activemodel.
Y la descripción de arel:
Arel Really Exasperates Logicians
Arel is a SQL AST manager for Ruby. It
1. Simplifies the generation of complex SQL queries
2. Adapts to various RDBMSes
It is intended to be a framework framework; that is, you can build
your own ORM
with it, focusing on innovative object and collection modeling as opposed to
database compatibility and query generation.
La idea de arel está bien, pero parece medio ineficiente que tenga
3184 líneas de código. Pero creo que peor que esas 3184 líneas de
código es el hecho de que activerecord tiene 17108 y ni siquiera se
encarga de lo que hace arel. Entonces activerecord no tiene lo que
hace activemodel ni lo que hace arel, y es database agnostic, entonces
tampoco debería tener código específico de cada base de datos. Por eso
me parece que 17108 líneas de código es demasiado, y las
responsabilidades que asume son muy diversas (validaciones,
migraciones, callbacks, locks, caching, etc.).
No sé cuántas líneas de código debería tener, pero si Ohm tiene 605 y
Scrivener, lo que uso para validaciones, tiene 90, me imagino que
ActiveRecord + Arel + ActiveModel no deberían superar las 1700 líneas
de código en total.