DanLevy.net

Nombrar las cosas bien

Nombrar cosas: Fundamentos de Orientación a Objetos

Hero image for Nombrar las cosas bien

Nombrar cosas: Fundamentos de Orientación a Objetos

Veamos el diseño de objetos/clases con un ejemplo…

La situación

¿Alguna vez has diseñado un modelo de datos (en código, SQL o hojas de cálculo de Excel)? ¿Te resulta familiar lo siguiente?

*** anti-pattern - don't copy-paste ***
* User
- id
- avatarUrl
- name
- email
- password
* Agent
- id
- primaryPhoto
- name
- email
- agentEmail
- agentPhoneMain
- agentEmailPrimary
- agentPhonePrimary
- agentAddressFull
- agentCompanyAddress
- *userEmail* - 'Pointer' to User table ^^^

¿Dónde está el error?

Bueno, técnicamente no hay ningún error, simplemente datos que necesitan reorganizarse.

¿Te suena familiar lo siguiente?

  1. Cualquier cambio en tu aplicación requerirá horas de ardua depuración.
  2. Cualquier cambio en los requisitos resultará en:

refactorización de esquema

¿Por qué es tan malo nombrar un campo agentEmailPrimary?

Para empezar, no estás creando algo completamente nuevo en el universo. La sobreespecificación tiene algunas trampas:

  1. Estar ‘atado’ a un nombre altamente específico significa que agentEmailPrimary probablemente hace que tus vistas y código relacionado sean 0% reutilizables, y presenta bugs recurrentes molestos como:
  1. agentEmailPrimary podría significar varias cosas diferentes. Evita la ambigüedad con nombres más cortos.

Suficientes palabras Dan, ¿cómo debería verse en su lugar?

Una solución

// Consolidated Schema:
User
- id
- role: ['agent', 'lead', 'admin']
- name
- phone
- address
- email
- password
- company
- name
- address

Eliminé la tabla Agent, ya que no contenía campos únicos para los Agentes. Y el objeto User.company (con .name, .address) emergió una vez que se limpió la nomenclatura.

Algunos principios guía:

  1. Elimina tablas innecesarias. ¿Realmente necesitas una tabla statuses? Cuando podrías agregar un campo status::VARCHAR(8) en la tabla User? Está bien, usa los bytes extra por fila.
  2. Intenta fusionar tablas relacionadas. Datos
  3. Elimina recopilaciones de datos redundantes (por ejemplo, elimina la tabla ActivityLogs si fue reemplazada por una solución de Analytics.)
  4. Intenta mantener todos los nombres de campo en una sola palabra/sustantivo/pronombre. Está bien depender del contexto proporcionado por el nombre de la tabla. (por ejemplo, PersonalAccount.email vs BusinessAccount.email — el contexto lo proporciona el nombre de la tabla.)
  5. No existe Agent.agentEmail ni Agent.agentPhonePrimary. Punto. Repítelo conmigo: “es email y phone.”
  6. Al usar nombres altamente específicos, grabas en piedra un nivel específico de reutilización-de-código y durabilidad, bueno, específicamente CERO %.
  7. No te estás haciendo ningún favor con basura como esta User.profileSummaryEmail. 💞

Lectura recomendada incluye:

  1. Maybe Normalizing Isn’t Normal
  2. The Trade-offs Between Database Normalization and Denormalization
  3. http://phlonx.com/resources/nf3/
  4. https://en.wikipedia.org/wiki/Database_normalization