Lista de verificación de refactorización y auditoría de arquitectura
Señales de alerta en el acoplamiento de paquetes, globales y abuso de init().
Busca en todas las páginas de la documentación
Señales de alerta en el acoplamiento de paquetes, globales y abuso de init().
Siga esta lista de verificación antes de un lanzamiento importante, después de picos de incorporación, o cuando los tiempos de compilación y las tasas de incidentes aumenten juntos.
Estado mutable global para DB, configuración o clientes: Reemplace con inyección de constructor desde main.
var db *sql.DB usado en varios paquetesNewService(repo Repository) cableado una vez al inicioCiclos de importación entre paquetes de producción: Extraiga contratos compartidos o invierta la dirección de la dependencia.
handler importa service importa handlerinternal/contractsinit() realiza E/S o entra en pánico por una configuración incorrecta: Fallo en main con errores claros en su lugar.
init()cfg, err := Load(); if err != nil { log.Fatal(err) }Reglas de negocio solo en manejadores HTTP: Mueva la validación y los flujos de trabajo a servicios con pruebas unitarias.
ServeHTTP de 200 líneas con SQLRegister(ctx, email) probado sin httptestSecretos o puntos de conexión codificados en paquetes de biblioteca: Cargue desde el entorno/flags solo en la raíz de composición.
const apiURL = "https://prod..."Config.APIURL validado al arrancarutil, common, helpers): Divida por capacidad (internal/timeutil, internal/validate).net/http, gin o gRPC: Mueva los adaptadores a internal/adapter/*.internal/ para congelar la superficie de la API.cmd/ que duplican el cableado de forma divergente: Extraiga ayudantes Provide* compartidos o el conjunto Wire.context.Context en funciones de E/S: Agregue ctx como primer parámetro; canalice desde los manejadores.var ErrNotFound = errors.New(...) y errors.Is._) sin comentario que explique el efecto secundario: Documente el propósito del registro o elimínelo.models, controllers) con importaciones cruzadas: Reorganice por corte de características.replace confirmadas para rutas de portátil local: Use go.work localmente; mantenga go.mod portátil.slog o el registrador del equipo en los bordes.http.Server y MaxBytesReader.go generate, sqlc o buf en CI.De una a dos horas para un módulo mediano con go mod graph y revisión de importaciones de paquetes.
Las inmersiones más profundas necesitan propietarios por característica.
go mod graph, golangci-lint (depguard, forbidigo), verificaciones personalizadas de ciclos de importación go:generate y go vet ./....
No.
Arregle lo Crítico, luego divida los elementos Altos en tickets de características: las reescrituras de "big bang" rara vez se envían.
Sin un recuento de líneas fijo: si tres equipos lo editan semanalmente y las importaciones se ramifican, divídalo independientemente de las LOC.
grep -R "func init()" internal/ cmd/ y clasifique cada uno como solo registro vs E/S.
Prohíba las inicializaciones de E/S en las reglas de lint.
Pequeños ayudantes estables sin significado de negocio y con un equipo propietario.
Renombre a un propósito específico cuando crezca.
Los elementos 1-12 deben estar en verde antes de la extracción de RPC; de lo contrario, distribuirá espagueti.
Captura de pantalla del gráfico de importaciones, IDs de incidentes, tendencia del tiempo de compilación, tasa de inestabilidad de pruebas.
Sí, con un patrocinador senior: un excelente ejercicio de incorporación para leer las importaciones de paquetes.
Después de hacks rápidos: agregue una regla de lint depguard que bloquee var .* \*sql.DB fuera de cmd/.
Versiones de Stack: Esta página fue escrita para Go 1.26.x (predeterminado Green Tea GC, modernizadores go fix - verifique el parche en la compilación), chi (última versión - verifique en la compilación), gin (última versión - verifique en la compilación), echo (última versión - verifique en la compilación), google.golang.org/grpc (última versión - verifique en la compilación), sigs.k8s.io/controller-runtime (última versión - verifique en la compilación), kubebuilder (última versión - verifique en la compilación), tinygo (última versión - verifique los objetivos de la placa en la compilación), wazero (última versión - verifique en la compilación) y golangci-lint (última versión - verifique el conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 18 jul 2026